OLD | NEW |
1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 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 1199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1210 map->set_instance_type(instance_type); | 1210 map->set_instance_type(instance_type); |
1211 map->set_prototype(null_value()); | 1211 map->set_prototype(null_value()); |
1212 map->set_constructor(null_value()); | 1212 map->set_constructor(null_value()); |
1213 map->set_instance_size(instance_size); | 1213 map->set_instance_size(instance_size); |
1214 map->set_inobject_properties(0); | 1214 map->set_inobject_properties(0); |
1215 map->set_pre_allocated_property_fields(0); | 1215 map->set_pre_allocated_property_fields(0); |
1216 map->set_instance_descriptors(empty_descriptor_array()); | 1216 map->set_instance_descriptors(empty_descriptor_array()); |
1217 map->set_code_cache(empty_fixed_array()); | 1217 map->set_code_cache(empty_fixed_array()); |
1218 map->set_unused_property_fields(0); | 1218 map->set_unused_property_fields(0); |
1219 map->set_bit_field(0); | 1219 map->set_bit_field(0); |
1220 map->set_bit_field2(1 << Map::kIsExtensible); | 1220 map->set_bit_field2((1 << Map::kIsExtensible) | (1 << Map::kHasFastElements)); |
1221 | 1221 |
1222 // If the map object is aligned fill the padding area with Smi 0 objects. | 1222 // If the map object is aligned fill the padding area with Smi 0 objects. |
1223 if (Map::kPadStart < Map::kSize) { | 1223 if (Map::kPadStart < Map::kSize) { |
1224 memset(reinterpret_cast<byte*>(map) + Map::kPadStart - kHeapObjectTag, | 1224 memset(reinterpret_cast<byte*>(map) + Map::kPadStart - kHeapObjectTag, |
1225 0, | 1225 0, |
1226 Map::kSize - Map::kPadStart); | 1226 Map::kSize - Map::kPadStart); |
1227 } | 1227 } |
1228 return map; | 1228 return map; |
1229 } | 1229 } |
1230 | 1230 |
(...skipping 1307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2538 if (fun->has_instance_prototype()) { | 2538 if (fun->has_instance_prototype()) { |
2539 prototype = fun->instance_prototype(); | 2539 prototype = fun->instance_prototype(); |
2540 } else { | 2540 } else { |
2541 prototype = AllocateFunctionPrototype(fun); | 2541 prototype = AllocateFunctionPrototype(fun); |
2542 if (prototype->IsFailure()) return prototype; | 2542 if (prototype->IsFailure()) return prototype; |
2543 } | 2543 } |
2544 Map* map = Map::cast(map_obj); | 2544 Map* map = Map::cast(map_obj); |
2545 map->set_inobject_properties(in_object_properties); | 2545 map->set_inobject_properties(in_object_properties); |
2546 map->set_unused_property_fields(in_object_properties); | 2546 map->set_unused_property_fields(in_object_properties); |
2547 map->set_prototype(prototype); | 2547 map->set_prototype(prototype); |
| 2548 ASSERT(map->has_fast_elements()); |
2548 | 2549 |
2549 // If the function has only simple this property assignments add | 2550 // If the function has only simple this property assignments add |
2550 // field descriptors for these to the initial map as the object | 2551 // field descriptors for these to the initial map as the object |
2551 // cannot be constructed without having these properties. Guard by | 2552 // cannot be constructed without having these properties. Guard by |
2552 // the inline_new flag so we only change the map if we generate a | 2553 // the inline_new flag so we only change the map if we generate a |
2553 // specialized construct stub. | 2554 // specialized construct stub. |
2554 ASSERT(in_object_properties <= Map::kMaxPreAllocatedPropertyFields); | 2555 ASSERT(in_object_properties <= Map::kMaxPreAllocatedPropertyFields); |
2555 if (fun->shared()->CanGenerateInlineConstructor(prototype)) { | 2556 if (fun->shared()->CanGenerateInlineConstructor(prototype)) { |
2556 int count = fun->shared()->this_property_assignments_count(); | 2557 int count = fun->shared()->this_property_assignments_count(); |
2557 if (count > in_object_properties) { | 2558 if (count > in_object_properties) { |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2591 // for example, JSArray::JSArrayVerify). | 2592 // for example, JSArray::JSArrayVerify). |
2592 obj->InitializeBody(map->instance_size()); | 2593 obj->InitializeBody(map->instance_size()); |
2593 } | 2594 } |
2594 | 2595 |
2595 | 2596 |
2596 Object* Heap::AllocateJSObjectFromMap(Map* map, PretenureFlag pretenure) { | 2597 Object* Heap::AllocateJSObjectFromMap(Map* map, PretenureFlag pretenure) { |
2597 // JSFunctions should be allocated using AllocateFunction to be | 2598 // JSFunctions should be allocated using AllocateFunction to be |
2598 // properly initialized. | 2599 // properly initialized. |
2599 ASSERT(map->instance_type() != JS_FUNCTION_TYPE); | 2600 ASSERT(map->instance_type() != JS_FUNCTION_TYPE); |
2600 | 2601 |
2601 // Both types of globla objects should be allocated using | 2602 // Both types of global objects should be allocated using |
2602 // AllocateGloblaObject to be properly initialized. | 2603 // AllocateGlobalObject to be properly initialized. |
2603 ASSERT(map->instance_type() != JS_GLOBAL_OBJECT_TYPE); | 2604 ASSERT(map->instance_type() != JS_GLOBAL_OBJECT_TYPE); |
2604 ASSERT(map->instance_type() != JS_BUILTINS_OBJECT_TYPE); | 2605 ASSERT(map->instance_type() != JS_BUILTINS_OBJECT_TYPE); |
2605 | 2606 |
2606 // Allocate the backing storage for the properties. | 2607 // Allocate the backing storage for the properties. |
2607 int prop_size = | 2608 int prop_size = |
2608 map->pre_allocated_property_fields() + | 2609 map->pre_allocated_property_fields() + |
2609 map->unused_property_fields() - | 2610 map->unused_property_fields() - |
2610 map->inobject_properties(); | 2611 map->inobject_properties(); |
2611 ASSERT(prop_size >= 0); | 2612 ASSERT(prop_size >= 0); |
2612 Object* properties = AllocateFixedArray(prop_size, pretenure); | 2613 Object* properties = AllocateFixedArray(prop_size, pretenure); |
2613 if (properties->IsFailure()) return properties; | 2614 if (properties->IsFailure()) return properties; |
2614 | 2615 |
2615 // Allocate the JSObject. | 2616 // Allocate the JSObject. |
2616 AllocationSpace space = | 2617 AllocationSpace space = |
2617 (pretenure == TENURED) ? OLD_POINTER_SPACE : NEW_SPACE; | 2618 (pretenure == TENURED) ? OLD_POINTER_SPACE : NEW_SPACE; |
2618 if (map->instance_size() > MaxObjectSizeInPagedSpace()) space = LO_SPACE; | 2619 if (map->instance_size() > MaxObjectSizeInPagedSpace()) space = LO_SPACE; |
2619 Object* obj = Allocate(map, space); | 2620 Object* obj = Allocate(map, space); |
2620 if (obj->IsFailure()) return obj; | 2621 if (obj->IsFailure()) return obj; |
2621 | 2622 |
2622 // Initialize the JSObject. | 2623 // Initialize the JSObject. |
2623 InitializeJSObjectFromMap(JSObject::cast(obj), | 2624 InitializeJSObjectFromMap(JSObject::cast(obj), |
2624 FixedArray::cast(properties), | 2625 FixedArray::cast(properties), |
2625 map); | 2626 map); |
| 2627 ASSERT(JSObject::cast(obj)->HasFastElements()); |
2626 return obj; | 2628 return obj; |
2627 } | 2629 } |
2628 | 2630 |
2629 | 2631 |
2630 Object* Heap::AllocateJSObject(JSFunction* constructor, | 2632 Object* Heap::AllocateJSObject(JSFunction* constructor, |
2631 PretenureFlag pretenure) { | 2633 PretenureFlag pretenure) { |
2632 // Allocate the initial map if absent. | 2634 // Allocate the initial map if absent. |
2633 if (!constructor->has_initial_map()) { | 2635 if (!constructor->has_initial_map()) { |
2634 Object* initial_map = AllocateInitialMap(constructor); | 2636 Object* initial_map = AllocateInitialMap(constructor); |
2635 if (initial_map->IsFailure()) return initial_map; | 2637 if (initial_map->IsFailure()) return initial_map; |
(...skipping 2133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4769 void ExternalStringTable::TearDown() { | 4771 void ExternalStringTable::TearDown() { |
4770 new_space_strings_.Free(); | 4772 new_space_strings_.Free(); |
4771 old_space_strings_.Free(); | 4773 old_space_strings_.Free(); |
4772 } | 4774 } |
4773 | 4775 |
4774 | 4776 |
4775 List<Object*> ExternalStringTable::new_space_strings_; | 4777 List<Object*> ExternalStringTable::new_space_strings_; |
4776 List<Object*> ExternalStringTable::old_space_strings_; | 4778 List<Object*> ExternalStringTable::old_space_strings_; |
4777 | 4779 |
4778 } } // namespace v8::internal | 4780 } } // namespace v8::internal |
OLD | NEW |