| Index: src/heap.h
|
| diff --git a/src/heap.h b/src/heap.h
|
| index eb3afd9fc4d94c6c119560b36a9fc6ec764225f1..c19b743cdf011ebae702258c178c1d1ee0f8816a 100644
|
| --- a/src/heap.h
|
| +++ b/src/heap.h
|
| @@ -78,7 +78,6 @@ namespace internal {
|
| V(ByteArray, empty_byte_array, EmptyByteArray) \
|
| V(DescriptorArray, empty_descriptor_array, EmptyDescriptorArray) \
|
| V(ConstantPoolArray, empty_constant_pool_array, EmptyConstantPoolArray) \
|
| - V(Smi, stack_limit, StackLimit) \
|
| V(Oddball, arguments_marker, ArgumentsMarker) \
|
| /* The roots above this line should be boring from a GC point of view. */ \
|
| /* This means they are never in new space and never on a page that is */ \
|
| @@ -186,14 +185,8 @@ namespace internal {
|
| V(Code, js_entry_code, JsEntryCode) \
|
| V(Code, js_construct_entry_code, JsConstructEntryCode) \
|
| V(FixedArray, natives_source_cache, NativesSourceCache) \
|
| - V(Smi, last_script_id, LastScriptId) \
|
| V(Script, empty_script, EmptyScript) \
|
| - V(Smi, real_stack_limit, RealStackLimit) \
|
| V(NameDictionary, intrinsic_function_names, IntrinsicFunctionNames) \
|
| - V(Smi, arguments_adaptor_deopt_pc_offset, ArgumentsAdaptorDeoptPCOffset) \
|
| - V(Smi, construct_stub_deopt_pc_offset, ConstructStubDeoptPCOffset) \
|
| - V(Smi, getter_stub_deopt_pc_offset, GetterStubDeoptPCOffset) \
|
| - V(Smi, setter_stub_deopt_pc_offset, SetterStubDeoptPCOffset) \
|
| V(Cell, undefined_cell, UndefineCell) \
|
| V(JSObject, observation_state, ObservationState) \
|
| V(Map, external_map, ExternalMap) \
|
| @@ -206,8 +199,19 @@ namespace internal {
|
| V(FixedArray, allocation_sites_scratchpad, AllocationSitesScratchpad) \
|
| V(JSObject, microtask_state, MicrotaskState)
|
|
|
| +// Entries in this list are limited to Smis and are not visited during GC.
|
| +#define SMI_ROOT_LIST(V) \
|
| + V(Smi, stack_limit, StackLimit) \
|
| + V(Smi, real_stack_limit, RealStackLimit) \
|
| + V(Smi, last_script_id, LastScriptId) \
|
| + V(Smi, arguments_adaptor_deopt_pc_offset, ArgumentsAdaptorDeoptPCOffset) \
|
| + V(Smi, construct_stub_deopt_pc_offset, ConstructStubDeoptPCOffset) \
|
| + V(Smi, getter_stub_deopt_pc_offset, GetterStubDeoptPCOffset) \
|
| + V(Smi, setter_stub_deopt_pc_offset, SetterStubDeoptPCOffset)
|
| +
|
| #define ROOT_LIST(V) \
|
| STRONG_ROOT_LIST(V) \
|
| + SMI_ROOT_LIST(V) \
|
| V(StringTable, string_table, StringTable)
|
|
|
| // Heap roots that are known to be immortal immovable, for which we can safely
|
| @@ -1347,6 +1351,9 @@ class Heap {
|
| void IterateRoots(ObjectVisitor* v, VisitMode mode);
|
| // Iterates over all strong roots in the heap.
|
| void IterateStrongRoots(ObjectVisitor* v, VisitMode mode);
|
| + // Iterates over entries in the smi roots list. Only interesting to the
|
| + // serializer/deserializer, since GC does not care about smis.
|
| + void IterateSmiRoots(ObjectVisitor* v);
|
| // Iterates over all the other roots in the heap.
|
| void IterateWeakRoots(ObjectVisitor* v, VisitMode mode);
|
|
|
| @@ -1582,7 +1589,7 @@ class Heap {
|
| // Implements the corresponding V8 API function.
|
| bool IdleNotification(int hint);
|
|
|
| - // Declare all the root indices.
|
| + // Declare all the root indices. This defines the root list order.
|
| enum RootListIndex {
|
| #define ROOT_INDEX_DECLARATION(type, name, camel_name) k##camel_name##RootIndex,
|
| STRONG_ROOT_LIST(ROOT_INDEX_DECLARATION)
|
| @@ -1598,8 +1605,14 @@ class Heap {
|
| #undef DECLARE_STRUCT_MAP
|
|
|
| kStringTableRootIndex,
|
| +
|
| +#define ROOT_INDEX_DECLARATION(type, name, camel_name) k##camel_name##RootIndex,
|
| + SMI_ROOT_LIST(ROOT_INDEX_DECLARATION)
|
| +#undef ROOT_INDEX_DECLARATION
|
| +
|
| + kRootListLength,
|
| kStrongRootListLength = kStringTableRootIndex,
|
| - kRootListLength
|
| + kSmiRootsStart = kStringTableRootIndex + 1
|
| };
|
|
|
| STATIC_CHECK(kUndefinedValueRootIndex == Internals::kUndefinedValueRootIndex);
|
| @@ -2589,6 +2602,13 @@ class VerifyPointersVisitor: public ObjectVisitor {
|
| };
|
|
|
|
|
| +// Verify that all objects are Smis.
|
| +class VerifySmisVisitor: public ObjectVisitor {
|
| + public:
|
| + inline void VisitPointers(Object** start, Object** end);
|
| +};
|
| +
|
| +
|
| // Space iterator for iterating over all spaces of the heap. Returns each space
|
| // in turn, and null when it is done.
|
| class AllSpaces BASE_EMBEDDED {
|
|
|