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 1682 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1693 StaticVisitorBase::GetVisitorId(instance_type, instance_size)); | 1693 StaticVisitorBase::GetVisitorId(instance_type, instance_size)); |
1694 reinterpret_cast<Map*>(result)->set_inobject_properties(0); | 1694 reinterpret_cast<Map*>(result)->set_inobject_properties(0); |
1695 reinterpret_cast<Map*>(result)->set_pre_allocated_property_fields(0); | 1695 reinterpret_cast<Map*>(result)->set_pre_allocated_property_fields(0); |
1696 reinterpret_cast<Map*>(result)->set_unused_property_fields(0); | 1696 reinterpret_cast<Map*>(result)->set_unused_property_fields(0); |
1697 reinterpret_cast<Map*>(result)->set_bit_field(0); | 1697 reinterpret_cast<Map*>(result)->set_bit_field(0); |
1698 reinterpret_cast<Map*>(result)->set_bit_field2(0); | 1698 reinterpret_cast<Map*>(result)->set_bit_field2(0); |
1699 return result; | 1699 return result; |
1700 } | 1700 } |
1701 | 1701 |
1702 | 1702 |
1703 MaybeObject* Heap::AllocateMap(InstanceType instance_type, int instance_size) { | 1703 MaybeObject* Heap::AllocateMap(InstanceType instance_type, |
| 1704 int instance_size, |
| 1705 ElementsKind elements_kind) { |
1704 Object* result; | 1706 Object* result; |
1705 { MaybeObject* maybe_result = AllocateRawMap(); | 1707 { MaybeObject* maybe_result = AllocateRawMap(); |
1706 if (!maybe_result->ToObject(&result)) return maybe_result; | 1708 if (!maybe_result->ToObject(&result)) return maybe_result; |
1707 } | 1709 } |
1708 | 1710 |
1709 Map* map = reinterpret_cast<Map*>(result); | 1711 Map* map = reinterpret_cast<Map*>(result); |
1710 map->set_map(meta_map()); | 1712 map->set_map(meta_map()); |
1711 map->set_instance_type(instance_type); | 1713 map->set_instance_type(instance_type); |
1712 map->set_visitor_id( | 1714 map->set_visitor_id( |
1713 StaticVisitorBase::GetVisitorId(instance_type, instance_size)); | 1715 StaticVisitorBase::GetVisitorId(instance_type, instance_size)); |
1714 map->set_prototype(null_value()); | 1716 map->set_prototype(null_value()); |
1715 map->set_constructor(null_value()); | 1717 map->set_constructor(null_value()); |
1716 map->set_instance_size(instance_size); | 1718 map->set_instance_size(instance_size); |
1717 map->set_inobject_properties(0); | 1719 map->set_inobject_properties(0); |
1718 map->set_pre_allocated_property_fields(0); | 1720 map->set_pre_allocated_property_fields(0); |
1719 map->init_instance_descriptors(); | 1721 map->init_instance_descriptors(); |
1720 map->set_code_cache(empty_fixed_array()); | 1722 map->set_code_cache(empty_fixed_array()); |
1721 map->set_prototype_transitions(empty_fixed_array()); | 1723 map->set_prototype_transitions(empty_fixed_array()); |
1722 map->set_unused_property_fields(0); | 1724 map->set_unused_property_fields(0); |
1723 map->set_bit_field(0); | 1725 map->set_bit_field(0); |
1724 map->set_bit_field2(1 << Map::kIsExtensible); | 1726 map->set_bit_field2(1 << Map::kIsExtensible); |
1725 map->set_elements_kind(FAST_ELEMENTS); | 1727 map->set_elements_kind(elements_kind); |
1726 | 1728 |
1727 // If the map object is aligned fill the padding area with Smi 0 objects. | 1729 // If the map object is aligned fill the padding area with Smi 0 objects. |
1728 if (Map::kPadStart < Map::kSize) { | 1730 if (Map::kPadStart < Map::kSize) { |
1729 memset(reinterpret_cast<byte*>(map) + Map::kPadStart - kHeapObjectTag, | 1731 memset(reinterpret_cast<byte*>(map) + Map::kPadStart - kHeapObjectTag, |
1730 0, | 1732 0, |
1731 Map::kSize - Map::kPadStart); | 1733 Map::kSize - Map::kPadStart); |
1732 } | 1734 } |
1733 return map; | 1735 return map; |
1734 } | 1736 } |
1735 | 1737 |
(...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2105 return Oddball::cast(result)->Initialize(to_string, to_number, kind); | 2107 return Oddball::cast(result)->Initialize(to_string, to_number, kind); |
2106 } | 2108 } |
2107 | 2109 |
2108 | 2110 |
2109 bool Heap::CreateApiObjects() { | 2111 bool Heap::CreateApiObjects() { |
2110 Object* obj; | 2112 Object* obj; |
2111 | 2113 |
2112 { MaybeObject* maybe_obj = AllocateMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); | 2114 { MaybeObject* maybe_obj = AllocateMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); |
2113 if (!maybe_obj->ToObject(&obj)) return false; | 2115 if (!maybe_obj->ToObject(&obj)) return false; |
2114 } | 2116 } |
2115 set_neander_map(Map::cast(obj)); | 2117 // Don't use Smi-only elements optimizations for objects with the neander |
| 2118 // map. There are too many cases where element values are set directly with a |
| 2119 // bottleneck to trap the Smi-only -> fast elements transition, and there |
| 2120 // appears to be no benefit for optimize this case. |
| 2121 Map* new_neander_map = Map::cast(obj); |
| 2122 new_neander_map->set_elements_kind(FAST_ELEMENTS); |
| 2123 set_neander_map(new_neander_map); |
2116 | 2124 |
2117 { MaybeObject* maybe_obj = AllocateJSObjectFromMap(neander_map()); | 2125 { MaybeObject* maybe_obj = AllocateJSObjectFromMap(neander_map()); |
2118 if (!maybe_obj->ToObject(&obj)) return false; | 2126 if (!maybe_obj->ToObject(&obj)) return false; |
2119 } | 2127 } |
2120 Object* elements; | 2128 Object* elements; |
2121 { MaybeObject* maybe_elements = AllocateFixedArray(2); | 2129 { MaybeObject* maybe_elements = AllocateFixedArray(2); |
2122 if (!maybe_elements->ToObject(&elements)) return false; | 2130 if (!maybe_elements->ToObject(&elements)) return false; |
2123 } | 2131 } |
2124 FixedArray::cast(elements)->set(0, Smi::FromInt(0)); | 2132 FixedArray::cast(elements)->set(0, Smi::FromInt(0)); |
2125 JSObject::cast(obj)->set_elements(FixedArray::cast(elements)); | 2133 JSObject::cast(obj)->set_elements(FixedArray::cast(elements)); |
(...skipping 1370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3496 if (map->instance_size() > MaxObjectSizeInPagedSpace()) space = LO_SPACE; | 3504 if (map->instance_size() > MaxObjectSizeInPagedSpace()) space = LO_SPACE; |
3497 Object* obj; | 3505 Object* obj; |
3498 { MaybeObject* maybe_obj = Allocate(map, space); | 3506 { MaybeObject* maybe_obj = Allocate(map, space); |
3499 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 3507 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
3500 } | 3508 } |
3501 | 3509 |
3502 // Initialize the JSObject. | 3510 // Initialize the JSObject. |
3503 InitializeJSObjectFromMap(JSObject::cast(obj), | 3511 InitializeJSObjectFromMap(JSObject::cast(obj), |
3504 FixedArray::cast(properties), | 3512 FixedArray::cast(properties), |
3505 map); | 3513 map); |
3506 ASSERT(JSObject::cast(obj)->HasFastElements()); | 3514 ASSERT(JSObject::cast(obj)->HasFastSmiOnlyElements() || |
| 3515 JSObject::cast(obj)->HasFastElements()); |
3507 return obj; | 3516 return obj; |
3508 } | 3517 } |
3509 | 3518 |
3510 | 3519 |
3511 MaybeObject* Heap::AllocateJSObject(JSFunction* constructor, | 3520 MaybeObject* Heap::AllocateJSObject(JSFunction* constructor, |
3512 PretenureFlag pretenure) { | 3521 PretenureFlag pretenure) { |
3513 // Allocate the initial map if absent. | 3522 // Allocate the initial map if absent. |
3514 if (!constructor->has_initial_map()) { | 3523 if (!constructor->has_initial_map()) { |
3515 Object* initial_map; | 3524 Object* initial_map; |
3516 { MaybeObject* maybe_initial_map = AllocateInitialMap(constructor); | 3525 { MaybeObject* maybe_initial_map = AllocateInitialMap(constructor); |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3678 if (!maybe_clone->ToObject(&clone)) return maybe_clone; | 3687 if (!maybe_clone->ToObject(&clone)) return maybe_clone; |
3679 } | 3688 } |
3680 ASSERT(InNewSpace(clone)); | 3689 ASSERT(InNewSpace(clone)); |
3681 // Since we know the clone is allocated in new space, we can copy | 3690 // Since we know the clone is allocated in new space, we can copy |
3682 // the contents without worrying about updating the write barrier. | 3691 // the contents without worrying about updating the write barrier. |
3683 CopyBlock(HeapObject::cast(clone)->address(), | 3692 CopyBlock(HeapObject::cast(clone)->address(), |
3684 source->address(), | 3693 source->address(), |
3685 object_size); | 3694 object_size); |
3686 } | 3695 } |
3687 | 3696 |
| 3697 ASSERT(JSObject::cast(clone)->GetElementsKind() == source->GetElementsKind()); |
3688 FixedArrayBase* elements = FixedArrayBase::cast(source->elements()); | 3698 FixedArrayBase* elements = FixedArrayBase::cast(source->elements()); |
3689 FixedArray* properties = FixedArray::cast(source->properties()); | 3699 FixedArray* properties = FixedArray::cast(source->properties()); |
3690 // Update elements if necessary. | 3700 // Update elements if necessary. |
3691 if (elements->length() > 0) { | 3701 if (elements->length() > 0) { |
3692 Object* elem; | 3702 Object* elem; |
3693 { MaybeObject* maybe_elem; | 3703 { MaybeObject* maybe_elem; |
3694 if (elements->map() == fixed_cow_array_map()) { | 3704 if (elements->map() == fixed_cow_array_map()) { |
3695 maybe_elem = FixedArray::cast(elements); | 3705 maybe_elem = FixedArray::cast(elements); |
3696 } else if (source->HasFastDoubleElements()) { | 3706 } else if (source->HasFastDoubleElements()) { |
3697 maybe_elem = CopyFixedDoubleArray(FixedDoubleArray::cast(elements)); | 3707 maybe_elem = CopyFixedDoubleArray(FixedDoubleArray::cast(elements)); |
(...skipping 2658 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6356 } | 6366 } |
6357 isolate_->heap()->store_buffer()->Filter(MemoryChunk::ABOUT_TO_BE_FREED); | 6367 isolate_->heap()->store_buffer()->Filter(MemoryChunk::ABOUT_TO_BE_FREED); |
6358 for (chunk = chunks_queued_for_free_; chunk != NULL; chunk = next) { | 6368 for (chunk = chunks_queued_for_free_; chunk != NULL; chunk = next) { |
6359 next = chunk->next_chunk(); | 6369 next = chunk->next_chunk(); |
6360 isolate_->memory_allocator()->Free(chunk); | 6370 isolate_->memory_allocator()->Free(chunk); |
6361 } | 6371 } |
6362 chunks_queued_for_free_ = NULL; | 6372 chunks_queued_for_free_ = NULL; |
6363 } | 6373 } |
6364 | 6374 |
6365 } } // namespace v8::internal | 6375 } } // namespace v8::internal |
OLD | NEW |