| Index: src/heap.cc
|
| diff --git a/src/heap.cc b/src/heap.cc
|
| index 522861deda05e2a163861ac527be202631387441..94d73a2148ff9442e5da75cbdc5e0904cbe08aa5 100644
|
| --- a/src/heap.cc
|
| +++ b/src/heap.cc
|
| @@ -3321,9 +3321,9 @@ MaybeObject* Heap::Allocate(Map* map, AllocationSpace space) {
|
| }
|
|
|
|
|
| -MaybeObject* Heap::InitializeFunction(JSFunction* function,
|
| - SharedFunctionInfo* shared,
|
| - Object* prototype) {
|
| +void Heap::InitializeFunction(JSFunction* function,
|
| + SharedFunctionInfo* shared,
|
| + Object* prototype) {
|
| ASSERT(!prototype->IsMap());
|
| function->initialize_properties();
|
| function->initialize_elements();
|
| @@ -3333,7 +3333,6 @@ MaybeObject* Heap::InitializeFunction(JSFunction* function,
|
| function->set_context(undefined_value());
|
| function->set_literals(empty_fixed_array());
|
| function->set_next_function_link(undefined_value());
|
| - return function;
|
| }
|
|
|
|
|
| @@ -3379,7 +3378,8 @@ MaybeObject* Heap::AllocateFunction(Map* function_map,
|
| { MaybeObject* maybe_result = Allocate(function_map, space);
|
| if (!maybe_result->ToObject(&result)) return maybe_result;
|
| }
|
| - return InitializeFunction(JSFunction::cast(result), shared, prototype);
|
| + InitializeFunction(JSFunction::cast(result), shared, prototype);
|
| + return result;
|
| }
|
|
|
|
|
| @@ -3819,9 +3819,6 @@ MaybeObject* Heap::ReinitializeJSReceiver(
|
| JSReceiver* object, InstanceType type, int size) {
|
| 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;
|
| @@ -3837,10 +3834,21 @@ MaybeObject* Heap::ReinitializeJSReceiver(
|
| // Allocate the backing storage for the properties.
|
| int prop_size = map->unused_property_fields() - map->inobject_properties();
|
| Object* properties;
|
| - { MaybeObject* maybe_properties = AllocateFixedArray(prop_size, TENURED);
|
| - if (!maybe_properties->ToObject(&properties)) return maybe_properties;
|
| + maybe = AllocateFixedArray(prop_size, TENURED);
|
| + if (!maybe->ToObject(&properties)) return maybe;
|
| +
|
| + // Functions require some allocation, which might fail here.
|
| + SharedFunctionInfo* shared = NULL;
|
| + if (type == JS_FUNCTION_TYPE) {
|
| + String* name;
|
| + maybe = LookupAsciiSymbol("<freezing call trap>");
|
| + if (!maybe->To<String>(&name)) return maybe;
|
| + maybe = AllocateSharedFunctionInfo(name);
|
| + if (!maybe->To<SharedFunctionInfo>(&shared)) return maybe;
|
| }
|
|
|
| + // We must NOT fail after this point!
|
| +
|
| // Reset the map for the object.
|
| object->set_map(map);
|
| JSObject* jsobj = JSObject::cast(object);
|
| @@ -3851,17 +3859,9 @@ MaybeObject* Heap::ReinitializeJSReceiver(
|
| // Functions require some minimal initialization.
|
| if (type == JS_FUNCTION_TYPE) {
|
| map->set_function_with_prototype(true);
|
| - String* name;
|
| - maybe = LookupAsciiSymbol("<freezing call trap>");
|
| - if (!maybe->To<String>(&name)) return maybe;
|
| - SharedFunctionInfo* shared;
|
| - maybe = AllocateSharedFunctionInfo(name);
|
| - if (!maybe->To<SharedFunctionInfo>(&shared)) return maybe;
|
| - JSFunction* func;
|
| - maybe = InitializeFunction(
|
| - JSFunction::cast(object), shared, the_hole_value());
|
| - if (!maybe->To<JSFunction>(&func)) return maybe;
|
| - func->set_context(isolate()->context()->global_context());
|
| + InitializeFunction(JSFunction::cast(object), shared, the_hole_value());
|
| + JSFunction::cast(object)->set_context(
|
| + isolate()->context()->global_context());
|
| }
|
|
|
| // Put in filler if the new object is smaller than the old.
|
| @@ -3870,13 +3870,6 @@ 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;
|
| }
|
|
|
|
|