Revision: 24119
Author:   [email protected]
Date:     Mon Sep 22 12:45:47 2014 UTC
Log:      Fix DebugEvaluate on properties defined on Object.prototype

BUG=415499
R=yangguo
LOG=N

Review URL: https://codereview.chromium.org/592033002
https://code.google.com/p/v8/source/detail?r=24119

Modified:
 /branches/bleeding_edge/src/runtime.cc
 /branches/bleeding_edge/test/cctest/test-debug.cc

=======================================
--- /branches/bleeding_edge/src/runtime.cc      Mon Sep 22 11:42:10 2014 UTC
+++ /branches/bleeding_edge/src/runtime.cc      Mon Sep 22 12:45:47 2014 UTC
@@ -13005,6 +13005,16 @@
   isolate->debug()->ClearStepping();
   return result;
 }
+
+
+static Handle<JSObject> NewJSObjectWithNullProto(Isolate* isolate) {
+  Handle<JSObject> result =
+      isolate->factory()->NewJSObject(isolate->object_function());
+  Handle<Map> new_map = Map::Copy(Handle<Map>(result->map()));
+  new_map->set_prototype(*isolate->factory()->null_value());
+  JSObject::MigrateToMap(result, new_map);
+  return result;
+}


 // Evaluate a piece of JavaScript in the context of a stack frame for
@@ -13049,8 +13059,7 @@
   DCHECK(!context.is_null());

   // Materialize stack locals and the arguments object.
-  Handle<JSObject> materialized =
-      isolate->factory()->NewJSObject(isolate->object_function());
+  Handle<JSObject> materialized = NewJSObjectWithNullProto(isolate);

   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
       isolate, materialized,
=======================================
--- /branches/bleeding_edge/test/cctest/test-debug.cc Fri Sep 19 08:01:35 2014 UTC +++ /branches/bleeding_edge/test/cctest/test-debug.cc Mon Sep 22 12:45:47 2014 UTC
@@ -765,6 +765,7 @@
   CHECK_NE(debug->break_id(), 0);

   if (event == v8::Break) {
+    break_point_hit_count++;
     for (int i = 0; checks[i].expr != NULL; i++) {
       const int argc = 3;
       v8::Handle<v8::Value> argv[argc] = {
@@ -2406,7 +2407,7 @@
   };

// Simple test function. The "y=0" is in the function foo to provide a break
-  // location. For "y=0" the "y" is at position 15 in the barbar function
+  // location. For "y=0" the "y" is at position 15 in the foo function
   // therefore setting breakpoint at position 15 will break at "y=0" and
   // setting it higher will break after.
   v8::Local<v8::Function> foo = CompileFunction(&env,
@@ -2439,6 +2440,34 @@
   checks = checks_hh;
   foo->Call(env->Global(), 1, argv_foo);

+ // Test that overriding Object.prototype will not interfere into evaluation
+  // on call frame.
+  v8::Local<v8::Function> zoo =
+      CompileFunction(&env,
+                      "x = undefined;"
+                      "function zoo(t) {"
+                      "  var a=x;"
+                      "  Object.prototype.x = 42;"
+                      "  x=t;"
+                      "  y=0;"  // To ensure break location.
+                      "  delete Object.prototype.x;"
+                      "  x=a;"
+                      "}",
+                      "zoo");
+  const int zoo_break_position = 50;
+
+  // Arguments with one parameter "Hello, world!"
+  v8::Handle<v8::Value> argv_zoo[1] = {
+      v8::String::NewFromUtf8(env->GetIsolate(), "Hello, world!")};
+
+  // Call zoo with breakpoint set at y=0.
+  DebugEventCounterClear();
+  bp = SetBreakPoint(zoo, zoo_break_position);
+  checks = checks_hu;
+  zoo->Call(env->Global(), 1, argv_zoo);
+  CHECK_EQ(1, break_point_hit_count);
+  ClearBreakPoint(bp);
+
   // Test function with an inner function. The "y=0" is in function barbar
   // to provide a break location. For "y=0" the "y" is at position 8 in the
// barbar function therefore setting breakpoint at position 8 will break at

--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to