Index: src/accessors.cc |
=================================================================== |
--- src/accessors.cc (revision 6892) |
+++ src/accessors.cc (working copy) |
@@ -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. |