Index: src/runtime.cc |
diff --git a/src/runtime.cc b/src/runtime.cc |
index 02a97e24b17156f16e7a407bcbaa30af594356ab..4da776f6caccef807254753026ae8888be0a3351 100644 |
--- a/src/runtime.cc |
+++ b/src/runtime.cc |
@@ -12372,6 +12372,13 @@ static MaybeObject* DebugEvaluate(Isolate* isolate, |
// the same view of the values of parameters and local variables as if the |
// piece of JavaScript was evaluated at the point where the function on the |
// stack frame is currently stopped when we compile and run the (direct) eval. |
+// Returns array of |
+// #0: evaluate result |
+// #1: local variables scope materizalized as object before evaluation |
+// #2: local variables scope materizalized as object after evaluation |
+// Since user expression only reaches (and modifies) copies of local variables, |
+// those copies are returned to the caller to allow tracking the changes and |
+// manually updating the actual variables. |
RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugEvaluate) { |
HandleScope scope(isolate); |
@@ -12471,7 +12478,23 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugEvaluate) { |
} |
Handle<Object> receiver(frame->receiver(), isolate); |
- return DebugEvaluate(isolate, context, context_extension, receiver, source); |
+ Object* evaluate_result_object; |
+ { MaybeObject* maybe_result = |
+ DebugEvaluate(isolate, context, context_extension, receiver, source); |
+ if (!maybe_result->ToObject(&evaluate_result_object)) return maybe_result; |
+ } |
+ Handle<Object> evaluate_result(evaluate_result_object, isolate); |
+ |
+ Handle<JSObject> local_scope_after = MaterializeLocalScopeWithFrameInspector( |
+ isolate, frame, &frame_inspector); |
+ |
+ Handle<FixedArray> resultArray = |
+ isolate->factory()->NewFixedArray(3); |
+ resultArray->set(0, *evaluate_result); |
+ resultArray->set(2, *local_scope); |
+ resultArray->set(1, *local_scope_after); |
+ |
+ return *(isolate->factory()->NewJSArrayWithElements(resultArray)); |
} |