Index: src/heap.cc |
diff --git a/src/heap.cc b/src/heap.cc |
index 98a2d3374b6949e3ab79d881f00a6d59b4871334..741947aa26a152225fafe1f8608c74f7e5eab7eb 100644 |
--- a/src/heap.cc |
+++ b/src/heap.cc |
@@ -3279,7 +3279,7 @@ MaybeObject* Heap::AllocateJSProxy(Object* handler, Object* prototype) { |
} |
-MaybeObject* Heap::AllocateGlobalObject(JSFunction* constructor) { |
+ MaybeObject* Heap::AllocateGlobalObject(JSFunction* constructor) { |
Mads Ager (chromium)
2011/07/17 10:43:47
Accidental edit. :-)
rossberg
2011/07/18 10:53:53
Done.
|
ASSERT(constructor->has_initial_map()); |
Map* map = constructor->initial_map(); |
@@ -3414,6 +3414,36 @@ MaybeObject* Heap::CopyJSObject(JSObject* source) { |
} |
+MaybeObject* Heap::ReinitializeJSReceiverAsJSObject(JSReceiver* object) { |
+ // Allocate fresh map. |
+ // TODO(rossberg): Once we optimize proxies, cache these maps. |
+ Map* map; |
+ MaybeObject* maybe_map_obj = |
+ AllocateMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); |
+ if (!maybe_map_obj->To<Map>(&map)) return maybe_map_obj; |
+ |
+ // Check that the receiver has the same size as a fresh object. |
+ ASSERT(map->instance_size() == object->map()->instance_size()); |
+ |
+ map->set_prototype(object->map()->prototype()); |
+ |
+ // 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; |
+ } |
+ |
+ // Reset the map for the object. |
+ object->set_map(map); |
+ |
+ // Reinitialize the object from the constructor map. |
+ InitializeJSObjectFromMap(JSObject::cast(object), |
+ FixedArray::cast(properties), map); |
+ return object; |
+} |
+ |
+ |
MaybeObject* Heap::ReinitializeJSGlobalProxy(JSFunction* constructor, |
JSGlobalProxy* object) { |
ASSERT(constructor->has_initial_map()); |