| 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 } |
| 198 static void set_pending_exception(MaybeObject* exception) { | 201 static void set_pending_exception(MaybeObject* exception) { |
| 199 thread_local_.pending_exception_ = exception; | 202 thread_local_.pending_exception_ = exception; |
| 200 } | 203 } |
| 201 static void clear_pending_exception() { | 204 static void clear_pending_exception() { |
| 202 thread_local_.pending_exception_ = Heap::the_hole_value(); | 205 thread_local_.pending_exception_ = Heap::the_hole_value(); |
| 203 } | 206 } |
| 207 |
| 204 static MaybeObject** pending_exception_address() { | 208 static MaybeObject** pending_exception_address() { |
| 205 return &thread_local_.pending_exception_; | 209 return &thread_local_.pending_exception_; |
| 206 } | 210 } |
| 207 static bool has_pending_exception() { | 211 static bool has_pending_exception() { |
| 208 return !thread_local_.pending_exception_->IsTheHole(); | 212 return !thread_local_.pending_exception_->IsTheHole(); |
| 209 } | 213 } |
| 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 | |
| 218 static void clear_pending_message() { | 214 static void clear_pending_message() { |
| 219 thread_local_.has_pending_message_ = false; | 215 thread_local_.has_pending_message_ = false; |
| 220 thread_local_.pending_message_ = NULL; | 216 thread_local_.pending_message_ = NULL; |
| 221 thread_local_.pending_message_obj_ = Heap::the_hole_value(); | 217 thread_local_.pending_message_obj_ = Heap::the_hole_value(); |
| 222 thread_local_.pending_message_script_ = NULL; | 218 thread_local_.pending_message_script_ = NULL; |
| 223 } | 219 } |
| 224 static v8::TryCatch* try_catch_handler() { | 220 static v8::TryCatch* try_catch_handler() { |
| 225 return thread_local_.TryCatchHandler(); | 221 return thread_local_.TryCatchHandler(); |
| 226 } | 222 } |
| 227 static Address try_catch_handler_address() { | 223 static Address try_catch_handler_address() { |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 458 | 454 |
| 459 static inline ThreadLocalTop* GetCurrentThread() { return &thread_local_; } | 455 static inline ThreadLocalTop* GetCurrentThread() { return &thread_local_; } |
| 460 static int ArchiveSpacePerThread() { return sizeof(ThreadLocalTop); } | 456 static int ArchiveSpacePerThread() { return sizeof(ThreadLocalTop); } |
| 461 static char* ArchiveThread(char* to); | 457 static char* ArchiveThread(char* to); |
| 462 static char* RestoreThread(char* from); | 458 static char* RestoreThread(char* from); |
| 463 static void FreeThreadResources() { thread_local_.Free(); } | 459 static void FreeThreadResources() { thread_local_.Free(); } |
| 464 | 460 |
| 465 static const char* kStackOverflowMessage; | 461 static const char* kStackOverflowMessage; |
| 466 | 462 |
| 467 private: | 463 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 static void setup_external_caught() { | |
| 478 thread_local_.external_caught_exception_ = | |
| 479 has_pending_exception() && | |
| 480 (thread_local_.catcher_ != NULL) && | |
| 481 (try_catch_handler() == thread_local_.catcher_); | |
| 482 } | |
| 483 | |
| 484 // Attempts to propagate the pending exception to the proper v8::TryCatch. | |
| 485 static void PropagatePendingExceptionToExternalTryCatch(); | |
| 486 | |
| 487 #ifdef ENABLE_VMSTATE_TRACKING | 464 #ifdef ENABLE_VMSTATE_TRACKING |
| 488 // Set of states used when communicating with the runtime profiler. | 465 // Set of states used when communicating with the runtime profiler. |
| 489 // | 466 // |
| 490 // The set of possible transitions is divided between the VM and the | 467 // The set of possible transitions is divided between the VM and the |
| 491 // profiler threads. | 468 // profiler threads. |
| 492 // | 469 // |
| 493 // The VM thread can perform these transitions: | 470 // The VM thread can perform these transitions: |
| 494 // o IN_JS -> NOT_IN_JS | 471 // o IN_JS -> NOT_IN_JS |
| 495 // o NOT_IN_JS -> IN_JS | 472 // o NOT_IN_JS -> IN_JS |
| 496 // o NOT_IN_JS_WAITING_FOR_JS -> IN_JS notifying the profiler thread | 473 // 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... |
| 541 // Debug. | 518 // Debug. |
| 542 // Mutex for serializing access to break control structures. | 519 // Mutex for serializing access to break control structures. |
| 543 static Mutex* break_access_; | 520 static Mutex* break_access_; |
| 544 | 521 |
| 545 friend class SaveContext; | 522 friend class SaveContext; |
| 546 friend class AssertNoContextChange; | 523 friend class AssertNoContextChange; |
| 547 friend class ExecutionAccess; | 524 friend class ExecutionAccess; |
| 548 friend class ThreadLocalTop; | 525 friend class ThreadLocalTop; |
| 549 | 526 |
| 550 static void FillCache(); | 527 static void FillCache(); |
| 551 | |
| 552 public: | |
| 553 class ExceptionScope { | |
| 554 public: | |
| 555 ExceptionScope() : | |
| 556 // Scope currently can only be used for regular exceptions, not | |
| 557 // failures like OOM or termination exception. | |
| 558 pending_exception_(Top::pending_exception()->ToObjectUnchecked()), | |
| 559 external_caught_exception_(Top::external_caught_exception()), | |
| 560 catcher_(Top::catcher()) | |
| 561 { } | |
| 562 | |
| 563 ~ExceptionScope() { | |
| 564 Top::set_catcher(catcher_); | |
| 565 Top::set_external_caught_exception(external_caught_exception_); | |
| 566 Top::set_pending_exception(*pending_exception_); | |
| 567 } | |
| 568 | |
| 569 private: | |
| 570 Handle<Object> pending_exception_; | |
| 571 bool external_caught_exception_; | |
| 572 v8::TryCatch* catcher_; | |
| 573 }; | |
| 574 }; | 528 }; |
| 575 | 529 |
| 576 | 530 |
| 577 // If the GCC version is 4.1.x or 4.2.x an additional field is added to the | 531 // If the GCC version is 4.1.x or 4.2.x an additional field is added to the |
| 578 // class as a work around for a bug in the generated code found with these | 532 // class as a work around for a bug in the generated code found with these |
| 579 // versions of GCC. See V8 issue 122 for details. | 533 // versions of GCC. See V8 issue 122 for details. |
| 580 class SaveContext BASE_EMBEDDED { | 534 class SaveContext BASE_EMBEDDED { |
| 581 public: | 535 public: |
| 582 SaveContext() | 536 SaveContext() |
| 583 : context_(Top::context()), | 537 : context_(Top::context()), |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 645 static void Unlock() { Top::break_access_->Unlock(); } | 599 static void Unlock() { Top::break_access_->Unlock(); } |
| 646 | 600 |
| 647 static bool TryLock() { | 601 static bool TryLock() { |
| 648 return Top::break_access_->TryLock(); | 602 return Top::break_access_->TryLock(); |
| 649 } | 603 } |
| 650 }; | 604 }; |
| 651 | 605 |
| 652 } } // namespace v8::internal | 606 } } // namespace v8::internal |
| 653 | 607 |
| 654 #endif // V8_TOP_H_ | 608 #endif // V8_TOP_H_ |
| OLD | NEW |