Chromium Code Reviews| Index: src/heap.cc |
| diff --git a/src/heap.cc b/src/heap.cc |
| index f0c37f2b9ecf2aa10c18d74d1bc972d428f5f433..bcb2168408b79065e19ef3a8a8fec7d447540c51 100644 |
| --- a/src/heap.cc |
| +++ b/src/heap.cc |
| @@ -3290,6 +3290,7 @@ MaybeObject* Heap::AllocateJSProxy(Object* handler, Object* prototype) { |
| if (!maybe_result->To<JSProxy>(&result)) return maybe_result; |
| result->InitializeBody(map->instance_size(), Smi::FromInt(0)); |
| result->set_handler(handler); |
| + result->set_hash(undefined_value()); |
| return result; |
| } |
| @@ -3313,6 +3314,7 @@ MaybeObject* Heap::AllocateJSFunctionProxy(Object* handler, |
| if (!maybe_result->To<JSFunctionProxy>(&result)) return maybe_result; |
| result->InitializeBody(map->instance_size(), Smi::FromInt(0)); |
| result->set_handler(handler); |
| + result->set_hash(undefined_value()); |
| result->set_call_trap(call_trap); |
| result->set_construct_trap(construct_trap); |
| return result; |
| @@ -3463,6 +3465,9 @@ MaybeObject* Heap::ReinitializeJSReceiver( |
| JSReceiver* object, InstanceType type, int size) { |
| ASSERT(type >= FIRST_JS_RECEIVER_TYPE); |
| + // Save identity hash. |
| + MaybeObject* maybe_hash = object->GetIdentityHash(JSReceiver::OMIT_CREATION); |
| + |
| // Allocate fresh map. |
| // TODO(rossberg): Once we optimize proxies, cache these maps. |
| Map* map; |
| @@ -3511,6 +3516,18 @@ MaybeObject* Heap::ReinitializeJSReceiver( |
| object->address() + map->instance_size(), size_difference); |
| } |
| + // Inherit identity, if it was present. |
| + Object* hash; |
| + if (maybe_hash->To<Object>(&hash) && hash->IsSmi()) { |
| + JSObject* jsobj = JSObject::cast(object); |
| + JSObject* hidden_props; |
| + MaybeObject* maybe = jsobj->GetHiddenProperties(JSObject::ALLOW_CREATION); |
|
Michael Starzinger
2011/09/09 09:40:00
Can we move that into a separate method JSObject::
rossberg
2011/09/12 10:50:08
Done.
|
| + if (!maybe->To<JSObject>(&hidden_props)) return maybe; |
| + maybe = hidden_props->SetLocalPropertyIgnoreAttributes( |
| + identity_hash_symbol(), hash, NONE); |
| + if (maybe->IsFailure()) return maybe; |
| + } |
| + |
| return object; |
| } |