Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(221)

Side by Side Diff: src/isolate.h

Issue 960273002: Move stack unwinding logic into the runtime. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix Win64 (finally). Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/ia32/macro-assembler-ia32.cc ('k') | src/isolate.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_ISOLATE_H_ 5 #ifndef V8_ISOLATE_H_
6 #define V8_ISOLATE_H_ 6 #define V8_ISOLATE_H_
7 7
8 #include <queue> 8 #include <queue>
9 #include "include/v8-debug.h" 9 #include "include/v8-debug.h"
10 #include "src/allocation.h" 10 #include "src/allocation.h"
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 #define RETURN_ON_EXCEPTION(isolate, call, T) \ 161 #define RETURN_ON_EXCEPTION(isolate, call, T) \
162 RETURN_ON_EXCEPTION_VALUE(isolate, call, MaybeHandle<T>()) 162 RETURN_ON_EXCEPTION_VALUE(isolate, call, MaybeHandle<T>())
163 163
164 164
165 #define FOR_EACH_ISOLATE_ADDRESS_NAME(C) \ 165 #define FOR_EACH_ISOLATE_ADDRESS_NAME(C) \
166 C(Handler, handler) \ 166 C(Handler, handler) \
167 C(CEntryFP, c_entry_fp) \ 167 C(CEntryFP, c_entry_fp) \
168 C(CFunction, c_function) \ 168 C(CFunction, c_function) \
169 C(Context, context) \ 169 C(Context, context) \
170 C(PendingException, pending_exception) \ 170 C(PendingException, pending_exception) \
171 C(PendingHandlerContext, pending_handler_context) \
172 C(PendingHandlerCode, pending_handler_code) \
173 C(PendingHandlerOffset, pending_handler_offset) \
174 C(PendingHandlerFP, pending_handler_fp) \
175 C(PendingHandlerSP, pending_handler_sp) \
171 C(ExternalCaughtException, external_caught_exception) \ 176 C(ExternalCaughtException, external_caught_exception) \
172 C(JSEntrySP, js_entry_sp) 177 C(JSEntrySP, js_entry_sp)
173 178
174 179
175 // Platform-independent, reliable thread identifier. 180 // Platform-independent, reliable thread identifier.
176 class ThreadId { 181 class ThreadId {
177 public: 182 public:
178 // Creates an invalid ThreadId. 183 // Creates an invalid ThreadId.
179 ThreadId() { base::NoBarrier_Store(&id_, kInvalidId); } 184 ThreadId() { base::NoBarrier_Store(&id_, kInvalidId); }
180 185
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 } 266 }
262 267
263 void Free(); 268 void Free();
264 269
265 Isolate* isolate_; 270 Isolate* isolate_;
266 // The context where the current execution method is created and for variable 271 // The context where the current execution method is created and for variable
267 // lookups. 272 // lookups.
268 Context* context_; 273 Context* context_;
269 ThreadId thread_id_; 274 ThreadId thread_id_;
270 Object* pending_exception_; 275 Object* pending_exception_;
276
277 // Communication channel between Isolate::FindHandler and the CEntryStub.
278 Context* pending_handler_context_;
279 Code* pending_handler_code_;
280 intptr_t pending_handler_offset_;
281 Address pending_handler_fp_;
282 Address pending_handler_sp_;
283
284 // Communication channel between Isolate::Throw and message consumers.
271 bool has_pending_message_; 285 bool has_pending_message_;
272 bool rethrowing_message_; 286 bool rethrowing_message_;
273 Object* pending_message_obj_; 287 Object* pending_message_obj_;
274 Object* pending_message_script_; 288 Object* pending_message_script_;
275 int pending_message_start_pos_; 289 int pending_message_start_pos_;
276 int pending_message_end_pos_; 290 int pending_message_end_pos_;
291
277 // Use a separate value for scheduled exceptions to preserve the 292 // Use a separate value for scheduled exceptions to preserve the
278 // invariants that hold about pending_exception. We may want to 293 // invariants that hold about pending_exception. We may want to
279 // unify them later. 294 // unify them later.
280 Object* scheduled_exception_; 295 Object* scheduled_exception_;
281 bool external_caught_exception_; 296 bool external_caught_exception_;
282 SaveContext* save_context_; 297 SaveContext* save_context_;
283 v8::TryCatch* catcher_; 298 v8::TryCatch* catcher_;
284 299
285 // Stack. 300 // Stack.
286 Address c_entry_fp_; // the frame pointer of the top c entry frame 301 Address c_entry_fp_; // the frame pointer of the top c entry frame
287 Address handler_; // try-blocks are chained through the stack 302 Address handler_; // try-blocks are chained through the stack
288 Address c_function_; // C function that was called at c entry. 303 Address c_function_; // C function that was called at c entry.
289 304
290 // Throwing an exception may cause a Promise rejection. For this purpose 305 // Throwing an exception may cause a Promise rejection. For this purpose
291 // we keep track of a stack of nested promises and the corresponding 306 // we keep track of a stack of nested promises and the corresponding
292 // try-catch handlers. 307 // try-catch handlers.
293 PromiseOnStack* promise_on_stack_; 308 PromiseOnStack* promise_on_stack_;
294 309
295 #ifdef USE_SIMULATOR 310 #ifdef USE_SIMULATOR
296 Simulator* simulator_; 311 Simulator* simulator_;
297 #endif 312 #endif
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 V(int, max_available_threads, 0) \ 396 V(int, max_available_threads, 0) \
382 V(uint32_t, per_isolate_assert_data, 0xFFFFFFFFu) \ 397 V(uint32_t, per_isolate_assert_data, 0xFFFFFFFFu) \
383 V(PromiseRejectCallback, promise_reject_callback, NULL) \ 398 V(PromiseRejectCallback, promise_reject_callback, NULL) \
384 V(const v8::StartupData*, snapshot_blob, NULL) \ 399 V(const v8::StartupData*, snapshot_blob, NULL) \
385 ISOLATE_INIT_SIMULATOR_LIST(V) 400 ISOLATE_INIT_SIMULATOR_LIST(V)
386 401
387 #define THREAD_LOCAL_TOP_ACCESSOR(type, name) \ 402 #define THREAD_LOCAL_TOP_ACCESSOR(type, name) \
388 inline void set_##name(type v) { thread_local_top_.name##_ = v; } \ 403 inline void set_##name(type v) { thread_local_top_.name##_ = v; } \
389 inline type name() const { return thread_local_top_.name##_; } 404 inline type name() const { return thread_local_top_.name##_; }
390 405
406 #define THREAD_LOCAL_TOP_ADDRESS(type, name) \
407 type* name##_address() { return &thread_local_top_.name##_; }
408
391 409
392 class Isolate { 410 class Isolate {
393 // These forward declarations are required to make the friend declarations in 411 // These forward declarations are required to make the friend declarations in
394 // PerIsolateThreadData work on some older versions of gcc. 412 // PerIsolateThreadData work on some older versions of gcc.
395 class ThreadDataTable; 413 class ThreadDataTable;
396 class EntryStackItem; 414 class EntryStackItem;
397 public: 415 public:
398 ~Isolate(); 416 ~Isolate();
399 417
400 // A thread has a PerIsolateThreadData instance for each isolate that it has 418 // A thread has a PerIsolateThreadData instance for each isolate that it has
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
567 void set_pending_exception(Object* exception_obj) { 585 void set_pending_exception(Object* exception_obj) {
568 DCHECK(!exception_obj->IsException()); 586 DCHECK(!exception_obj->IsException());
569 thread_local_top_.pending_exception_ = exception_obj; 587 thread_local_top_.pending_exception_ = exception_obj;
570 } 588 }
571 589
572 void clear_pending_exception() { 590 void clear_pending_exception() {
573 DCHECK(!thread_local_top_.pending_exception_->IsException()); 591 DCHECK(!thread_local_top_.pending_exception_->IsException());
574 thread_local_top_.pending_exception_ = heap_.the_hole_value(); 592 thread_local_top_.pending_exception_ = heap_.the_hole_value();
575 } 593 }
576 594
577 Object** pending_exception_address() { 595 THREAD_LOCAL_TOP_ADDRESS(Object*, pending_exception)
578 return &thread_local_top_.pending_exception_;
579 }
580 596
581 bool has_pending_exception() { 597 bool has_pending_exception() {
582 DCHECK(!thread_local_top_.pending_exception_->IsException()); 598 DCHECK(!thread_local_top_.pending_exception_->IsException());
583 return !thread_local_top_.pending_exception_->IsTheHole(); 599 return !thread_local_top_.pending_exception_->IsTheHole();
584 } 600 }
585 601
602 THREAD_LOCAL_TOP_ADDRESS(Context*, pending_handler_context)
603 THREAD_LOCAL_TOP_ADDRESS(Code*, pending_handler_code)
604 THREAD_LOCAL_TOP_ADDRESS(intptr_t, pending_handler_offset)
605 THREAD_LOCAL_TOP_ADDRESS(Address, pending_handler_fp)
606 THREAD_LOCAL_TOP_ADDRESS(Address, pending_handler_sp)
607
586 THREAD_LOCAL_TOP_ACCESSOR(bool, external_caught_exception) 608 THREAD_LOCAL_TOP_ACCESSOR(bool, external_caught_exception)
587 609
588 void clear_pending_message() { 610 void clear_pending_message() {
589 thread_local_top_.has_pending_message_ = false; 611 thread_local_top_.has_pending_message_ = false;
590 thread_local_top_.pending_message_obj_ = heap_.the_hole_value(); 612 thread_local_top_.pending_message_obj_ = heap_.the_hole_value();
591 thread_local_top_.pending_message_script_ = heap_.the_hole_value(); 613 thread_local_top_.pending_message_script_ = heap_.the_hole_value();
592 } 614 }
593 v8::TryCatch* try_catch_handler() { 615 v8::TryCatch* try_catch_handler() {
594 return thread_local_top_.try_catch_handler(); 616 return thread_local_top_.try_catch_handler();
595 } 617 }
596 Address try_catch_handler_address() { 618 Address try_catch_handler_address() {
597 return thread_local_top_.try_catch_handler_address(); 619 return thread_local_top_.try_catch_handler_address();
598 } 620 }
599 bool* external_caught_exception_address() { 621 bool* external_caught_exception_address() {
600 return &thread_local_top_.external_caught_exception_; 622 return &thread_local_top_.external_caught_exception_;
601 } 623 }
602 624
603 THREAD_LOCAL_TOP_ACCESSOR(v8::TryCatch*, catcher) 625 THREAD_LOCAL_TOP_ACCESSOR(v8::TryCatch*, catcher)
604 626
605 Object** scheduled_exception_address() { 627 THREAD_LOCAL_TOP_ADDRESS(Object*, scheduled_exception)
606 return &thread_local_top_.scheduled_exception_;
607 }
608 628
609 Address pending_message_obj_address() { 629 Address pending_message_obj_address() {
610 return reinterpret_cast<Address>(&thread_local_top_.pending_message_obj_); 630 return reinterpret_cast<Address>(&thread_local_top_.pending_message_obj_);
611 } 631 }
612 632
613 Address has_pending_message_address() { 633 Address has_pending_message_address() {
614 return reinterpret_cast<Address>(&thread_local_top_.has_pending_message_); 634 return reinterpret_cast<Address>(&thread_local_top_.has_pending_message_);
615 } 635 }
616 636
617 Address pending_message_script_address() { 637 Address pending_message_script_address() {
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
760 MUST_USE_RESULT MaybeHandle<T> Throw(Handle<Object> exception, 780 MUST_USE_RESULT MaybeHandle<T> Throw(Handle<Object> exception,
761 MessageLocation* location = NULL) { 781 MessageLocation* location = NULL) {
762 Throw(*exception, location); 782 Throw(*exception, location);
763 return MaybeHandle<T>(); 783 return MaybeHandle<T>();
764 } 784 }
765 785
766 // Re-throw an exception. This involves no error reporting since 786 // Re-throw an exception. This involves no error reporting since
767 // error reporting was handled when the exception was thrown 787 // error reporting was handled when the exception was thrown
768 // originally. 788 // originally.
769 Object* ReThrow(Object* exception); 789 Object* ReThrow(Object* exception);
790
791 // Find the correct handler for the current pending exception. This also
792 // clears and returns the current pending exception.
793 Object* FindHandler();
794
770 void ScheduleThrow(Object* exception); 795 void ScheduleThrow(Object* exception);
771 // Re-set pending message, script and positions reported to the TryCatch 796 // Re-set pending message, script and positions reported to the TryCatch
772 // back to the TLS for re-use when rethrowing. 797 // back to the TLS for re-use when rethrowing.
773 void RestorePendingMessageFromTryCatch(v8::TryCatch* handler); 798 void RestorePendingMessageFromTryCatch(v8::TryCatch* handler);
774 // Un-schedule an exception that was caught by a TryCatch handler. 799 // Un-schedule an exception that was caught by a TryCatch handler.
775 void CancelScheduledExceptionFromTryCatch(v8::TryCatch* handler); 800 void CancelScheduledExceptionFromTryCatch(v8::TryCatch* handler);
776 void ReportPendingMessages(); 801 void ReportPendingMessages();
777 // Return pending location if any or unfilled structure. 802 // Return pending location if any or unfilled structure.
778 MessageLocation GetMessageLocation(); 803 MessageLocation GetMessageLocation();
779 Object* ThrowIllegalOperation(); 804 Object* ThrowIllegalOperation();
(...skipping 789 matching lines...) Expand 10 before | Expand all | Expand 10 after
1569 } 1594 }
1570 1595
1571 EmbeddedVector<char, 128> filename_; 1596 EmbeddedVector<char, 128> filename_;
1572 FILE* file_; 1597 FILE* file_;
1573 int scope_depth_; 1598 int scope_depth_;
1574 }; 1599 };
1575 1600
1576 } } // namespace v8::internal 1601 } } // namespace v8::internal
1577 1602
1578 #endif // V8_ISOLATE_H_ 1603 #endif // V8_ISOLATE_H_
OLDNEW
« no previous file with comments | « src/ia32/macro-assembler-ia32.cc ('k') | src/isolate.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698