| 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/compiler.h" | 8 #include "src/compiler.h" |
| 9 #include "src/contexts.h" | 9 #include "src/contexts.h" |
| 10 #include "src/debug/debug-frames.h" | 10 #include "src/debug/debug-frames.h" |
| (...skipping 23 matching lines...) Expand all Loading... |
| 34 while (top != NULL && IsDebugContext(isolate, *top->context())) { | 34 while (top != NULL && IsDebugContext(isolate, *top->context())) { |
| 35 top = top->prev(); | 35 top = top->prev(); |
| 36 } | 36 } |
| 37 if (top != NULL) isolate->set_context(*top->context()); | 37 if (top != NULL) isolate->set_context(*top->context()); |
| 38 | 38 |
| 39 // Get the native context now set to the top context from before the | 39 // Get the native context now set to the top context from before the |
| 40 // debugger was invoked. | 40 // debugger was invoked. |
| 41 Handle<Context> context = isolate->native_context(); | 41 Handle<Context> context = isolate->native_context(); |
| 42 Handle<JSObject> receiver(context->global_proxy()); | 42 Handle<JSObject> receiver(context->global_proxy()); |
| 43 Handle<SharedFunctionInfo> outer_info(context->closure()->shared(), isolate); | 43 Handle<SharedFunctionInfo> outer_info(context->closure()->shared(), isolate); |
| 44 return Evaluate(isolate, outer_info, context, receiver, source); | 44 return Evaluate(isolate, outer_info, context, receiver, source, false); |
| 45 } | 45 } |
| 46 | 46 |
| 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 throw_on_side_effect) { |
| 51 // Handle the processing of break. | 52 // Handle the processing of break. |
| 52 DisableBreak disable_break_scope(isolate->debug()); | 53 DisableBreak disable_break_scope(isolate->debug()); |
| 53 | 54 |
| 54 // Get the frame where the debugging is performed. | 55 // Get the frame where the debugging is performed. |
| 55 StackTraceFrameIterator it(isolate, frame_id); | 56 StackTraceFrameIterator it(isolate, frame_id); |
| 56 if (!it.is_javascript()) return isolate->factory()->undefined_value(); | 57 if (!it.is_javascript()) return isolate->factory()->undefined_value(); |
| 57 JavaScriptFrame* frame = it.javascript_frame(); | 58 JavaScriptFrame* frame = it.javascript_frame(); |
| 58 | 59 |
| 59 // Traverse the saved contexts chain to find the active context for the | 60 // Traverse the saved contexts chain to find the active context for the |
| 60 // selected frame. | 61 // selected frame. |
| 61 SaveContext* save = | 62 SaveContext* save = |
| 62 DebugFrameHelper::FindSavedContextForFrame(isolate, frame); | 63 DebugFrameHelper::FindSavedContextForFrame(isolate, frame); |
| 63 SaveContext savex(isolate); | 64 SaveContext savex(isolate); |
| 64 isolate->set_context(*(save->context())); | 65 isolate->set_context(*(save->context())); |
| 65 | 66 |
| 66 // This is not a lot different than DebugEvaluate::Global, except that | 67 // This is not a lot different than DebugEvaluate::Global, except that |
| 67 // variables accessible by the function we are evaluating from are | 68 // variables accessible by the function we are evaluating from are |
| 68 // materialized and included on top of the native context. Changes to | 69 // materialized and included on top of the native context. Changes to |
| 69 // the materialized object are written back afterwards. | 70 // the materialized object are written back afterwards. |
| 70 // Note that the native context is taken from the original context chain, | 71 // Note that the native context is taken from the original context chain, |
| 71 // which may not be the current native context of the isolate. | 72 // which may not be the current native context of the isolate. |
| 72 ContextBuilder context_builder(isolate, frame, inlined_jsframe_index); | 73 ContextBuilder context_builder(isolate, frame, inlined_jsframe_index); |
| 73 if (isolate->has_pending_exception()) return MaybeHandle<Object>(); | 74 if (isolate->has_pending_exception()) return MaybeHandle<Object>(); |
| 74 | 75 |
| 75 Handle<Context> context = context_builder.evaluation_context(); | 76 Handle<Context> context = context_builder.evaluation_context(); |
| 76 Handle<JSObject> receiver(context->global_proxy()); | 77 Handle<JSObject> receiver(context->global_proxy()); |
| 77 MaybeHandle<Object> maybe_result = Evaluate( | 78 MaybeHandle<Object> maybe_result = |
| 78 isolate, context_builder.outer_info(), context, receiver, source); | 79 Evaluate(isolate, context_builder.outer_info(), context, receiver, source, |
| 80 throw_on_side_effect); |
| 79 if (!maybe_result.is_null()) context_builder.UpdateValues(); | 81 if (!maybe_result.is_null()) context_builder.UpdateValues(); |
| 80 return maybe_result; | 82 return maybe_result; |
| 81 } | 83 } |
| 82 | 84 |
| 83 | 85 |
| 84 // Compile and evaluate source for the given context. | 86 // Compile and evaluate source for the given context. |
| 85 MaybeHandle<Object> DebugEvaluate::Evaluate( | 87 MaybeHandle<Object> DebugEvaluate::Evaluate( |
| 86 Isolate* isolate, Handle<SharedFunctionInfo> outer_info, | 88 Isolate* isolate, Handle<SharedFunctionInfo> outer_info, |
| 87 Handle<Context> context, Handle<Object> receiver, Handle<String> source) { | 89 Handle<Context> context, Handle<Object> receiver, Handle<String> source, |
| 90 bool throw_on_side_effect) { |
| 88 Handle<JSFunction> eval_fun; | 91 Handle<JSFunction> eval_fun; |
| 89 ASSIGN_RETURN_ON_EXCEPTION( | 92 ASSIGN_RETURN_ON_EXCEPTION( |
| 90 isolate, eval_fun, | 93 isolate, eval_fun, |
| 91 Compiler::GetFunctionFromEval(source, outer_info, context, SLOPPY, | 94 Compiler::GetFunctionFromEval(source, outer_info, context, SLOPPY, |
| 92 NO_PARSE_RESTRICTION, kNoSourcePosition, | 95 NO_PARSE_RESTRICTION, kNoSourcePosition, |
| 93 kNoSourcePosition), | 96 kNoSourcePosition), |
| 94 Object); | 97 Object); |
| 95 | 98 |
| 96 Handle<Object> result; | 99 Handle<Object> result; |
| 97 { | 100 { |
| 98 NoSideEffectScope no_side_effect(isolate, | 101 NoSideEffectScope no_side_effect(isolate, throw_on_side_effect); |
| 99 FLAG_side_effect_free_debug_evaluate); | |
| 100 ASSIGN_RETURN_ON_EXCEPTION( | 102 ASSIGN_RETURN_ON_EXCEPTION( |
| 101 isolate, result, Execution::Call(isolate, eval_fun, receiver, 0, NULL), | 103 isolate, result, Execution::Call(isolate, eval_fun, receiver, 0, NULL), |
| 102 Object); | 104 Object); |
| 103 } | 105 } |
| 104 | 106 |
| 105 // Skip the global proxy as it has no properties and always delegates to the | 107 // Skip the global proxy as it has no properties and always delegates to the |
| 106 // real global object. | 108 // real global object. |
| 107 if (result->IsJSGlobalProxy()) { | 109 if (result->IsJSGlobalProxy()) { |
| 108 PrototypeIterator iter(isolate, Handle<JSGlobalProxy>::cast(result)); | 110 PrototypeIterator iter(isolate, Handle<JSGlobalProxy>::cast(result)); |
| 109 // TODO(verwaest): This will crash when the global proxy is detached. | 111 // TODO(verwaest): This will crash when the global proxy is detached. |
| (...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 537 | 539 |
| 538 if (FLAG_trace_side_effect_free_debug_evaluate) { | 540 if (FLAG_trace_side_effect_free_debug_evaluate) { |
| 539 PrintF("[debug-evaluate] API Callback at %p may cause side effect.\n", | 541 PrintF("[debug-evaluate] API Callback at %p may cause side effect.\n", |
| 540 reinterpret_cast<void*>(function_addr)); | 542 reinterpret_cast<void*>(function_addr)); |
| 541 } | 543 } |
| 542 return false; | 544 return false; |
| 543 } | 545 } |
| 544 | 546 |
| 545 } // namespace internal | 547 } // namespace internal |
| 546 } // namespace v8 | 548 } // namespace v8 |
| OLD | NEW |