Fix set variable value bug: a function argument must be updated in 2 places
authorpeter.rybin@gmail.com <peter.rybin@gmail.com@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Fri, 14 Dec 2012 18:36:51 +0000 (18:36 +0000)
committerpeter.rybin@gmail.com <peter.rybin@gmail.com@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Fri, 14 Dec 2012 18:36:51 +0000 (18:36 +0000)
Review URL: https://codereview.chromium.org/11519020

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@13225 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/runtime.cc
test/mjsunit/debug-set-variable-value.js

index c44a18396b19417dda787abe0a6f85fc4cb6d325..7c8879c2c4fc933b80cd0e61af517bd5656682fc 100644 (file)
@@ -10836,11 +10836,14 @@ static bool SetLocalVariableValue(Isolate* isolate,
   Handle<SharedFunctionInfo> shared(function->shared());
   Handle<ScopeInfo> scope_info(shared->scope_info());
 
+  bool default_result = false;
+
   // Parameters.
   for (int i = 0; i < scope_info->ParameterCount(); ++i) {
     if (scope_info->ParameterName(i)->Equals(*variable_name)) {
       frame->SetParameterValue(i, *new_value);
-      return true;
+      // Argument might be shadowed in heap context, don't stop here.
+      default_result = true;
     }
   }
 
@@ -10882,7 +10885,7 @@ static bool SetLocalVariableValue(Isolate* isolate,
     }
   }
 
-  return false;
+  return default_result;
 }
 
 
index 7b6a98b18165fd567b2a3661a0669472c7003c57..4667a71d6b717f35f1615d9bb4503f0b4cd0caef 100644 (file)
@@ -257,6 +257,38 @@ RunPauseTest(0, 'mouse', 'v1', 'dog', 'dog', (function Factory() {
 })());
 
 
+// Check that we correctly update local variable that
+// is referenced from an inner closure.
+RunPauseTest(0, 'Blue', 'v', 'Green', 'Green', (function Factory() {
+  return function() {
+    function A() {
+      var v = "Blue";
+      function Inner() {
+        return void v;
+      }
+      debugger;
+      return v;
+    }
+    return A();
+  }
+})());
+
+// Check that we correctly update parameter, that is known to be stored
+// both on stack and in heap.
+RunPauseTest(0, 5, 'p', 2012, 2012, (function Factory() {
+  return function() {
+    function A(p) {
+      function Inner() {
+        return void p;
+      }
+      debugger;
+      return p;
+    }
+    return A(5);
+  }
+})());
+
+
 // Test value description protocol JSON
 
 assertEquals(true, Debug.TestApi.CommandProcessorResolveValue({value: true}));