Index: src/accessors.cc |
=================================================================== |
--- src/accessors.cc (revision 6865) |
+++ src/accessors.cc (working copy) |
@@ -447,7 +447,22 @@ |
JSFunction* function = FindInPrototypeChain<JSFunction>(object, &found_it); |
if (!found_it) return Heap::undefined_value(); |
if (!function->has_prototype()) { |
- if (!function->should_have_prototype()) return Heap::undefined_value(); |
+ if (!function->should_have_prototype()) { |
Mads Ager (chromium)
2011/02/22 10:17:07
Can we simplify this? How about moving this before
Rico
2011/02/22 12:22:44
Done.
|
+ // Check if there is a 'prototype' property. |
+ LookupResult result; |
+ Handle<String> proto_name = |
Mads Ager (chromium)
2011/02/22 10:17:07
This code does not use handles. You can use Heap::
Rico
2011/02/22 12:22:44
Done.
|
+ Factory::NewStringFromAscii(CStrVector("prototype")); |
+ function->Lookup(*proto_name, &result); |
+ |
+ if (result.IsProperty()) { |
+ if (result.holder()->IsJSFunction()) { |
+ JSFunction* jsfunction = JSFunction::cast(result.holder()); |
+ if (jsfunction->has_prototype()) return jsfunction->prototype(); |
+ } |
+ } |
+ // There was no prototype in the prototype chain, return undefined. |
+ return Heap::undefined_value(); |
+ } |
Object* prototype; |
{ MaybeObject* maybe_prototype = Heap::AllocateFunctionPrototype(function); |
if (!maybe_prototype->ToObject(&prototype)) return maybe_prototype; |
@@ -467,6 +482,13 @@ |
bool found_it = false; |
JSFunction* function = FindInPrototypeChain<JSFunction>(object, &found_it); |
if (!found_it) return Heap::undefined_value(); |
+ if (!function->should_have_prototype()) { |
+ return object->SetLocalPropertyIgnoreAttributes( |
Mads Ager (chromium)
2011/02/22 10:17:07
Please add a comment stating that object does not
Rico
2011/02/22 12:22:44
Done.
|
+ *Factory::NewStringFromAscii(CStrVector("prototype")), |
Mads Ager (chromium)
2011/02/22 10:17:07
Heap::prototype_symbol()
Rico
2011/02/22 12:22:44
Done.
|
+ value, |
+ NONE); |
+ } |
+ |
if (function->has_initial_map()) { |
// If the function has allocated the initial map |
// replace it with a copy containing the new prototype. |