diff options
Diffstat (limited to 'deps/v8/src/heap/heap.h')
-rw-r--r-- | deps/v8/src/heap/heap.h | 288 |
1 files changed, 148 insertions, 140 deletions
diff --git a/deps/v8/src/heap/heap.h b/deps/v8/src/heap/heap.h index cb18ab5611..92f0ded036 100644 --- a/deps/v8/src/heap/heap.h +++ b/deps/v8/src/heap/heap.h @@ -178,7 +178,7 @@ namespace internal { V(FixedArray, materialized_objects, MaterializedObjects) \ V(FixedArray, allocation_sites_scratchpad, AllocationSitesScratchpad) \ V(FixedArray, microtask_queue, MicrotaskQueue) \ - V(FixedArray, dummy_vector, DummyVector) \ + V(TypeFeedbackVector, dummy_vector, DummyVector) \ V(FixedArray, detached_contexts, DetachedContexts) \ V(ArrayList, retained_maps, RetainedMaps) \ V(WeakHashTable, weak_object_to_code_table, WeakObjectToCodeTable) \ @@ -187,6 +187,7 @@ namespace internal { V(Object, weak_stack_trace_list, WeakStackTraceList) \ V(Object, code_stub_context, CodeStubContext) \ V(JSObject, code_stub_exports_object, CodeStubExportsObject) \ + V(Object, noscript_shared_function_infos, NoScriptSharedFunctionInfos) \ V(FixedArray, interpreter_table, InterpreterTable) \ V(Map, bytecode_array_map, BytecodeArrayMap) \ V(BytecodeArray, empty_bytecode_array, EmptyBytecodeArray) @@ -208,102 +209,106 @@ namespace internal { SMI_ROOT_LIST(V) \ V(StringTable, string_table, StringTable) -#define INTERNALIZED_STRING_LIST(V) \ - V(Object_string, "Object") \ - V(proto_string, "__proto__") \ - V(arguments_string, "arguments") \ - V(Arguments_string, "Arguments") \ - V(caller_string, "caller") \ - V(boolean_string, "boolean") \ - V(Boolean_string, "Boolean") \ - V(callee_string, "callee") \ - V(constructor_string, "constructor") \ - V(default_string, "default") \ - V(dot_result_string, ".result") \ - V(eval_string, "eval") \ - V(float32x4_string, "float32x4") \ - V(Float32x4_string, "Float32x4") \ - V(int32x4_string, "int32x4") \ - V(Int32x4_string, "Int32x4") \ - V(uint32x4_string, "uint32x4") \ - V(Uint32x4_string, "Uint32x4") \ - V(bool32x4_string, "bool32x4") \ - V(Bool32x4_string, "Bool32x4") \ - V(int16x8_string, "int16x8") \ - V(Int16x8_string, "Int16x8") \ - V(uint16x8_string, "uint16x8") \ - V(Uint16x8_string, "Uint16x8") \ - V(bool16x8_string, "bool16x8") \ - V(Bool16x8_string, "Bool16x8") \ - V(int8x16_string, "int8x16") \ - V(Int8x16_string, "Int8x16") \ - V(uint8x16_string, "uint8x16") \ - V(Uint8x16_string, "Uint8x16") \ - V(bool8x16_string, "bool8x16") \ - V(Bool8x16_string, "Bool8x16") \ - V(function_string, "function") \ - V(Function_string, "Function") \ - V(length_string, "length") \ - V(name_string, "name") \ - V(null_string, "null") \ - V(number_string, "number") \ - V(Number_string, "Number") \ - V(nan_string, "NaN") \ - V(source_string, "source") \ - V(source_url_string, "source_url") \ - V(source_mapping_url_string, "source_mapping_url") \ - V(this_string, "this") \ - V(global_string, "global") \ - V(ignore_case_string, "ignoreCase") \ - V(multiline_string, "multiline") \ - V(sticky_string, "sticky") \ - V(unicode_string, "unicode") \ - V(harmony_tolength_string, "harmony_tolength") \ - V(input_string, "input") \ - V(index_string, "index") \ - V(last_index_string, "lastIndex") \ - V(object_string, "object") \ - V(prototype_string, "prototype") \ - V(string_string, "string") \ - V(String_string, "String") \ - V(symbol_string, "symbol") \ - V(Symbol_string, "Symbol") \ - V(Map_string, "Map") \ - V(Set_string, "Set") \ - V(WeakMap_string, "WeakMap") \ - V(WeakSet_string, "WeakSet") \ - V(for_string, "for") \ - V(for_api_string, "for_api") \ - V(Date_string, "Date") \ - V(char_at_string, "CharAt") \ - V(undefined_string, "undefined") \ - V(valueOf_string, "valueOf") \ - V(stack_string, "stack") \ - V(toString_string, "toString") \ - V(toJSON_string, "toJSON") \ - V(KeyedLoadMonomorphic_string, "KeyedLoadMonomorphic") \ - V(KeyedStoreMonomorphic_string, "KeyedStoreMonomorphic") \ - V(illegal_access_string, "illegal access") \ - V(cell_value_string, "%cell_value") \ - V(illegal_argument_string, "illegal argument") \ - V(closure_string, "(closure)") \ - V(dot_string, ".") \ - V(compare_ic_string, "==") \ - V(strict_compare_ic_string, "===") \ - V(infinity_string, "Infinity") \ - V(minus_infinity_string, "-Infinity") \ - V(query_colon_string, "(?:)") \ - V(Generator_string, "Generator") \ - V(throw_string, "throw") \ - V(done_string, "done") \ - V(value_string, "value") \ - V(next_string, "next") \ - V(byte_length_string, "byteLength") \ - V(byte_offset_string, "byteOffset") \ - V(minus_zero_string, "-0") \ - V(Array_string, "Array") \ - V(Error_string, "Error") \ - V(RegExp_string, "RegExp") +#define INTERNALIZED_STRING_LIST(V) \ + V(anonymous_string, "anonymous") \ + V(arguments_string, "arguments") \ + V(Arguments_string, "Arguments") \ + V(Array_string, "Array") \ + V(bool16x8_string, "bool16x8") \ + V(Bool16x8_string, "Bool16x8") \ + V(bool32x4_string, "bool32x4") \ + V(Bool32x4_string, "Bool32x4") \ + V(bool8x16_string, "bool8x16") \ + V(Bool8x16_string, "Bool8x16") \ + V(boolean_string, "boolean") \ + V(Boolean_string, "Boolean") \ + V(byte_length_string, "byteLength") \ + V(byte_offset_string, "byteOffset") \ + V(callee_string, "callee") \ + V(caller_string, "caller") \ + V(cell_value_string, "%cell_value") \ + V(char_at_string, "CharAt") \ + V(closure_string, "(closure)") \ + V(compare_ic_string, "==") \ + V(configurable_string, "configurable") \ + V(constructor_string, "constructor") \ + V(Date_string, "Date") \ + V(default_string, "default") \ + V(done_string, "done") \ + V(dot_result_string, ".result") \ + V(dot_string, ".") \ + V(enumerable_string, "enumerable") \ + V(Error_string, "Error") \ + V(eval_string, "eval") \ + V(false_string, "false") \ + V(float32x4_string, "float32x4") \ + V(Float32x4_string, "Float32x4") \ + V(for_api_string, "for_api") \ + V(for_string, "for") \ + V(function_string, "function") \ + V(Function_string, "Function") \ + V(Generator_string, "Generator") \ + V(get_string, "get") \ + V(global_string, "global") \ + V(illegal_access_string, "illegal access") \ + V(illegal_argument_string, "illegal argument") \ + V(index_string, "index") \ + V(infinity_string, "Infinity") \ + V(input_string, "input") \ + V(int16x8_string, "int16x8") \ + V(Int16x8_string, "Int16x8") \ + V(int32x4_string, "int32x4") \ + V(Int32x4_string, "Int32x4") \ + V(int8x16_string, "int8x16") \ + V(Int8x16_string, "Int8x16") \ + V(KeyedLoadMonomorphic_string, "KeyedLoadMonomorphic") \ + V(KeyedStoreMonomorphic_string, "KeyedStoreMonomorphic") \ + V(last_index_string, "lastIndex") \ + V(length_string, "length") \ + V(Map_string, "Map") \ + V(minus_infinity_string, "-Infinity") \ + V(minus_zero_string, "-0") \ + V(name_string, "name") \ + V(nan_string, "NaN") \ + V(next_string, "next") \ + V(null_string, "null") \ + V(number_string, "number") \ + V(Number_string, "Number") \ + V(object_string, "object") \ + V(Object_string, "Object") \ + V(private_api_string, "private_api") \ + V(proto_string, "__proto__") \ + V(prototype_string, "prototype") \ + V(query_colon_string, "(?:)") \ + V(RegExp_string, "RegExp") \ + V(set_string, "set") \ + V(Set_string, "Set") \ + V(source_mapping_url_string, "source_mapping_url") \ + V(source_string, "source") \ + V(source_url_string, "source_url") \ + V(stack_string, "stack") \ + V(strict_compare_ic_string, "===") \ + V(string_string, "string") \ + V(String_string, "String") \ + V(symbol_string, "symbol") \ + V(Symbol_string, "Symbol") \ + V(this_string, "this") \ + V(throw_string, "throw") \ + V(toJSON_string, "toJSON") \ + V(toString_string, "toString") \ + V(true_string, "true") \ + V(uint16x8_string, "uint16x8") \ + V(Uint16x8_string, "Uint16x8") \ + V(uint32x4_string, "uint32x4") \ + V(Uint32x4_string, "Uint32x4") \ + V(uint8x16_string, "uint8x16") \ + V(Uint8x16_string, "Uint8x16") \ + V(undefined_string, "undefined") \ + V(valueOf_string, "valueOf") \ + V(value_string, "value") \ + V(WeakMap_string, "WeakMap") \ + V(WeakSet_string, "WeakSet") \ + V(writable_string, "writable") #define PRIVATE_SYMBOL_LIST(V) \ V(array_iteration_kind_symbol) \ @@ -331,8 +336,10 @@ namespace internal { V(nonexistent_symbol) \ V(nonextensible_symbol) \ V(normal_ic_symbol) \ + V(not_mapped_symbol) \ V(observed_symbol) \ V(premonomorphic_symbol) \ + V(promise_combined_deferred_symbol) \ V(promise_debug_marker_symbol) \ V(promise_has_handler_symbol) \ V(promise_on_resolve_symbol) \ @@ -346,15 +353,24 @@ namespace internal { V(string_iterator_next_index_symbol) \ V(uninitialized_symbol) -#define PUBLIC_SYMBOL_LIST(V) \ - V(has_instance_symbol, Symbol.hasInstance) \ - V(is_concat_spreadable_symbol, Symbol.isConcatSpreadable) \ - V(is_regexp_symbol, Symbol.isRegExp) \ - V(iterator_symbol, Symbol.iterator) \ - V(to_primitive_symbol, Symbol.toPrimitive) \ - V(to_string_tag_symbol, Symbol.toStringTag) \ +#define PUBLIC_SYMBOL_LIST(V) \ + V(has_instance_symbol, Symbol.hasInstance) \ + V(iterator_symbol, Symbol.iterator) \ + V(match_symbol, Symbol.match) \ + V(replace_symbol, Symbol.replace) \ + V(search_symbol, Symbol.search) \ + V(split_symbol, Symbol.split) \ + V(to_primitive_symbol, Symbol.toPrimitive) \ V(unscopables_symbol, Symbol.unscopables) +// Well-Known Symbols are "Public" symbols, which have a bit set which causes +// them to produce an undefined value when a load results in a failed access +// check. Because this behaviour is not specified properly as of yet, it only +// applies to a subset of spec-defined Well-Known Symbols. +#define WELL_KNOWN_SYMBOL_LIST(V) \ + V(is_concat_spreadable_symbol, Symbol.isConcatSpreadable) \ + V(to_string_tag_symbol, Symbol.toStringTag) + // Heap roots that are known to be immortal immovable, for which we can safely // skip write barriers. This list is not complete and has omissions. #define IMMORTAL_IMMOVABLE_ROOT_LIST(V) \ @@ -428,6 +444,7 @@ class GCIdleTimeHeapState; class GCTracer; class HeapObjectsFilter; class HeapStats; +class HistogramTimer; class Isolate; class MemoryReducer; class ObjectStats; @@ -565,13 +582,14 @@ class Heap { #define SYMBOL_INDEX_DECLARATION(name, description) k##name##RootIndex, PUBLIC_SYMBOL_LIST(SYMBOL_INDEX_DECLARATION) + WELL_KNOWN_SYMBOL_LIST(SYMBOL_INDEX_DECLARATION) #undef SYMBOL_INDEX_DECLARATION // Utility type maps #define DECLARE_STRUCT_MAP(NAME, Name, name) k##Name##MapRootIndex, - STRUCT_LIST(DECLARE_STRUCT_MAP) + STRUCT_LIST(DECLARE_STRUCT_MAP) #undef DECLARE_STRUCT_MAP - kStringTableRootIndex, + kStringTableRootIndex, #define ROOT_INDEX_DECLARATION(type, name, camel_name) k##camel_name##RootIndex, SMI_ROOT_LIST(ROOT_INDEX_DECLARATION) @@ -605,25 +623,6 @@ class Heap { Heap* heap_; }; - // An optional version of the above lock that can be used for some critical - // sections on the mutator thread; only safe since the GC currently does not - // do concurrent compaction. - class OptionalRelocationLock { - public: - OptionalRelocationLock(Heap* heap, bool concurrent) - : heap_(heap), concurrent_(concurrent) { - if (concurrent_) heap_->relocation_mutex_.Lock(); - } - - ~OptionalRelocationLock() { - if (concurrent_) heap_->relocation_mutex_.Unlock(); - } - - private: - Heap* heap_; - bool concurrent_; - }; - // Support for partial snapshots. After calling this we have a linear // space to write objects in each space. struct Chunk { @@ -1015,6 +1014,8 @@ class Heap { bool HasHighFragmentation(); bool HasHighFragmentation(intptr_t used, intptr_t committed); + void SetOptimizeForLatency() { optimize_for_memory_usage_ = false; } + void SetOptimizeForMemoryUsage() { optimize_for_memory_usage_ = true; } bool ShouldOptimizeForMemoryUsage() { return optimize_for_memory_usage_; } // =========================================================================== @@ -1125,6 +1126,7 @@ class Heap { #define SYMBOL_ACCESSOR(name, description) inline Symbol* name(); PUBLIC_SYMBOL_LIST(SYMBOL_ACCESSOR) + WELL_KNOWN_SYMBOL_LIST(SYMBOL_ACCESSOR) #undef SYMBOL_ACCESSOR Object* root(RootListIndex index) { return roots_[index]; } @@ -1165,6 +1167,10 @@ class Heap { roots_[kStringTableRootIndex] = value; } + void SetRootNoScriptSharedFunctionInfos(Object* value) { + roots_[kNoScriptSharedFunctionInfosRootIndex] = value; + } + // Set the stack limit in the roots_ array. Some architectures generate // code that looks here, because it is faster than loading from the static // jslimit_/real_jslimit_ variable in the StackGuard. @@ -1792,8 +1798,6 @@ class Heap { void IdleNotificationEpilogue(GCIdleTimeAction action, GCIdleTimeHeapState heap_state, double start_ms, double deadline_in_ms); - void CheckAndNotifyBackgroundIdleNotification(double idle_time_in_ms, - double now_ms); inline void UpdateAllocationsHash(HeapObject* object); inline void UpdateAllocationsHash(uint32_t value); @@ -1806,7 +1810,15 @@ class Heap { // implicit references from global handles, but don't atomically complete // marking. If we continue to mark incrementally, we might have marked // objects that die later. - void OverApproximateWeakClosure(const char* gc_reason); + void FinalizeIncrementalMarking(const char* gc_reason); + + // Returns the timer used for a given GC type. + // - GCScavenger: young generation GC + // - GCCompactor: full GC + // - GCFinalzeMC: finalization of incremental full GC + // - GCFinalizeMCReduceMemory: finalization of incremental full GC with + // memory reduction + HistogramTimer* GCTypeTimer(GarbageCollector collector); // =========================================================================== // Actual GC. ================================================================ @@ -1884,13 +1896,6 @@ class Heap { double mutator_speed); // =========================================================================== - // Inline allocation. ======================================================== - // =========================================================================== - - void LowerInlineAllocationLimit(intptr_t step); - void ResetInlineAllocationLimit(); - - // =========================================================================== // Idle notification. ======================================================== // =========================================================================== @@ -2277,6 +2282,8 @@ class Heap { ScavengeJob* scavenge_job_; + InlineAllocationObserver* idle_scavenge_observer_; + // These two counters are monotomically increasing and never reset. size_t full_codegen_bytes_generated_; size_t crankshaft_codegen_bytes_generated_; @@ -2347,6 +2354,7 @@ class Heap { friend class GCCallbacksScope; friend class GCTracer; friend class HeapIterator; + friend class IdleScavengeObserver; friend class IncrementalMarking; friend class MarkCompactCollector; friend class MarkCompactMarkingVisitor; @@ -2417,14 +2425,14 @@ class AlwaysAllocateScope { // objects in a heap space but above the allocation pointer. class VerifyPointersVisitor : public ObjectVisitor { public: - inline void VisitPointers(Object** start, Object** end); + inline void VisitPointers(Object** start, Object** end) override; }; // Verify that all objects are Smis. class VerifySmisVisitor : public ObjectVisitor { public: - inline void VisitPointers(Object** start, Object** end); + inline void VisitPointers(Object** start, Object** end) override; }; @@ -2685,7 +2693,7 @@ class PathTracer : public ObjectVisitor { object_stack_(20), no_allocation() {} - virtual void VisitPointers(Object** start, Object** end); + void VisitPointers(Object** start, Object** end) override; void Reset(); void TracePathFrom(Object** root); @@ -2715,7 +2723,7 @@ class PathTracer : public ObjectVisitor { DISALLOW_IMPLICIT_CONSTRUCTORS(PathTracer); }; #endif // DEBUG -} -} // namespace v8::internal +} // namespace internal +} // namespace v8 #endif // V8_HEAP_HEAP_H_ |