Commit 8162d902 authored by ricow@chromium.org's avatar ricow@chromium.org

Fix second half of issue 1151, the first change (r6765) only fixed...

Fix second half of issue 1151, the first change (r6765) only fixed FunctionGetPrototype, not FunctionSetPrototype.

Review URL: http://codereview.chromium.org/6548008

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@6893 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 0a15b911
...@@ -446,8 +446,15 @@ MaybeObject* Accessors::FunctionGetPrototype(Object* object, void*) { ...@@ -446,8 +446,15 @@ MaybeObject* Accessors::FunctionGetPrototype(Object* object, void*) {
bool found_it = false; bool found_it = false;
JSFunction* function = FindInPrototypeChain<JSFunction>(object, &found_it); JSFunction* function = FindInPrototypeChain<JSFunction>(object, &found_it);
if (!found_it) return Heap::undefined_value(); 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->has_prototype()) {
if (!function->should_have_prototype()) return Heap::undefined_value();
Object* prototype; Object* prototype;
{ MaybeObject* maybe_prototype = Heap::AllocateFunctionPrototype(function); { MaybeObject* maybe_prototype = Heap::AllocateFunctionPrototype(function);
if (!maybe_prototype->ToObject(&prototype)) return maybe_prototype; if (!maybe_prototype->ToObject(&prototype)) return maybe_prototype;
...@@ -467,6 +474,13 @@ MaybeObject* Accessors::FunctionSetPrototype(JSObject* object, ...@@ -467,6 +474,13 @@ MaybeObject* Accessors::FunctionSetPrototype(JSObject* object,
bool found_it = false; bool found_it = false;
JSFunction* function = FindInPrototypeChain<JSFunction>(object, &found_it); JSFunction* function = FindInPrototypeChain<JSFunction>(object, &found_it);
if (!found_it) return Heap::undefined_value(); 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 (function->has_initial_map()) {
// If the function has allocated the initial map // If the function has allocated the initial map
// replace it with a copy containing the new prototype. // replace it with a copy containing the new prototype.
......
...@@ -30,3 +30,20 @@ ...@@ -30,3 +30,20 @@
__defineSetter__.__proto__ = function() {}; __defineSetter__.__proto__ = function() {};
__defineSetter__['prototype'] __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");
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment