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 { |