| 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;
|
| }
|
|
|
|
|