summaryrefslogtreecommitdiff
path: root/deps/v8/src/objects/objects-body-descriptors-inl.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/objects/objects-body-descriptors-inl.h')
-rw-r--r--deps/v8/src/objects/objects-body-descriptors-inl.h130
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: