| OLD | NEW |
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 188 | 188 |
| 189 // Access to current thread id. | 189 // Access to current thread id. |
| 190 static int thread_id() { return thread_local_.thread_id_; } | 190 static int thread_id() { return thread_local_.thread_id_; } |
| 191 static void set_thread_id(int id) { thread_local_.thread_id_ = id; } | 191 static void set_thread_id(int id) { thread_local_.thread_id_ = id; } |
| 192 | 192 |
| 193 // Interface to pending exception. | 193 // Interface to pending exception. |
| 194 static MaybeObject* pending_exception() { | 194 static MaybeObject* pending_exception() { |
| 195 ASSERT(has_pending_exception()); | 195 ASSERT(has_pending_exception()); |
| 196 return thread_local_.pending_exception_; | 196 return thread_local_.pending_exception_; |
| 197 } | 197 } |
| 198 static bool external_caught_exception() { | |
| 199 return thread_local_.external_caught_exception_; | |
| 200 } | |
| 201 static void set_pending_exception(MaybeObject* exception) { | 198 static void set_pending_exception(MaybeObject* exception) { |
| 202 thread_local_.pending_exception_ = exception; | 199 thread_local_.pending_exception_ = exception; |
| 203 } | 200 } |
| 204 static void clear_pending_exception() { | 201 static void clear_pending_exception() { |
| 205 thread_local_.pending_exception_ = Heap::the_hole_value(); | 202 thread_local_.pending_exception_ = Heap::the_hole_value(); |
| 206 } | 203 } |
| 207 | |
| 208 static MaybeObject** pending_exception_address() { | 204 static MaybeObject** pending_exception_address() { |
| 209 return &thread_local_.pending_exception_; | 205 return &thread_local_.pending_exception_; |
| 210 } | 206 } |
| 211 static bool has_pending_exception() { | 207 static bool has_pending_exception() { |
| 212 return !thread_local_.pending_exception_->IsTheHole(); | 208 return !thread_local_.pending_exception_->IsTheHole(); |
| 213 } | 209 } |
| 210 |
| 211 static bool external_caught_exception() { |
| 212 return thread_local_.external_caught_exception_; |
| 213 } |
| 214 static void set_external_caught_exception(bool value) { |
| 215 thread_local_.external_caught_exception_ = value; |
| 216 } |
| 217 |
| 214 static void clear_pending_message() { | 218 static void clear_pending_message() { |
| 215 thread_local_.has_pending_message_ = false; | 219 thread_local_.has_pending_message_ = false; |
| 216 thread_local_.pending_message_ = NULL; | 220 thread_local_.pending_message_ = NULL; |
| 217 thread_local_.pending_message_obj_ = Heap::the_hole_value(); | 221 thread_local_.pending_message_obj_ = Heap::the_hole_value(); |
| 218 thread_local_.pending_message_script_ = NULL; | 222 thread_local_.pending_message_script_ = NULL; |
| 219 } | 223 } |
| 220 static v8::TryCatch* try_catch_handler() { | 224 static v8::TryCatch* try_catch_handler() { |
| 221 return thread_local_.TryCatchHandler(); | 225 return thread_local_.TryCatchHandler(); |
| 222 } | 226 } |
| 223 static Address try_catch_handler_address() { | 227 static Address try_catch_handler_address() { |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 454 | 458 |
| 455 static inline ThreadLocalTop* GetCurrentThread() { return &thread_local_; } | 459 static inline ThreadLocalTop* GetCurrentThread() { return &thread_local_; } |
| 456 static int ArchiveSpacePerThread() { return sizeof(ThreadLocalTop); } | 460 static int ArchiveSpacePerThread() { return sizeof(ThreadLocalTop); } |
| 457 static char* ArchiveThread(char* to); | 461 static char* ArchiveThread(char* to); |
| 458 static char* RestoreThread(char* from); | 462 static char* RestoreThread(char* from); |
| 459 static void FreeThreadResources() { thread_local_.Free(); } | 463 static void FreeThreadResources() { thread_local_.Free(); } |
| 460 | 464 |
| 461 static const char* kStackOverflowMessage; | 465 static const char* kStackOverflowMessage; |
| 462 | 466 |
| 463 private: | 467 private: |
| 468 |
| 469 static v8::TryCatch* catcher() { |
| 470 return thread_local_.catcher_; |
| 471 } |
| 472 |
| 473 static void set_catcher(v8::TryCatch* catcher) { |
| 474 thread_local_.catcher_ = catcher; |
| 475 } |
| 476 |
| 477 // Attempts to propagate the pending exception to the proper v8::TryCatch. |
| 478 static void PropagatePendingExceptionToExternalTryCatch(); |
| 479 |
| 464 #ifdef ENABLE_VMSTATE_TRACKING | 480 #ifdef ENABLE_VMSTATE_TRACKING |
| 465 // Set of states used when communicating with the runtime profiler. | 481 // Set of states used when communicating with the runtime profiler. |
| 466 // | 482 // |
| 467 // The set of possible transitions is divided between the VM and the | 483 // The set of possible transitions is divided between the VM and the |
| 468 // profiler threads. | 484 // profiler threads. |
| 469 // | 485 // |
| 470 // The VM thread can perform these transitions: | 486 // The VM thread can perform these transitions: |
| 471 // o IN_JS -> NOT_IN_JS | 487 // o IN_JS -> NOT_IN_JS |
| 472 // o NOT_IN_JS -> IN_JS | 488 // o NOT_IN_JS -> IN_JS |
| 473 // o NOT_IN_JS_WAITING_FOR_JS -> IN_JS notifying the profiler thread | 489 // o NOT_IN_JS_WAITING_FOR_JS -> IN_JS notifying the profiler thread |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 518 // Debug. | 534 // Debug. |
| 519 // Mutex for serializing access to break control structures. | 535 // Mutex for serializing access to break control structures. |
| 520 static Mutex* break_access_; | 536 static Mutex* break_access_; |
| 521 | 537 |
| 522 friend class SaveContext; | 538 friend class SaveContext; |
| 523 friend class AssertNoContextChange; | 539 friend class AssertNoContextChange; |
| 524 friend class ExecutionAccess; | 540 friend class ExecutionAccess; |
| 525 friend class ThreadLocalTop; | 541 friend class ThreadLocalTop; |
| 526 | 542 |
| 527 static void FillCache(); | 543 static void FillCache(); |
| 544 |
| 545 public: |
| 546 class ExceptionScope { |
| 547 public: |
| 548 ExceptionScope() : |
| 549 // Scope currently can only be used for regular exceptions, not |
| 550 // failures like OOM or termination exception. |
| 551 pending_exception_(Top::pending_exception()->ToObjectUnchecked()), |
| 552 catcher_(Top::catcher()) |
| 553 { } |
| 554 |
| 555 ~ExceptionScope() { |
| 556 Top::set_catcher(catcher_); |
| 557 Top::set_pending_exception(*pending_exception_); |
| 558 } |
| 559 |
| 560 private: |
| 561 Handle<Object> pending_exception_; |
| 562 v8::TryCatch* catcher_; |
| 563 }; |
| 528 }; | 564 }; |
| 529 | 565 |
| 530 | 566 |
| 531 // If the GCC version is 4.1.x or 4.2.x an additional field is added to the | 567 // If the GCC version is 4.1.x or 4.2.x an additional field is added to the |
| 532 // class as a work around for a bug in the generated code found with these | 568 // class as a work around for a bug in the generated code found with these |
| 533 // versions of GCC. See V8 issue 122 for details. | 569 // versions of GCC. See V8 issue 122 for details. |
| 534 class SaveContext BASE_EMBEDDED { | 570 class SaveContext BASE_EMBEDDED { |
| 535 public: | 571 public: |
| 536 SaveContext() | 572 SaveContext() |
| 537 : context_(Top::context()), | 573 : context_(Top::context()), |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 599 static void Unlock() { Top::break_access_->Unlock(); } | 635 static void Unlock() { Top::break_access_->Unlock(); } |
| 600 | 636 |
| 601 static bool TryLock() { | 637 static bool TryLock() { |
| 602 return Top::break_access_->TryLock(); | 638 return Top::break_access_->TryLock(); |
| 603 } | 639 } |
| 604 }; | 640 }; |
| 605 | 641 |
| 606 } } // namespace v8::internal | 642 } } // namespace v8::internal |
| 607 | 643 |
| 608 #endif // V8_TOP_H_ | 644 #endif // V8_TOP_H_ |
| OLD | NEW |