Revision: 6893
Author: [email protected]
Date: Tue Feb 22 04:27:36 2011
Log: Fix second half of issue 1151, the first change (r6765) only fixed FunctionGetPrototype, not FunctionSetPrototype.

Review URL: http://codereview.chromium.org/6548008
http://code.google.com/p/v8/source/detail?r=6893

Modified:
 /branches/bleeding_edge/src/accessors.cc
 /branches/bleeding_edge/test/mjsunit/regress/regress-1151.js

=======================================
--- /branches/bleeding_edge/src/accessors.cc    Mon Feb 14 01:37:56 2011
+++ /branches/bleeding_edge/src/accessors.cc    Tue Feb 22 04:27:36 2011
@@ -446,8 +446,15 @@
   bool found_it = false;
JSFunction* function = FindInPrototypeChain<JSFunction>(object, &found_it);
   if (!found_it) return Heap::undefined_value();
+  while (!function->should_have_prototype()) {
+    found_it = false;
+    function = FindInPrototypeChain<JSFunction>(object->GetPrototype(),
+                                                &found_it);
+    // There has to be one because we hit the getter.
+    ASSERT(found_it);
+  }
+
   if (!function->has_prototype()) {
-    if (!function->should_have_prototype()) return Heap::undefined_value();
     Object* prototype;
{ MaybeObject* maybe_prototype = Heap::AllocateFunctionPrototype(function);
       if (!maybe_prototype->ToObject(&prototype)) return maybe_prototype;
@@ -467,6 +474,13 @@
   bool found_it = false;
JSFunction* function = FindInPrototypeChain<JSFunction>(object, &found_it);
   if (!found_it) return Heap::undefined_value();
+  if (!function->should_have_prototype()) {
+    // Since we hit this accessor, object will have no prototype property.
+ return object->SetLocalPropertyIgnoreAttributes(Heap::prototype_symbol(),
+                                                    value,
+                                                    NONE);
+  }
+
   if (function->has_initial_map()) {
     // If the function has allocated the initial map
     // replace it with a copy containing the new prototype.
=======================================
--- /branches/bleeding_edge/test/mjsunit/regress/regress-1151.js Mon Feb 14 01:37:56 2011 +++ /branches/bleeding_edge/test/mjsunit/regress/regress-1151.js Tue Feb 22 04:27:36 2011
@@ -30,3 +30,20 @@

 __defineSetter__.__proto__ = function() {};
 __defineSetter__['prototype']
+
+eval.__proto__ = function () { };
+eval['prototype'] = {};
+
+// Test that we are compatible with Safari on prototypes set locally and
+// on the actual prototype set using __proto__ on objects that has the
+// should_have_prototype set to false.
+function f() { return 42; }
+f.prototype = 43;
+__defineGetter__.__proto__ = f;
+
+// Regression test for not returning undefined.
+assertEquals(__defineGetter__.prototype, 43);
+
+// Regression test for not crashing.
+__defineGetter__.prototype = "foo";
+assertEquals(__defineGetter__.prototype, "foo");

--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to