| Index: src/heap.cc | 
| diff --git a/src/heap.cc b/src/heap.cc | 
| index f0c37f2b9ecf2aa10c18d74d1bc972d428f5f433..cf2e5214cc1a8b99dcc47bf96e41dbf9ab296738 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; | 
| @@ -3461,13 +3463,16 @@ MaybeObject* Heap::CopyJSObject(JSObject* source) { | 
|  | 
| MaybeObject* Heap::ReinitializeJSReceiver( | 
| JSReceiver* object, InstanceType type, int size) { | 
| -  ASSERT(type >= FIRST_JS_RECEIVER_TYPE); | 
| +  ASSERT(type >= FIRST_JS_OBJECT_TYPE); | 
| + | 
| +  // Save identity hash. | 
| +  MaybeObject* maybe_hash = object->GetIdentityHash(OMIT_CREATION); | 
|  | 
| // Allocate fresh map. | 
| // TODO(rossberg): Once we optimize proxies, cache these maps. | 
| Map* map; | 
| -  MaybeObject* maybe_map_obj = AllocateMap(type, size); | 
| -  if (!maybe_map_obj->To<Map>(&map)) return maybe_map_obj; | 
| +  MaybeObject* maybe = AllocateMap(type, size); | 
| +  if (!maybe->To<Map>(&map)) return maybe; | 
|  | 
| // Check that the receiver has at least the size of the fresh object. | 
| int size_difference = object->map()->instance_size() - map->instance_size(); | 
| @@ -3484,24 +3489,24 @@ MaybeObject* Heap::ReinitializeJSReceiver( | 
|  | 
| // Reset the map for the object. | 
| object->set_map(map); | 
| +  JSObject* jsobj = JSObject::cast(object); | 
|  | 
| // Reinitialize the object from the constructor map. | 
| -  InitializeJSObjectFromMap(JSObject::cast(object), | 
| -                            FixedArray::cast(properties), map); | 
| +  InitializeJSObjectFromMap(jsobj, FixedArray::cast(properties), map); | 
|  | 
| // Functions require some minimal initialization. | 
| if (type == JS_FUNCTION_TYPE) { | 
| map->set_function_with_prototype(true); | 
| String* name; | 
| -    MaybeObject* maybe_name = LookupAsciiSymbol("<freezing call trap>"); | 
| -    if (!maybe_name->To<String>(&name)) return maybe_name; | 
| +    maybe = LookupAsciiSymbol("<freezing call trap>"); | 
| +    if (!maybe->To<String>(&name)) return maybe; | 
| SharedFunctionInfo* shared; | 
| -    MaybeObject* maybe_shared = AllocateSharedFunctionInfo(name); | 
| -    if (!maybe_shared->To<SharedFunctionInfo>(&shared)) return maybe_shared; | 
| +    maybe = AllocateSharedFunctionInfo(name); | 
| +    if (!maybe->To<SharedFunctionInfo>(&shared)) return maybe; | 
| JSFunction* func; | 
| -    MaybeObject* maybe_func = | 
| -        InitializeFunction(JSFunction::cast(object), shared, the_hole_value()); | 
| -    if (!maybe_func->To<JSFunction>(&func)) return maybe_func; | 
| +    maybe = InitializeFunction( | 
| +        JSFunction::cast(object), shared, the_hole_value()); | 
| +    if (!maybe->To<JSFunction>(&func)) return maybe; | 
| func->set_context(isolate()->context()->global_context()); | 
| } | 
|  | 
| @@ -3511,6 +3516,13 @@ 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()) { | 
| +    maybe = jsobj->SetIdentityHash(hash, ALLOW_CREATION); | 
| +    if (maybe->IsFailure()) return maybe; | 
| +  } | 
| + | 
| return object; | 
| } | 
|  | 
|  |