 Chromium Code Reviews
 Chromium Code Reviews Issue 1122083002:
  Remove materialized objects on stack unwind.  (Closed) 
  Base URL: https://chromium.googlesource.com/v8/v8.git@master
    
  
    Issue 1122083002:
  Remove materialized objects on stack unwind.  (Closed) 
  Base URL: https://chromium.googlesource.com/v8/v8.git@master| OLD | NEW | 
|---|---|
| 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 #include <stdlib.h> | 5 #include <stdlib.h> | 
| 6 | 6 | 
| 7 #include <fstream> // NOLINT(readability/streams) | 7 #include <fstream> // NOLINT(readability/streams) | 
| 8 #include <sstream> | 8 #include <sstream> | 
| 9 | 9 | 
| 10 #include "src/v8.h" | 10 #include "src/v8.h" | 
| (...skipping 1025 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1036 | 1036 | 
| 1037 // Special handling of termination exceptions, uncatchable by JavaScript code, | 1037 // Special handling of termination exceptions, uncatchable by JavaScript code, | 
| 1038 // we unwind the handlers until the top ENTRY handler is found. | 1038 // we unwind the handlers until the top ENTRY handler is found. | 
| 1039 bool catchable_by_js = is_catchable_by_javascript(exception); | 1039 bool catchable_by_js = is_catchable_by_javascript(exception); | 
| 1040 | 1040 | 
| 1041 // Compute handler and stack unwinding information by performing a full walk | 1041 // Compute handler and stack unwinding information by performing a full walk | 
| 1042 // over the stack and dispatching according to the frame type. | 1042 // over the stack and dispatching according to the frame type. | 
| 1043 for (StackFrameIterator iter(this); !iter.done(); iter.Advance()) { | 1043 for (StackFrameIterator iter(this); !iter.done(); iter.Advance()) { | 
| 1044 StackFrame* frame = iter.frame(); | 1044 StackFrame* frame = iter.frame(); | 
| 1045 | 1045 | 
| 1046 RemoveMaterializedObjectsOnUnwind(frame); | |
| 
Michael Starzinger
2015/05/04 15:17:03
As discussed offline: I think the materialized obj
 | |
| 1047 | |
| 1046 // For JSEntryStub frames we always have a handler. | 1048 // For JSEntryStub frames we always have a handler. | 
| 1047 if (frame->is_entry() || frame->is_entry_construct()) { | 1049 if (frame->is_entry() || frame->is_entry_construct()) { | 
| 1048 StackHandler* handler = frame->top_handler(); | 1050 StackHandler* handler = frame->top_handler(); | 
| 1049 | 1051 | 
| 1050 // Restore the next handler. | 1052 // Restore the next handler. | 
| 1051 thread_local_top()->handler_ = handler->next()->address(); | 1053 thread_local_top()->handler_ = handler->next()->address(); | 
| 1052 | 1054 | 
| 1053 // Gather information from the handler. | 1055 // Gather information from the handler. | 
| 1054 code = frame->LookupCode(); | 1056 code = frame->LookupCode(); | 
| 1055 handler_sp = handler->address() + StackHandlerConstants::kSize; | 1057 handler_sp = handler->address() + StackHandlerConstants::kSize; | 
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1110 thread_local_top()->pending_handler_offset_ = offset; | 1112 thread_local_top()->pending_handler_offset_ = offset; | 
| 1111 thread_local_top()->pending_handler_fp_ = handler_fp; | 1113 thread_local_top()->pending_handler_fp_ = handler_fp; | 
| 1112 thread_local_top()->pending_handler_sp_ = handler_sp; | 1114 thread_local_top()->pending_handler_sp_ = handler_sp; | 
| 1113 | 1115 | 
| 1114 // Return and clear pending exception. | 1116 // Return and clear pending exception. | 
| 1115 clear_pending_exception(); | 1117 clear_pending_exception(); | 
| 1116 return exception; | 1118 return exception; | 
| 1117 } | 1119 } | 
| 1118 | 1120 | 
| 1119 | 1121 | 
| 1122 void Isolate::RemoveMaterializedObjectsOnUnwind(StackFrame* frame) { | |
| 1123 if (frame->is_optimized()) { | |
| 1124 bool removed = materialized_object_store_->Remove(frame->fp()); | |
| 1125 USE(removed); | |
| 1126 // If there were any materialized objects, the code should be | |
| 1127 // marked for deopt. | |
| 1128 DCHECK(!removed || frame->LookupCode()->marked_for_deoptimization()); | |
| 1129 } | |
| 1130 } | |
| 1131 | |
| 1132 | |
| 1120 Isolate::CatchType Isolate::PredictExceptionCatcher() { | 1133 Isolate::CatchType Isolate::PredictExceptionCatcher() { | 
| 1121 Address external_handler = thread_local_top()->try_catch_handler_address(); | 1134 Address external_handler = thread_local_top()->try_catch_handler_address(); | 
| 1122 Address entry_handler = Isolate::handler(thread_local_top()); | 1135 Address entry_handler = Isolate::handler(thread_local_top()); | 
| 1123 if (IsExternalHandlerOnTop(nullptr)) return CAUGHT_BY_EXTERNAL; | 1136 if (IsExternalHandlerOnTop(nullptr)) return CAUGHT_BY_EXTERNAL; | 
| 1124 | 1137 | 
| 1125 // Search for an exception handler by performing a full walk over the stack. | 1138 // Search for an exception handler by performing a full walk over the stack. | 
| 1126 for (StackFrameIterator iter(this); !iter.done(); iter.Advance()) { | 1139 for (StackFrameIterator iter(this); !iter.done(); iter.Advance()) { | 
| 1127 StackFrame* frame = iter.frame(); | 1140 StackFrame* frame = iter.frame(); | 
| 1128 | 1141 | 
| 1129 // For JSEntryStub frames we update the JS_ENTRY handler. | 1142 // For JSEntryStub frames we update the JS_ENTRY handler. | 
| (...skipping 1626 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2756 if (prev_ && prev_->Intercept(flag)) return true; | 2769 if (prev_ && prev_->Intercept(flag)) return true; | 
| 2757 // Then check whether this scope intercepts. | 2770 // Then check whether this scope intercepts. | 
| 2758 if ((flag & intercept_mask_)) { | 2771 if ((flag & intercept_mask_)) { | 
| 2759 intercepted_flags_ |= flag; | 2772 intercepted_flags_ |= flag; | 
| 2760 return true; | 2773 return true; | 
| 2761 } | 2774 } | 
| 2762 return false; | 2775 return false; | 
| 2763 } | 2776 } | 
| 2764 | 2777 | 
| 2765 } } // namespace v8::internal | 2778 } } // namespace v8::internal | 
| OLD | NEW |