| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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 "src/debug/debug-evaluate.h" | 5 #include "src/debug/debug-evaluate.h" |
| 6 | 6 |
| 7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/contexts.h" | 8 #include "src/contexts.h" |
| 9 #include "src/debug/debug.h" | 9 #include "src/debug/debug.h" |
| 10 #include "src/debug/debug-frames.h" | 10 #include "src/debug/debug-frames.h" |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 47 MaybeHandle<Object> DebugEvaluate::Local(Isolate* isolate, | 47 MaybeHandle<Object> DebugEvaluate::Local(Isolate* isolate, |
| 48 StackFrame::Id frame_id, | 48 StackFrame::Id frame_id, |
| 49 int inlined_jsframe_index, | 49 int inlined_jsframe_index, |
| 50 Handle<String> source, | 50 Handle<String> source, |
| 51 bool disable_break, | 51 bool disable_break, |
| 52 Handle<HeapObject> context_extension) { | 52 Handle<HeapObject> context_extension) { |
| 53 // Handle the processing of break. | 53 // Handle the processing of break. |
| 54 DisableBreak disable_break_scope(isolate->debug(), disable_break); | 54 DisableBreak disable_break_scope(isolate->debug(), disable_break); |
| 55 | 55 |
| 56 // Get the frame where the debugging is performed. | 56 // Get the frame where the debugging is performed. |
| 57 JavaScriptFrameIterator it(isolate, frame_id); | 57 StackTraceFrameIterator it(isolate, frame_id); |
| 58 JavaScriptFrame* frame = it.frame(); | 58 if (!it.is_javascript()) return isolate->factory()->undefined_value(); |
| 59 JavaScriptFrame* frame = it.javascript_frame(); |
| 59 | 60 |
| 60 // Traverse the saved contexts chain to find the active context for the | 61 // Traverse the saved contexts chain to find the active context for the |
| 61 // selected frame. | 62 // selected frame. |
| 62 SaveContext* save = | 63 SaveContext* save = |
| 63 DebugFrameHelper::FindSavedContextForFrame(isolate, frame); | 64 DebugFrameHelper::FindSavedContextForFrame(isolate, frame); |
| 64 SaveContext savex(isolate); | 65 SaveContext savex(isolate); |
| 65 isolate->set_context(*(save->context())); | 66 isolate->set_context(*(save->context())); |
| 66 | 67 |
| 67 // This is not a lot different than DebugEvaluate::Global, except that | 68 // This is not a lot different than DebugEvaluate::Global, except that |
| 68 // variables accessible by the function we are evaluating from are | 69 // variables accessible by the function we are evaluating from are |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 } | 120 } |
| 120 | 121 |
| 121 | 122 |
| 122 DebugEvaluate::ContextBuilder::ContextBuilder(Isolate* isolate, | 123 DebugEvaluate::ContextBuilder::ContextBuilder(Isolate* isolate, |
| 123 JavaScriptFrame* frame, | 124 JavaScriptFrame* frame, |
| 124 int inlined_jsframe_index) | 125 int inlined_jsframe_index) |
| 125 : isolate_(isolate), | 126 : isolate_(isolate), |
| 126 frame_(frame), | 127 frame_(frame), |
| 127 inlined_jsframe_index_(inlined_jsframe_index) { | 128 inlined_jsframe_index_(inlined_jsframe_index) { |
| 128 FrameInspector frame_inspector(frame, inlined_jsframe_index, isolate); | 129 FrameInspector frame_inspector(frame, inlined_jsframe_index, isolate); |
| 129 Handle<JSFunction> local_function = | 130 Handle<JSFunction> local_function = frame_inspector.GetFunction(); |
| 130 Handle<JSFunction>::cast(frame_inspector.GetFunction()); | |
| 131 Handle<Context> outer_context(local_function->context()); | 131 Handle<Context> outer_context(local_function->context()); |
| 132 evaluation_context_ = outer_context; | 132 evaluation_context_ = outer_context; |
| 133 outer_info_ = handle(local_function->shared()); | 133 outer_info_ = handle(local_function->shared()); |
| 134 Factory* factory = isolate->factory(); | 134 Factory* factory = isolate->factory(); |
| 135 | 135 |
| 136 // To evaluate as if we were running eval at the point of the debug break, | 136 // To evaluate as if we were running eval at the point of the debug break, |
| 137 // we reconstruct the context chain as follows: | 137 // we reconstruct the context chain as follows: |
| 138 // - To make stack-allocated variables visible, we materialize them and | 138 // - To make stack-allocated variables visible, we materialize them and |
| 139 // use a debug-evaluate context to wrap both the materialized object and | 139 // use a debug-evaluate context to wrap both the materialized object and |
| 140 // the original context. | 140 // the original context. |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 251 return; | 251 return; |
| 252 } else if (local_function->shared()->scope_info()->HasReceiver() && | 252 } else if (local_function->shared()->scope_info()->HasReceiver() && |
| 253 !frame_->receiver()->IsTheHole(isolate_)) { | 253 !frame_->receiver()->IsTheHole(isolate_)) { |
| 254 recv = handle(frame_->receiver(), isolate_); | 254 recv = handle(frame_->receiver(), isolate_); |
| 255 } | 255 } |
| 256 JSObject::SetOwnPropertyIgnoreAttributes(target, name, recv, NONE).Check(); | 256 JSObject::SetOwnPropertyIgnoreAttributes(target, name, recv, NONE).Check(); |
| 257 } | 257 } |
| 258 | 258 |
| 259 } // namespace internal | 259 } // namespace internal |
| 260 } // namespace v8 | 260 } // namespace v8 |
| OLD | NEW |