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