Index: src/heap.cc |
diff --git a/src/heap.cc b/src/heap.cc |
index d172ceb54d0d588fba6294024529c1d9174bae7a..5c566f7c3a88cd2c881c26df2f7158bc25478ea3 100644 |
--- a/src/heap.cc |
+++ b/src/heap.cc |
@@ -2338,8 +2338,13 @@ AllocationResult Heap::AllocatePartialMap(InstanceType instance_type, |
reinterpret_cast<Map*>(result)->set_map(raw_unchecked_meta_map()); |
reinterpret_cast<Map*>(result)->set_instance_type(instance_type); |
reinterpret_cast<Map*>(result)->set_instance_size(instance_size); |
+ // All initial maps have only tagged fields. |
Toon Verwaest
2014/07/29 15:02:08
// Initialize to only containing tagged fields.
Igor Sheludko
2014/10/30 14:23:43
Done.
|
reinterpret_cast<Map*>(result)->set_visitor_id( |
- StaticVisitorBase::GetVisitorId(instance_type, instance_size)); |
+ StaticVisitorBase::GetVisitorId(instance_type, instance_size, false)); |
+ if (FLAG_unbox_double_fields) { |
+ reinterpret_cast<Map*>(result) |
+ ->set_layout_descriptor(LayoutDescriptor::FastPointerLayout()); |
+ } |
reinterpret_cast<Map*>(result)->set_inobject_properties(0); |
reinterpret_cast<Map*>(result)->set_pre_allocated_property_fields(0); |
reinterpret_cast<Map*>(result)->set_unused_property_fields(0); |
@@ -2362,8 +2367,6 @@ AllocationResult Heap::AllocateMap(InstanceType instance_type, |
result->set_map_no_write_barrier(meta_map()); |
Map* map = Map::cast(result); |
map->set_instance_type(instance_type); |
- map->set_visitor_id( |
- StaticVisitorBase::GetVisitorId(instance_type, instance_size)); |
map->set_prototype(null_value(), SKIP_WRITE_BARRIER); |
map->set_constructor(null_value(), SKIP_WRITE_BARRIER); |
map->set_instance_size(instance_size); |
@@ -2375,6 +2378,12 @@ AllocationResult Heap::AllocateMap(InstanceType instance_type, |
map->init_back_pointer(undefined_value()); |
map->set_unused_property_fields(0); |
map->set_instance_descriptors(empty_descriptor_array()); |
+ if (FLAG_unbox_double_fields) { |
+ map->set_layout_descriptor(LayoutDescriptor::FastPointerLayout()); |
+ } |
+ // Must be called only after |instance_type|, |instance_size| and |
+ // |layout_descriptor| are set. |
+ map->set_visitor_id(StaticVisitorBase::GetVisitorId(map)); |
map->set_bit_field(0); |
map->set_bit_field2(1 << Map::kIsExtensible); |
int bit_field3 = Map::EnumLengthBits::encode(kInvalidEnumCacheSentinel) | |
@@ -2491,28 +2500,46 @@ bool Heap::CreateInitialMaps() { |
meta_map()->set_dependent_code(DependentCode::cast(empty_fixed_array())); |
meta_map()->init_back_pointer(undefined_value()); |
meta_map()->set_instance_descriptors(empty_descriptor_array()); |
+ if (FLAG_unbox_double_fields) { |
+ meta_map()->set_layout_descriptor(LayoutDescriptor::FastPointerLayout()); |
+ } |
fixed_array_map()->set_code_cache(empty_fixed_array()); |
fixed_array_map()->set_dependent_code( |
DependentCode::cast(empty_fixed_array())); |
fixed_array_map()->init_back_pointer(undefined_value()); |
fixed_array_map()->set_instance_descriptors(empty_descriptor_array()); |
+ if (FLAG_unbox_double_fields) { |
+ fixed_array_map()->set_layout_descriptor( |
+ LayoutDescriptor::FastPointerLayout()); |
+ } |
undefined_map()->set_code_cache(empty_fixed_array()); |
undefined_map()->set_dependent_code(DependentCode::cast(empty_fixed_array())); |
undefined_map()->init_back_pointer(undefined_value()); |
undefined_map()->set_instance_descriptors(empty_descriptor_array()); |
+ if (FLAG_unbox_double_fields) { |
+ undefined_map()->set_layout_descriptor( |
+ LayoutDescriptor::FastPointerLayout()); |
+ } |
null_map()->set_code_cache(empty_fixed_array()); |
null_map()->set_dependent_code(DependentCode::cast(empty_fixed_array())); |
null_map()->init_back_pointer(undefined_value()); |
null_map()->set_instance_descriptors(empty_descriptor_array()); |
+ if (FLAG_unbox_double_fields) { |
+ null_map()->set_layout_descriptor(LayoutDescriptor::FastPointerLayout()); |
+ } |
constant_pool_array_map()->set_code_cache(empty_fixed_array()); |
constant_pool_array_map()->set_dependent_code( |
DependentCode::cast(empty_fixed_array())); |
constant_pool_array_map()->init_back_pointer(undefined_value()); |
constant_pool_array_map()->set_instance_descriptors(empty_descriptor_array()); |
+ if (FLAG_unbox_double_fields) { |
+ constant_pool_array_map()->set_layout_descriptor( |
+ LayoutDescriptor::FastPointerLayout()); |
+ } |
// Fix prototype object for existing maps. |
meta_map()->set_prototype(null_value()); |