OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 3249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3260 | 3260 |
3261 | 3261 |
3262 MaybeObject* Heap::AllocateJSProxy(Object* handler, Object* prototype) { | 3262 MaybeObject* Heap::AllocateJSProxy(Object* handler, Object* prototype) { |
3263 // Allocate map. | 3263 // Allocate map. |
3264 // TODO(rossberg): Once we optimize proxies, think about a scheme to share | 3264 // TODO(rossberg): Once we optimize proxies, think about a scheme to share |
3265 // maps. Will probably depend on the identity of the handler object, too. | 3265 // maps. Will probably depend on the identity of the handler object, too. |
3266 Map* map; | 3266 Map* map; |
3267 MaybeObject* maybe_map_obj = AllocateMap(JS_PROXY_TYPE, JSProxy::kSize); | 3267 MaybeObject* maybe_map_obj = AllocateMap(JS_PROXY_TYPE, JSProxy::kSize); |
3268 if (!maybe_map_obj->To<Map>(&map)) return maybe_map_obj; | 3268 if (!maybe_map_obj->To<Map>(&map)) return maybe_map_obj; |
3269 map->set_prototype(prototype); | 3269 map->set_prototype(prototype); |
3270 map->set_pre_allocated_property_fields(1); | |
3271 map->set_inobject_properties(1); | |
3272 | 3270 |
3273 // Allocate the proxy object. | 3271 // Allocate the proxy object. |
3274 Object* result; | 3272 Object* result; |
3275 MaybeObject* maybe_result = Allocate(map, NEW_SPACE); | 3273 MaybeObject* maybe_result = Allocate(map, NEW_SPACE); |
3276 if (!maybe_result->ToObject(&result)) return maybe_result; | 3274 if (!maybe_result->ToObject(&result)) return maybe_result; |
3277 JSProxy::cast(result)->set_handler(handler); | 3275 JSProxy::cast(result)->set_handler(handler); |
| 3276 JSProxy::cast(result)->set_padding(Smi::FromInt(0)); |
3278 return result; | 3277 return result; |
3279 } | 3278 } |
3280 | 3279 |
3281 | 3280 |
3282 MaybeObject* Heap::AllocateGlobalObject(JSFunction* constructor) { | 3281 MaybeObject* Heap::AllocateGlobalObject(JSFunction* constructor) { |
3283 ASSERT(constructor->has_initial_map()); | 3282 ASSERT(constructor->has_initial_map()); |
3284 Map* map = constructor->initial_map(); | 3283 Map* map = constructor->initial_map(); |
3285 | 3284 |
3286 // Make sure no field properties are described in the initial map. | 3285 // Make sure no field properties are described in the initial map. |
3287 // This guarantees us that normalizing the properties does not | 3286 // This guarantees us that normalizing the properties does not |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3407 { MaybeObject* maybe_prop = CopyFixedArray(properties); | 3406 { MaybeObject* maybe_prop = CopyFixedArray(properties); |
3408 if (!maybe_prop->ToObject(&prop)) return maybe_prop; | 3407 if (!maybe_prop->ToObject(&prop)) return maybe_prop; |
3409 } | 3408 } |
3410 JSObject::cast(clone)->set_properties(FixedArray::cast(prop)); | 3409 JSObject::cast(clone)->set_properties(FixedArray::cast(prop)); |
3411 } | 3410 } |
3412 // Return the new clone. | 3411 // Return the new clone. |
3413 return clone; | 3412 return clone; |
3414 } | 3413 } |
3415 | 3414 |
3416 | 3415 |
| 3416 MaybeObject* Heap::ReinitializeJSProxyAsJSObject(JSProxy* object) { |
| 3417 // Allocate fresh map. |
| 3418 // TODO(rossberg): Once we optimize proxies, cache these maps. |
| 3419 Map* map; |
| 3420 MaybeObject* maybe_map_obj = |
| 3421 AllocateMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); |
| 3422 if (!maybe_map_obj->To<Map>(&map)) return maybe_map_obj; |
| 3423 |
| 3424 // Check that the receiver has the same size as a fresh object. |
| 3425 ASSERT(map->instance_size() == object->map()->instance_size()); |
| 3426 |
| 3427 map->set_prototype(object->map()->prototype()); |
| 3428 |
| 3429 // Allocate the backing storage for the properties. |
| 3430 int prop_size = map->unused_property_fields() - map->inobject_properties(); |
| 3431 Object* properties; |
| 3432 { MaybeObject* maybe_properties = AllocateFixedArray(prop_size, TENURED); |
| 3433 if (!maybe_properties->ToObject(&properties)) return maybe_properties; |
| 3434 } |
| 3435 |
| 3436 // Reset the map for the object. |
| 3437 object->set_map(map); |
| 3438 |
| 3439 // Reinitialize the object from the constructor map. |
| 3440 InitializeJSObjectFromMap(JSObject::cast(object), |
| 3441 FixedArray::cast(properties), map); |
| 3442 return object; |
| 3443 } |
| 3444 |
| 3445 |
3417 MaybeObject* Heap::ReinitializeJSGlobalProxy(JSFunction* constructor, | 3446 MaybeObject* Heap::ReinitializeJSGlobalProxy(JSFunction* constructor, |
3418 JSGlobalProxy* object) { | 3447 JSGlobalProxy* object) { |
3419 ASSERT(constructor->has_initial_map()); | 3448 ASSERT(constructor->has_initial_map()); |
3420 Map* map = constructor->initial_map(); | 3449 Map* map = constructor->initial_map(); |
3421 | 3450 |
3422 // Check that the already allocated object has the same size and type as | 3451 // Check that the already allocated object has the same size and type as |
3423 // objects allocated using the constructor. | 3452 // objects allocated using the constructor. |
3424 ASSERT(map->instance_size() == object->map()->instance_size()); | 3453 ASSERT(map->instance_size() == object->map()->instance_size()); |
3425 ASSERT(map->instance_type() == object->map()->instance_type()); | 3454 ASSERT(map->instance_type() == object->map()->instance_type()); |
3426 | 3455 |
(...skipping 2568 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5995 } | 6024 } |
5996 | 6025 |
5997 | 6026 |
5998 void ExternalStringTable::TearDown() { | 6027 void ExternalStringTable::TearDown() { |
5999 new_space_strings_.Free(); | 6028 new_space_strings_.Free(); |
6000 old_space_strings_.Free(); | 6029 old_space_strings_.Free(); |
6001 } | 6030 } |
6002 | 6031 |
6003 | 6032 |
6004 } } // namespace v8::internal | 6033 } } // namespace v8::internal |
OLD | NEW |