diff options
Diffstat (limited to 'deps/v8/src/objects/objects-body-descriptors-inl.h')
-rw-r--r-- | deps/v8/src/objects/objects-body-descriptors-inl.h | 130 |
1 files changed, 79 insertions, 51 deletions
diff --git a/deps/v8/src/objects/objects-body-descriptors-inl.h b/deps/v8/src/objects/objects-body-descriptors-inl.h index 7aac0e6a10..5df31698bc 100644 --- a/deps/v8/src/objects/objects-body-descriptors-inl.h +++ b/deps/v8/src/objects/objects-body-descriptors-inl.h @@ -21,6 +21,8 @@ #include "src/objects/free-space-inl.h" #include "src/objects/hash-table.h" #include "src/objects/heap-number.h" +#include "src/objects/instance-type.h" +#include "src/objects/js-array-buffer.h" #include "src/objects/js-atomics-synchronization-inl.h" #include "src/objects/js-collection.h" #include "src/objects/js-weak-refs.h" @@ -36,6 +38,7 @@ #include "src/objects/torque-defined-classes-inl.h" #include "src/objects/transitions.h" #include "src/objects/turbofan-types-inl.h" +#include "src/objects/turboshaft-types-inl.h" #if V8_ENABLE_WEBASSEMBLY #include "src/wasm/wasm-objects-inl.h" @@ -356,10 +359,10 @@ class JSFunction::BodyDescriptor final : public BodyDescriptorBase { int header_size = JSFunction::GetHeaderSize(map.has_prototype_slot()); DCHECK_GE(object_size, header_size); IteratePointers(obj, kStartOffset, kCodeOffset, v); - // Code field is treated as a custom weak pointer. This field is visited as - // a weak pointer if the Code is baseline code and the bytecode array - // corresponding to this function is old. In the rest of the cases this - // field is treated as strong pointer. + // Code field is treated as a custom weak pointer. This field + // is visited as a weak pointer if the Code is baseline code + // and the bytecode array corresponding to this function is old. In the rest + // of the cases this field is treated as strong pointer. IterateCustomWeakPointer(obj, kCodeOffset, v); // Iterate rest of the header fields DCHECK_GE(header_size, kCodeOffset); @@ -421,7 +424,8 @@ class JSTypedArray::BodyDescriptor final : public BodyDescriptorBase { } }; -class JSDataView::BodyDescriptor final : public BodyDescriptorBase { +class JSDataViewOrRabGsabDataView::BodyDescriptor final + : public BodyDescriptorBase { public: static bool IsValidSlot(Map map, HeapObject obj, int offset) { if (offset < kEndOfTaggedFieldsOffset) return true; @@ -432,7 +436,8 @@ class JSDataView::BodyDescriptor final : public BodyDescriptorBase { template <typename ObjectVisitor> static inline void IterateBody(Map map, HeapObject obj, int object_size, ObjectVisitor* v) { - // JSDataView contains raw data that the GC does not know about. + // JSDataViewOrRabGsabDataView contains raw data that the GC does not know + // about. IteratePointers(obj, kPropertiesOrHashOffset, kEndOfTaggedFieldsOffset, v); IterateJSObjectBodyImpl(map, obj, kHeaderSize, object_size, v); } @@ -613,6 +618,25 @@ class PreparseData::BodyDescriptor final : public BodyDescriptorBase { } }; +class SharedFunctionInfo::BodyDescriptor final : public BodyDescriptorBase { + public: + static bool IsValidSlot(Map map, HeapObject obj, int offset) { + return offset >= HeapObject::kHeaderSize && + offset < kEndOfStrongFieldsOffset; + } + + template <typename ObjectVisitor> + static inline void IterateBody(Map map, HeapObject obj, int object_size, + ObjectVisitor* v) { + IterateCustomWeakPointers(obj, kStartOfWeakFieldsOffset, + kEndOfWeakFieldsOffset, v); + IteratePointers(obj, kStartOfStrongFieldsOffset, kEndOfStrongFieldsOffset, + v); + } + + static inline int SizeOf(Map map, HeapObject raw_object) { return kSize; } +}; + class PromiseOnStack::BodyDescriptor final : public BodyDescriptorBase { public: static bool IsValidSlot(Map map, HeapObject obj, int offset) { @@ -880,36 +904,29 @@ class WasmStruct::BodyDescriptor final : public BodyDescriptorBase { } }; -#endif // V8_ENABLE_WEBASSEMBLY - -class ExternalOneByteString::BodyDescriptor final : public BodyDescriptorBase { +class WasmNull::BodyDescriptor final : public BodyDescriptorBase { public: - static bool IsValidSlot(Map map, HeapObject obj, int offset) { return false; } + static bool IsValidSlot(Map map, HeapObject obj, int offset) { + UNREACHABLE(); + } template <typename ObjectVisitor> static inline void IterateBody(Map map, HeapObject obj, int object_size, - ObjectVisitor* v) { - ExternalString string = ExternalString::cast(obj); - v->VisitExternalPointer(obj, - string.RawExternalPointerField(kResourceOffset), - kExternalStringResourceTag); - if (string.is_uncached()) return; - v->VisitExternalPointer(obj, - string.RawExternalPointerField(kResourceDataOffset), - kExternalStringResourceDataTag); - } + ObjectVisitor* v) {} - static inline int SizeOf(Map map, HeapObject object) { return kSize; } + static inline int SizeOf(Map map, HeapObject obj) { return WasmNull::kSize; } }; -class ExternalTwoByteString::BodyDescriptor final : public BodyDescriptorBase { +#endif // V8_ENABLE_WEBASSEMBLY + +class ExternalString::BodyDescriptor final : public BodyDescriptorBase { public: static bool IsValidSlot(Map map, HeapObject obj, int offset) { return false; } template <typename ObjectVisitor> static inline void IterateBody(Map map, HeapObject obj, int object_size, ObjectVisitor* v) { - ExternalString string = ExternalString::cast(obj); + ExternalString string = ExternalString::unchecked_cast(obj); v->VisitExternalPointer(obj, string.RawExternalPointerField(kResourceOffset), kExternalStringResourceTag); @@ -919,7 +936,12 @@ class ExternalTwoByteString::BodyDescriptor final : public BodyDescriptorBase { kExternalStringResourceDataTag); } - static inline int SizeOf(Map map, HeapObject object) { return kSize; } + static inline int SizeOf(Map map, HeapObject object) { + InstanceType type = map.instance_type(); + const auto is_uncached = + (type & kUncachedExternalStringMask) == kUncachedExternalStringTag; + return is_uncached ? kUncachedSize : kSizeOfAllExternalStrings; + } }; class CoverageInfo::BodyDescriptor final : public BodyDescriptorBase { @@ -936,14 +958,11 @@ class CoverageInfo::BodyDescriptor final : public BodyDescriptorBase { } }; -class Code::BodyDescriptor final : public BodyDescriptorBase { +class InstructionStream::BodyDescriptor final : public BodyDescriptorBase { public: - static_assert(kRelocationInfoOffset + kTaggedSize == - kDeoptimizationDataOrInterpreterDataOffset); - static_assert(kDeoptimizationDataOrInterpreterDataOffset + kTaggedSize == - kPositionTableOffset); - static_assert(kPositionTableOffset + kTaggedSize == kCodeDataContainerOffset); - static_assert(kCodeDataContainerOffset + kTaggedSize == kDataStart); + static_assert(static_cast<int>(HeapObject::kHeaderSize) == + static_cast<int>(kCodeOffset)); + static_assert(kCodeOffset + kTaggedSize == kDataStart); static bool IsValidSlot(Map map, HeapObject obj, int offset) { // Slots in code can't be invalid because we never trim code objects. @@ -958,14 +977,18 @@ class Code::BodyDescriptor final : public BodyDescriptorBase { RelocInfo::ModeMask(RelocInfo::EXTERNAL_REFERENCE) | RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE) | RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE_ENCODED) | - RelocInfo::ModeMask(RelocInfo::OFF_HEAP_TARGET); + RelocInfo::ModeMask(RelocInfo::OFF_HEAP_TARGET) | + RelocInfo::ModeMask(RelocInfo::WASM_STUB_CALL); template <typename ObjectVisitor> static inline void IterateBody(Map map, HeapObject obj, ObjectVisitor* v) { // GC does not visit data/code in the header and in the body directly. - IteratePointers(obj, kRelocationInfoOffset, kDataStart, v); + IteratePointers(obj, kCodeOffset, kDataStart, v); - RelocIterator it(Code::cast(obj), kRelocModeMask); + InstructionStream istream = InstructionStream::cast(obj); + Code code = istream.unchecked_code(); + RelocIterator it(code, istream, code.unchecked_relocation_info(), + code.constant_pool(), kRelocModeMask); v->VisitRelocInfo(&it); } @@ -976,7 +999,7 @@ class Code::BodyDescriptor final : public BodyDescriptorBase { } static inline int SizeOf(Map map, HeapObject object) { - return Code::unchecked_cast(object).CodeSize(); + return InstructionStream::unchecked_cast(object).CodeSize(); } }; @@ -1047,30 +1070,24 @@ class NativeContext::BodyDescriptor final : public BodyDescriptorBase { } }; -class CodeDataContainer::BodyDescriptor final : public BodyDescriptorBase { +class Code::BodyDescriptor final : public BodyDescriptorBase { public: static bool IsValidSlot(Map map, HeapObject obj, int offset) { return offset >= HeapObject::kHeaderSize && - offset <= CodeDataContainer::kPointerFieldsWeakEndOffset; + offset <= Code::kPointerFieldsStrongEndOffset; } template <typename ObjectVisitor> static inline void IterateBody(Map map, HeapObject obj, int object_size, ObjectVisitor* v) { IteratePointers(obj, HeapObject::kHeaderSize, - CodeDataContainer::kPointerFieldsStrongEndOffset, v); - IterateCustomWeakPointers( - obj, CodeDataContainer::kPointerFieldsStrongEndOffset, - CodeDataContainer::kPointerFieldsWeakEndOffset, v); + Code::kPointerFieldsStrongEndOffset, v); - if (V8_EXTERNAL_CODE_SPACE_BOOL) { - v->VisitCodePointer(obj, obj.RawCodeField(kCodeOffset)); - } + v->VisitCodePointer(Code::cast(obj), + obj.RawCodeField(kInstructionStreamOffset)); } - static inline int SizeOf(Map map, HeapObject object) { - return CodeDataContainer::kSize; - } + static inline int SizeOf(Map map, HeapObject object) { return Code::kSize; } }; class EmbedderDataArray::BodyDescriptor final : public BodyDescriptorBase { @@ -1234,6 +1251,10 @@ auto BodyDescriptorApply(InstanceType type, Args&&... args) { case JS_GENERATOR_OBJECT_TYPE: case JS_GLOBAL_OBJECT_TYPE: case JS_GLOBAL_PROXY_TYPE: + case JS_ITERATOR_FILTER_HELPER_TYPE: + case JS_ITERATOR_MAP_HELPER_TYPE: + case JS_ITERATOR_TAKE_HELPER_TYPE: + case JS_ITERATOR_DROP_HELPER_TYPE: case JS_ITERATOR_PROTOTYPE_TYPE: case JS_MAP_ITERATOR_PROTOTYPE_TYPE: case JS_MAP_KEY_ITERATOR_TYPE: @@ -1276,6 +1297,7 @@ auto BodyDescriptorApply(InstanceType type, Args&&... args) { case JS_CLASS_CONSTRUCTOR_TYPE: case JS_PROMISE_CONSTRUCTOR_TYPE: case JS_REG_EXP_CONSTRUCTOR_TYPE: + case JS_VALID_ITERATOR_WRAPPER_TYPE: case JS_WRAPPED_FUNCTION_TYPE: case JS_ARRAY_CONSTRUCTOR_TYPE: #define TYPED_ARRAY_CONSTRUCTORS_SWITCH(Type, type, TYPE, Ctype) \ @@ -1311,6 +1333,8 @@ auto BodyDescriptorApply(InstanceType type, Args&&... args) { #if V8_ENABLE_WEBASSEMBLY case WASM_INSTANCE_OBJECT_TYPE: return CALL_APPLY(WasmInstanceObject); + case WASM_NULL_TYPE: + return CALL_APPLY(WasmNull); #endif // V8_ENABLE_WEBASSEMBLY case JS_WEAK_MAP_TYPE: case JS_WEAK_SET_TYPE: @@ -1319,6 +1343,8 @@ auto BodyDescriptorApply(InstanceType type, Args&&... args) { return CALL_APPLY(JSArrayBuffer); case JS_DATA_VIEW_TYPE: return CALL_APPLY(JSDataView); + case JS_RAB_GSAB_DATA_VIEW_TYPE: + return CALL_APPLY(JSRabGsabDataView); case JS_TYPED_ARRAY_TYPE: return CALL_APPLY(JSTypedArray); case JS_EXTERNAL_OBJECT_TYPE: @@ -1336,8 +1362,8 @@ auto BodyDescriptorApply(InstanceType type, Args&&... args) { return CALL_APPLY(Foreign); case MAP_TYPE: return CALL_APPLY(Map); - case CODE_TYPE: - return CALL_APPLY(Code); + case INSTRUCTION_STREAM_TYPE: + return CALL_APPLY(InstructionStream); case CELL_TYPE: return CALL_APPLY(Cell); case PROPERTY_CELL_TYPE: @@ -1354,10 +1380,12 @@ auto BodyDescriptorApply(InstanceType type, Args&&... args) { return CALL_APPLY(SmallOrderedHashTable<SmallOrderedNameDictionary>); case SWISS_NAME_DICTIONARY_TYPE: return CALL_APPLY(SwissNameDictionary); - case CODE_DATA_CONTAINER_TYPE: - return CALL_APPLY(CodeDataContainer); + case CODE_TYPE: + return CALL_APPLY(Code); case PREPARSE_DATA_TYPE: return CALL_APPLY(PreparseData); + case SHARED_FUNCTION_INFO_TYPE: + return CALL_APPLY(SharedFunctionInfo); case HEAP_NUMBER_TYPE: return CALL_APPLY(HeapNumber); case BYTE_ARRAY_TYPE: |