| Index: src/heap/heap.cc
|
| diff --git a/src/heap/heap.cc b/src/heap/heap.cc
|
| index 39bd6b2663529a44021ab196d9da31a91a710ab4..267f474a3af4fe8946dcf3e0974a7cd682d18217 100644
|
| --- a/src/heap/heap.cc
|
| +++ b/src/heap/heap.cc
|
| @@ -1481,10 +1481,6 @@ void Heap::MarkCompactPrologue() {
|
| CompletelyClearInstanceofCache();
|
|
|
| FlushNumberStringCache();
|
| - if (FLAG_cleanup_code_caches_at_gc) {
|
| - polymorphic_code_cache()->set_cache(undefined_value());
|
| - }
|
| -
|
| ClearNormalizedMapCaches();
|
| }
|
|
|
| @@ -2180,6 +2176,21 @@ const Heap::StructTable Heap::struct_table[] = {
|
| #undef STRUCT_TABLE_ELEMENT
|
| };
|
|
|
| +namespace {
|
| +
|
| +void FinalizePartialMap(Heap* heap, Map* map) {
|
| + map->set_code_cache(heap->empty_fixed_array());
|
| + map->set_dependent_code(DependentCode::cast(heap->empty_fixed_array()));
|
| + map->set_raw_transitions(Smi::FromInt(0));
|
| + map->set_instance_descriptors(heap->empty_descriptor_array());
|
| + if (FLAG_unbox_double_fields) {
|
| + map->set_layout_descriptor(LayoutDescriptor::FastPointerLayout());
|
| + }
|
| + map->set_prototype(heap->null_value());
|
| + map->set_constructor_or_backpointer(heap->null_value());
|
| +}
|
| +
|
| +} // namespace
|
|
|
| bool Heap::CreateInitialMaps() {
|
| HeapObject* obj = nullptr;
|
| @@ -2203,6 +2214,7 @@ bool Heap::CreateInitialMaps() {
|
| ALLOCATE_PARTIAL_MAP(FIXED_ARRAY_TYPE, kVariableSizeSentinel, fixed_array);
|
| ALLOCATE_PARTIAL_MAP(ODDBALL_TYPE, Oddball::kSize, undefined);
|
| ALLOCATE_PARTIAL_MAP(ODDBALL_TYPE, Oddball::kSize, null);
|
| + ALLOCATE_PARTIAL_MAP(ODDBALL_TYPE, Oddball::kSize, the_hole);
|
|
|
| #undef ALLOCATE_PARTIAL_MAP
|
| }
|
| @@ -2228,6 +2240,12 @@ bool Heap::CreateInitialMaps() {
|
| set_undefined_value(Oddball::cast(obj));
|
| Oddball::cast(obj)->set_kind(Oddball::kUndefined);
|
| DCHECK(!InNewSpace(undefined_value()));
|
| + {
|
| + AllocationResult allocation = Allocate(the_hole_map(), OLD_SPACE);
|
| + if (!allocation.To(&obj)) return false;
|
| + }
|
| + set_the_hole_value(Oddball::cast(obj));
|
| + Oddball::cast(obj)->set_kind(Oddball::kTheHole);
|
|
|
| // Set preliminary exception sentinel value before actually initializing it.
|
| set_exception(null_value());
|
| @@ -2240,55 +2258,13 @@ bool Heap::CreateInitialMaps() {
|
| set_empty_descriptor_array(DescriptorArray::cast(obj));
|
|
|
| // Fix the instance_descriptors for the existing maps.
|
| - meta_map()->set_code_cache(empty_fixed_array());
|
| - meta_map()->set_dependent_code(DependentCode::cast(empty_fixed_array()));
|
| - meta_map()->set_raw_transitions(Smi::FromInt(0));
|
| - 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()->set_raw_transitions(Smi::FromInt(0));
|
| - 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()->set_raw_transitions(Smi::FromInt(0));
|
| - 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()->set_raw_transitions(Smi::FromInt(0));
|
| - null_map()->set_instance_descriptors(empty_descriptor_array());
|
| - if (FLAG_unbox_double_fields) {
|
| - null_map()->set_layout_descriptor(LayoutDescriptor::FastPointerLayout());
|
| - }
|
| - null_map()->set_is_undetectable();
|
| -
|
| - // Fix prototype object for existing maps.
|
| - meta_map()->set_prototype(null_value());
|
| - meta_map()->set_constructor_or_backpointer(null_value());
|
| -
|
| - fixed_array_map()->set_prototype(null_value());
|
| - fixed_array_map()->set_constructor_or_backpointer(null_value());
|
| -
|
| - undefined_map()->set_prototype(null_value());
|
| - undefined_map()->set_constructor_or_backpointer(null_value());
|
| + FinalizePartialMap(this, meta_map());
|
| + FinalizePartialMap(this, fixed_array_map());
|
| + FinalizePartialMap(this, undefined_map());
|
| undefined_map()->set_is_undetectable();
|
| -
|
| - null_map()->set_prototype(null_value());
|
| - null_map()->set_constructor_or_backpointer(null_value());
|
| + FinalizePartialMap(this, null_map());
|
| + null_map()->set_is_undetectable();
|
| + FinalizePartialMap(this, the_hole_map());
|
|
|
| { // Map allocation
|
| #define ALLOCATE_MAP(instance_type, size, field_name) \
|
| @@ -2326,7 +2302,6 @@ bool Heap::CreateInitialMaps() {
|
| #undef ALLOCATE_SIMD128_MAP
|
| ALLOCATE_MAP(FOREIGN_TYPE, Foreign::kSize, foreign)
|
|
|
| - ALLOCATE_MAP(ODDBALL_TYPE, Oddball::kSize, the_hole);
|
| ALLOCATE_PRIMITIVE_MAP(ODDBALL_TYPE, Oddball::kSize, boolean,
|
| Context::BOOLEAN_FUNCTION_INDEX);
|
| ALLOCATE_MAP(ODDBALL_TYPE, Oddball::kSize, uninitialized);
|
| @@ -2650,10 +2625,6 @@ void Heap::CreateInitialObjects() {
|
| set_minus_infinity_value(
|
| *factory->NewHeapNumber(-V8_INFINITY, IMMUTABLE, TENURED));
|
|
|
| - // The hole has not been created yet, but we want to put something
|
| - // predictable in the gaps in the string table, so lets make that Smi zero.
|
| - set_the_hole_value(reinterpret_cast<Oddball*>(Smi::FromInt(0)));
|
| -
|
| // Allocate initial string table.
|
| set_string_table(*StringTable::New(isolate(), kInitialStringTableSize));
|
|
|
| @@ -2669,6 +2640,11 @@ void Heap::CreateInitialObjects() {
|
| handle(Smi::FromInt(0), isolate()), false, "object",
|
| Oddball::kNull);
|
|
|
| + // Initialize the_hole_value.
|
| + Oddball::Initialize(isolate(), factory->the_hole_value(), "hole",
|
| + handle(Smi::FromInt(-1), isolate()), false, "undefined",
|
| + Oddball::kTheHole);
|
| +
|
| // Initialize the true_value.
|
| Oddball::Initialize(isolate(), factory->true_value(), "true",
|
| handle(Smi::FromInt(1), isolate()), true, "boolean",
|
| @@ -2679,10 +2655,6 @@ void Heap::CreateInitialObjects() {
|
| handle(Smi::FromInt(0), isolate()), false, "boolean",
|
| Oddball::kFalse);
|
|
|
| - set_the_hole_value(*factory->NewOddball(
|
| - factory->the_hole_map(), "hole", handle(Smi::FromInt(-1), isolate()),
|
| - false, "undefined", Oddball::kTheHole));
|
| -
|
| set_uninitialized_value(
|
| *factory->NewOddball(factory->uninitialized_map(), "uninitialized",
|
| handle(Smi::FromInt(-1), isolate()), false,
|
| @@ -2726,9 +2698,6 @@ void Heap::CreateInitialObjects() {
|
| // is set to avoid expanding the dictionary during bootstrapping.
|
| set_non_monomorphic_cache(*UnseededNumberDictionary::New(isolate(), 64));
|
|
|
| - set_polymorphic_code_cache(PolymorphicCodeCache::cast(
|
| - *factory->NewStruct(POLYMORPHIC_CODE_CACHE_TYPE)));
|
| -
|
| set_instanceof_cache_function(Smi::FromInt(0));
|
| set_instanceof_cache_map(Smi::FromInt(0));
|
| set_instanceof_cache_answer(Smi::FromInt(0));
|
| @@ -2932,7 +2901,6 @@ bool Heap::RootCanBeWrittenAfterInitialization(Heap::RootListIndex root_index) {
|
| case kInstanceofCacheAnswerRootIndex:
|
| case kCodeStubsRootIndex:
|
| case kNonMonomorphicCacheRootIndex:
|
| - case kPolymorphicCodeCacheRootIndex:
|
| case kEmptyScriptRootIndex:
|
| case kSymbolRegistryRootIndex:
|
| case kScriptListRootIndex:
|
|
|