Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1046)

Unified Diff: src/heap/heap.cc

Issue 1846963002: Use a dictionary-mode code cache on the map rather than a dual system. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Addressed comment Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/heap/heap.h ('k') | src/heap/incremental-marking.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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:
« no previous file with comments | « src/heap/heap.h ('k') | src/heap/incremental-marking.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698