From f2796382d7c1a27fec53c1f7dc445181ee701c98 Mon Sep 17 00:00:00 2001 From: mstarzinger Date: Tue, 18 Aug 2015 09:21:31 -0700 Subject: [PATCH] Make heap.h usable without objects-inl.h header. This CL us a pure refactoring that makes an empty compilation unit including just "heap.h" but not "objects-inl.h" compile without warnings or errors. This is needed to further reduce the header dependency tangle. R=mlippautz@chromium.org Review URL: https://codereview.chromium.org/1301583003 Cr-Commit-Position: refs/heads/master@{#30227} --- src/heap/heap-inl.h | 78 +++++++++++++++++++++++++++++++++ src/heap/heap.cc | 4 +- src/heap/heap.h | 78 ++++++++------------------------- src/heap/identity-map.cc | 1 - src/heap/objects-visiting-inl.h | 7 +++ src/heap/objects-visiting.h | 6 +-- 6 files changed, 108 insertions(+), 66 deletions(-) diff --git a/src/heap/heap-inl.h b/src/heap/heap-inl.h index 14ffca414..aecdd4098 100644 --- a/src/heap/heap-inl.h +++ b/src/heap/heap-inl.h @@ -46,6 +46,44 @@ void PromotionQueue::insert(HeapObject* target, int size) { } +#define ROOT_ACCESSOR(type, name, camel_name) \ + type* Heap::name() { return type::cast(roots_[k##camel_name##RootIndex]); } +ROOT_LIST(ROOT_ACCESSOR) +#undef ROOT_ACCESSOR + +#define STRUCT_MAP_ACCESSOR(NAME, Name, name) \ + Map* Heap::name##_map() { return Map::cast(roots_[k##Name##MapRootIndex]); } +STRUCT_LIST(STRUCT_MAP_ACCESSOR) +#undef STRUCT_MAP_ACCESSOR + +#define STRING_ACCESSOR(name, str) \ + String* Heap::name() { return String::cast(roots_[k##name##RootIndex]); } +INTERNALIZED_STRING_LIST(STRING_ACCESSOR) +#undef STRING_ACCESSOR + +#define SYMBOL_ACCESSOR(name) \ + Symbol* Heap::name() { return Symbol::cast(roots_[k##name##RootIndex]); } +PRIVATE_SYMBOL_LIST(SYMBOL_ACCESSOR) +#undef SYMBOL_ACCESSOR + +#define SYMBOL_ACCESSOR(name, varname, description) \ + Symbol* Heap::name() { return Symbol::cast(roots_[k##name##RootIndex]); } +PUBLIC_SYMBOL_LIST(SYMBOL_ACCESSOR) +#undef SYMBOL_ACCESSOR + +#define ROOT_ACCESSOR(type, name, camel_name) \ + void Heap::set_##name(type* value) { \ + /* The deserializer makes use of the fact that these common roots are */ \ + /* never in new space and never on a page that is being compacted. */ \ + DCHECK(!deserialization_complete() || \ + RootCanBeWrittenAfterInitialization(k##camel_name##RootIndex)); \ + DCHECK(k##camel_name##RootIndex >= kOldSpaceRoots || !InNewSpace(value)); \ + roots_[k##camel_name##RootIndex] = value; \ + } +ROOT_LIST(ROOT_ACCESSOR) +#undef ROOT_ACCESSOR + + template <> bool inline Heap::IsOneByte(Vector str, int chars) { // TODO(dcarney): incorporate Latin-1 check when Latin-1 is supported? @@ -670,6 +708,46 @@ void Heap::CompletelyClearInstanceofCache() { } +uint32_t Heap::HashSeed() { + uint32_t seed = static_cast(hash_seed()->value()); + DCHECK(FLAG_randomize_hashes || seed == 0); + return seed; +} + + +Smi* Heap::NextScriptId() { + int next_id = last_script_id()->value() + 1; + if (!Smi::IsValid(next_id) || next_id < 0) next_id = 1; + Smi* next_id_smi = Smi::FromInt(next_id); + set_last_script_id(next_id_smi); + return next_id_smi; +} + + +void Heap::SetArgumentsAdaptorDeoptPCOffset(int pc_offset) { + DCHECK(arguments_adaptor_deopt_pc_offset() == Smi::FromInt(0)); + set_arguments_adaptor_deopt_pc_offset(Smi::FromInt(pc_offset)); +} + + +void Heap::SetConstructStubDeoptPCOffset(int pc_offset) { + DCHECK(construct_stub_deopt_pc_offset() == Smi::FromInt(0)); + set_construct_stub_deopt_pc_offset(Smi::FromInt(pc_offset)); +} + + +void Heap::SetGetterStubDeoptPCOffset(int pc_offset) { + DCHECK(getter_stub_deopt_pc_offset() == Smi::FromInt(0)); + set_getter_stub_deopt_pc_offset(Smi::FromInt(pc_offset)); +} + + +void Heap::SetSetterStubDeoptPCOffset(int pc_offset) { + DCHECK(setter_stub_deopt_pc_offset() == Smi::FromInt(0)); + set_setter_stub_deopt_pc_offset(Smi::FromInt(pc_offset)); +} + + AlwaysAllocateScope::AlwaysAllocateScope(Isolate* isolate) : heap_(isolate->heap()), daf_(isolate) { heap_->always_allocate_scope_depth_++; diff --git a/src/heap/heap.cc b/src/heap/heap.cc index a96559208..6e6da98d3 100644 --- a/src/heap/heap.cc +++ b/src/heap/heap.cc @@ -2517,7 +2517,7 @@ class ScavengingVisitor : public StaticVisitorBase { return; } - heap->DoScavengeObject(first->map(), slot, first); + Heap::ScavengeObjectSlow(slot, first); object->set_map_word(MapWord::FromForwardingAddress(*slot)); return; } @@ -2607,7 +2607,7 @@ void Heap::ScavengeObjectSlow(HeapObject** p, HeapObject* object) { MapWord first_word = object->map_word(); SLOW_DCHECK(!first_word.IsForwardingAddress()); Map* map = first_word.ToMap(); - map->GetHeap()->DoScavengeObject(map, p, object); + map->GetHeap()->scavenging_visitors_table_.GetVisitor(map)(map, p, object); } diff --git a/src/heap/heap.h b/src/heap/heap.h index b6c9ddf81..4b26b6c51 100644 --- a/src/heap/heap.h +++ b/src/heap/heap.h @@ -894,32 +894,28 @@ class Heap { // You can't use type::cast during GC because the assert fails. // TODO(1490): Try removing the unchecked accessors, now that GC marking does // not corrupt the map. -#define ROOT_ACCESSOR(type, name, camel_name) \ - type* name() { return type::cast(roots_[k##camel_name##RootIndex]); } \ - type* raw_unchecked_##name() { \ - return reinterpret_cast(roots_[k##camel_name##RootIndex]); \ +#define ROOT_ACCESSOR(type, name, camel_name) \ + inline type* name(); \ + type* raw_unchecked_##name() { \ + return reinterpret_cast(roots_[k##camel_name##RootIndex]); \ } ROOT_LIST(ROOT_ACCESSOR) #undef ROOT_ACCESSOR // Utility type maps -#define STRUCT_MAP_ACCESSOR(NAME, Name, name) \ - Map* name##_map() { return Map::cast(roots_[k##Name##MapRootIndex]); } +#define STRUCT_MAP_ACCESSOR(NAME, Name, name) inline Map* name##_map(); STRUCT_LIST(STRUCT_MAP_ACCESSOR) #undef STRUCT_MAP_ACCESSOR -#define STRING_ACCESSOR(name, str) \ - String* name() { return String::cast(roots_[k##name##RootIndex]); } +#define STRING_ACCESSOR(name, str) inline String* name(); INTERNALIZED_STRING_LIST(STRING_ACCESSOR) #undef STRING_ACCESSOR -#define SYMBOL_ACCESSOR(name) \ - Symbol* name() { return Symbol::cast(roots_[k##name##RootIndex]); } +#define SYMBOL_ACCESSOR(name) inline Symbol* name(); PRIVATE_SYMBOL_LIST(SYMBOL_ACCESSOR) #undef SYMBOL_ACCESSOR -#define SYMBOL_ACCESSOR(name, varname, description) \ - Symbol* name() { return Symbol::cast(roots_[k##name##RootIndex]); } +#define SYMBOL_ACCESSOR(name, varname, description) inline Symbol* name(); PUBLIC_SYMBOL_LIST(SYMBOL_ACCESSOR) #undef SYMBOL_ACCESSOR @@ -1101,6 +1097,9 @@ class Heap { static inline void ScavengePointer(HeapObject** p); static inline void ScavengeObject(HeapObject** p, HeapObject* object); + // Slow part of scavenge object. + static void ScavengeObjectSlow(HeapObject** p, HeapObject* object); + enum ScratchpadSlotMode { IGNORE_SCRATCHPAD_SLOT, RECORD_SCRATCHPAD_SLOT }; // If an object has an AllocationMemento trailing it, return it, otherwise @@ -1432,10 +1431,6 @@ class Heap { inline bool OldGenerationAllocationLimitReached(); - inline void DoScavengeObject(Map* map, HeapObject** slot, HeapObject* obj) { - scavenging_visitors_table_.GetVisitor(map)(map, slot, obj); - } - void QueueMemoryChunkForFree(MemoryChunk* chunk); void FreeQueuedChunks(); @@ -1450,39 +1445,14 @@ class Heap { // The roots that have an index less than this are always in old space. static const int kOldSpaceRoots = 0x20; - uint32_t HashSeed() { - uint32_t seed = static_cast(hash_seed()->value()); - DCHECK(FLAG_randomize_hashes || seed == 0); - return seed; - } - - Smi* NextScriptId() { - int next_id = last_script_id()->value() + 1; - if (!Smi::IsValid(next_id) || next_id < 0) next_id = 1; - Smi* next_id_smi = Smi::FromInt(next_id); - set_last_script_id(next_id_smi); - return next_id_smi; - } - - void SetArgumentsAdaptorDeoptPCOffset(int pc_offset) { - DCHECK(arguments_adaptor_deopt_pc_offset() == Smi::FromInt(0)); - set_arguments_adaptor_deopt_pc_offset(Smi::FromInt(pc_offset)); - } + inline uint32_t HashSeed(); - void SetConstructStubDeoptPCOffset(int pc_offset) { - DCHECK(construct_stub_deopt_pc_offset() == Smi::FromInt(0)); - set_construct_stub_deopt_pc_offset(Smi::FromInt(pc_offset)); - } + inline Smi* NextScriptId(); - void SetGetterStubDeoptPCOffset(int pc_offset) { - DCHECK(getter_stub_deopt_pc_offset() == Smi::FromInt(0)); - set_getter_stub_deopt_pc_offset(Smi::FromInt(pc_offset)); - } - - void SetSetterStubDeoptPCOffset(int pc_offset) { - DCHECK(setter_stub_deopt_pc_offset() == Smi::FromInt(0)); - set_setter_stub_deopt_pc_offset(Smi::FromInt(pc_offset)); - } + inline void SetArgumentsAdaptorDeoptPCOffset(int pc_offset); + inline void SetConstructStubDeoptPCOffset(int pc_offset); + inline void SetGetterStubDeoptPCOffset(int pc_offset); + inline void SetSetterStubDeoptPCOffset(int pc_offset); // For post mortem debugging. void RememberUnmappedPage(Address page, bool compacted); @@ -1779,15 +1749,8 @@ class Heap { // Total length of the strings we failed to flatten since the last GC. int unflattened_strings_length_; -#define ROOT_ACCESSOR(type, name, camel_name) \ - inline void set_##name(type* value) { \ - /* The deserializer makes use of the fact that these common roots are */ \ - /* never in new space and never on a page that is being compacted. */ \ - DCHECK(!deserialization_complete() || \ - RootCanBeWrittenAfterInitialization(k##camel_name##RootIndex)); \ - DCHECK(k##camel_name##RootIndex >= kOldSpaceRoots || !InNewSpace(value)); \ - roots_[k##camel_name##RootIndex] = value; \ - } +#define ROOT_ACCESSOR(type, name, camel_name) \ + inline void set_##name(type* value); ROOT_LIST(ROOT_ACCESSOR) #undef ROOT_ACCESSOR @@ -2142,9 +2105,6 @@ class Heap { void ReportStatisticsBeforeGC(); void ReportStatisticsAfterGC(); - // Slow part of scavenge object. - static void ScavengeObjectSlow(HeapObject** p, HeapObject* object); - // Total RegExp code ever generated double total_regexp_code_generated_; diff --git a/src/heap/identity-map.cc b/src/heap/identity-map.cc index e4ce4e562..f901ac442 100644 --- a/src/heap/identity-map.cc +++ b/src/heap/identity-map.cc @@ -5,7 +5,6 @@ #include "src/heap/identity-map.h" #include "src/heap/heap.h" -#include "src/objects-inl.h" // TODO(mstarzinger): Temporary cycle breaker! #include "src/zone-containers.h" namespace v8 { diff --git a/src/heap/objects-visiting-inl.h b/src/heap/objects-visiting-inl.h index 4c3235e7b..21b770d8c 100644 --- a/src/heap/objects-visiting-inl.h +++ b/src/heap/objects-visiting-inl.h @@ -12,6 +12,13 @@ namespace v8 { namespace internal { + +template +Callback VisitorDispatchTable::GetVisitor(Map* map) { + return reinterpret_cast(callbacks_[map->visitor_id()]); +} + + template void StaticNewSpaceVisitor::Initialize() { table_.Register( diff --git a/src/heap/objects-visiting.h b/src/heap/objects-visiting.h index 03dcf757f..5b150cf19 100644 --- a/src/heap/objects-visiting.h +++ b/src/heap/objects-visiting.h @@ -148,14 +148,12 @@ class VisitorDispatchTable { } } + inline Callback GetVisitor(Map* map); + inline Callback GetVisitorById(StaticVisitorBase::VisitorId id) { return reinterpret_cast(callbacks_[id]); } - inline Callback GetVisitor(Map* map) { - return reinterpret_cast(callbacks_[map->visitor_id()]); - } - void Register(StaticVisitorBase::VisitorId id, Callback callback) { DCHECK(id < StaticVisitorBase::kVisitorIdCount); // id is unsigned. callbacks_[id] = reinterpret_cast(callback); -- 2.34.1