#ifndef V8_WASM_WASM_OBJECTS_H_
#define V8_WASM_WASM_OBJECTS_H_
#if !V8_ENABLE_WEBASSEMBLY
#error This header should only be included if WebAssembly is enabled.
#endif
#include <memory>
#include <optional>
#include "include/v8-wasm.h"
#include "src/base/bit-field.h"
#include "src/debug/interface-types.h"
#include "src/heap/heap.h"
#include "src/objects/backing-store.h"
#include "src/objects/contexts.h"
#include "src/objects/foreign.h"
#include "src/objects/js-function.h"
#include "src/objects/js-objects.h"
#include "src/objects/objects-body-descriptors.h"
#include "src/objects/objects.h"
#include "src/objects/struct.h"
#include "src/objects/trusted-object.h"
#include "src/wasm/module-instantiate.h"
#include "src/wasm/stacks.h"
#include "src/wasm/struct-types.h"
#include "src/wasm/value-type.h"
#include "src/wasm/wasm-code-manager.h"
#include "src/wasm/wasm-module.h"
#include "src/objects/object-macros.h"
namespace v8 {
namespace internal {
namespace wasm {
class NativeModule;
class WasmCode;
struct WasmFunction;
struct WasmGlobal;
class WasmImportWrapperHandle;
struct WasmModule;
struct WasmTag;
using WasmTagSig = FunctionSig;
class WasmValue;
class WireBytesRef;
}
class BreakPoint;
class JSArrayBuffer;
class SeqOneByteString;
class StructBodyDescriptor;
class WasmCapiFunction;
class WasmDispatchTableForImports;
class WasmExceptionTag;
class WasmExportedFunction;
class WasmExternalFunction;
class WasmTrustedInstanceData;
class WasmJSFunction;
class WasmModuleObject;
enum class SharedFlag : uint8_t;
template <typename CppType>
class Managed;
template <typename CppType>
class TrustedManaged;
#include "torque-generated/src/wasm/wasm-objects-tq.inc"
#define DECL_OPTIONAL_ACCESSORS(name, type) \
DECL_GETTER(has_##name, bool) \
DECL_ACCESSORS(name, type)
class V8_EXPORT_PRIVATE FunctionTargetAndImplicitArg {
public:
FunctionTargetAndImplicitArg(
Isolate* isolate,
DirectHandle<WasmTrustedInstanceData> target_instance_data,
int target_func_index);
DirectHandle<TrustedObject> implicit_arg() { return implicit_arg_; }
WasmCodePointer call_target() { return call_target_; }
#if V8_ENABLE_DRUMBRAKE
int target_func_index() { return target_func_index_; }
#endif
private:
DirectHandle<TrustedObject> implicit_arg_;
WasmCodePointer call_target_;
#if V8_ENABLE_DRUMBRAKE
int target_func_index_;
#endif
};
namespace wasm {
enum class OnResume : int { kContinue, kThrow };
static constexpr int kConstructorFunctionContextSlot =
Context::MIN_CONTEXT_SLOTS;
static constexpr int kConstructorFunctionContextLength =
kConstructorFunctionContextSlot + 1;
static constexpr int kMethodWrapperContextSlot = Context::MIN_CONTEXT_SLOTS;
static constexpr int kMethodWrapperContextLength =
kMethodWrapperContextSlot + 1;
}
class ImportedFunctionEntry {
public:
inline ImportedFunctionEntry(DirectHandle<WasmTrustedInstanceData>,
int index);
void SetWasmToWasm(Tagged<WasmTrustedInstanceData> target_instance_object,
WasmCodePointer call_target,
wasm::CanonicalTypeIndex sig_id
#if V8_ENABLE_DRUMBRAKE
,
int exported_function_index
#endif
);
V8_EXPORT_PRIVATE void SetWasmToWrapper(
Isolate*, DirectHandle<JSReceiver> callable,
std::shared_ptr<wasm::WasmImportWrapperHandle> wrapper_handle,
wasm::Suspend suspend, const wasm::CanonicalSig* sig);
Tagged<JSReceiver> callable();
Tagged<Object> maybe_callable();
Tagged<Object> implicit_arg();
WasmCodePointer target();
#if V8_ENABLE_DRUMBRAKE
int function_index_in_called_module();
#endif
private:
DirectHandle<WasmTrustedInstanceData> const instance_data_;
int const index_;
};
enum InternalizeString : bool { kInternalize = true, kNoInternalize = false };
class WasmModuleObject
: public TorqueGeneratedWasmModuleObject<WasmModuleObject, JSObject> {
public:
inline wasm::NativeModule* native_module() const;
inline const std::shared_ptr<wasm::NativeModule>& shared_native_module()
const;
DECL_PRINTER(WasmModuleObject)
V8_EXPORT_PRIVATE static DirectHandle<WasmModuleObject> New(
Isolate* isolate, std::shared_ptr<wasm::NativeModule> native_module,
DirectHandle<Script> script);
static MaybeDirectHandle<String> GetModuleNameOrNull(
Isolate*, DirectHandle<WasmModuleObject>);
static MaybeDirectHandle<String> GetFunctionNameOrNull(
Isolate*, DirectHandle<WasmModuleObject>, uint32_t func_index);
base::Vector<const uint8_t> GetRawFunctionName(int func_index);
static DirectHandle<String> ExtractUtf8StringFromModuleBytes(
Isolate*, base::Vector<const uint8_t> wire_bytes, wasm::WireBytesRef,
InternalizeString);
TQ_OBJECT_CONSTRUCTORS(WasmModuleObject)
};
#if V8_ENABLE_SANDBOX || DEBUG
bool FunctionSigMatchesTable(wasm::CanonicalTypeIndex sig_id,
wasm::CanonicalValueType table_type);
#endif
class WasmTableObject
: public TorqueGeneratedWasmTableObject<WasmTableObject, JSObject> {
public:
class BodyDescriptor;
inline wasm::ValueType type(const wasm::WasmModule* module);
inline wasm::CanonicalValueType canonical_type(
const wasm::WasmModule* module);
inline wasm::ValueType unsafe_type();
DECL_TRUSTED_POINTER_ACCESSORS(trusted_data, WasmTrustedInstanceData)
DECL_TRUSTED_POINTER_ACCESSORS(trusted_dispatch_table, WasmDispatchTable)
DECL_VERIFIER(WasmTableObject)
V8_EXPORT_PRIVATE static int Grow(Isolate* isolate,
DirectHandle<WasmTableObject> table,
uint32_t count,
DirectHandle<Object> init_value);
V8_EXPORT_PRIVATE static DirectHandle<WasmTableObject> New(
Isolate* isolate, DirectHandle<WasmTrustedInstanceData> trusted_data,
wasm::ValueType type, wasm::CanonicalValueType canonical_type,
uint32_t initial, bool has_maximum, uint64_t maximum,
DirectHandle<Object> initial_value, wasm::AddressType address_type,
DirectHandle<WasmDispatchTable>* out_dispatch_table = nullptr);
inline bool is_in_bounds(uint32_t entry_index);
inline bool is_table64() const;
inline std::optional<uint64_t> maximum_length_u64() const;
static MaybeDirectHandle<Object> JSToWasmElement(
Isolate* isolate, DirectHandle<WasmTableObject> table,
DirectHandle<Object> entry, const char** error_message);
V8_EXPORT_PRIVATE static void Set(Isolate* isolate,
DirectHandle<WasmTableObject> table,
uint32_t index, DirectHandle<Object> entry);
V8_EXPORT_PRIVATE static DirectHandle<Object> Get(
Isolate* isolate, DirectHandle<WasmTableObject> table, uint32_t index);
V8_EXPORT_PRIVATE static void Fill(Isolate* isolate,
DirectHandle<WasmTableObject> table,
uint32_t start, DirectHandle<Object> entry,
uint32_t count);
static void UpdateDispatchTable(
Isolate* isolate, DirectHandle<WasmTableObject> table, int entry_index,
const wasm::WasmFunction* func,
DirectHandle<WasmTrustedInstanceData> target_instance
#if V8_ENABLE_DRUMBRAKE
,
int target_func_index
#endif
);
static void UpdateDispatchTable(Isolate* isolate,
DirectHandle<WasmTableObject> table,
int entry_index,
DirectHandle<WasmJSFunction> function);
static void UpdateDispatchTable(Isolate* isolate,
DirectHandle<WasmTableObject> table,
int entry_index,
DirectHandle<WasmCapiFunction> capi_function);
void ClearDispatchTable(int index);
V8_EXPORT_PRIVATE static void SetFunctionTablePlaceholder(
Isolate* isolate, DirectHandle<WasmTableObject> table, int entry_index,
DirectHandle<WasmTrustedInstanceData> trusted_instance_data,
int func_index);
static void GetFunctionTableEntry(
Isolate* isolate, DirectHandle<WasmTableObject> table, int entry_index,
bool* is_valid, bool* is_null,
MaybeDirectHandle<WasmTrustedInstanceData>* instance_data,
int* function_index,
MaybeDirectHandle<WasmJSFunction>* maybe_js_function);
private:
static void SetFunctionTableEntry(Isolate* isolate,
DirectHandle<WasmTableObject> table,
int entry_index,
DirectHandle<Object> entry);
TQ_OBJECT_CONSTRUCTORS(WasmTableObject)
};
class WasmMemoryMapDescriptor
: public TorqueGeneratedWasmMemoryMapDescriptor<WasmMemoryMapDescriptor,
JSObject> {
public:
V8_EXPORT_PRIVATE static MaybeDirectHandle<WasmMemoryMapDescriptor>
NewFromAnonymous(Isolate* isolate, size_t length);
V8_EXPORT_PRIVATE static DirectHandle<WasmMemoryMapDescriptor>
NewFromFileDescriptor(
Isolate* isolate,
v8::WasmMemoryMapDescriptor::WasmFileDescriptor file_descriptor);
V8_EXPORT_PRIVATE size_t MapDescriptor(DirectHandle<WasmMemoryObject> memory,
size_t offset);
V8_EXPORT_PRIVATE bool UnmapDescriptor();
class BodyDescriptor;
TQ_OBJECT_CONSTRUCTORS(WasmMemoryMapDescriptor)
};
class WasmMemoryObject
: public TorqueGeneratedWasmMemoryObject<WasmMemoryObject, JSObject> {
public:
class BodyDescriptor;
DECL_ACCESSORS(instances, Tagged<WeakArrayList>)
V8_EXPORT_PRIVATE static void UseInInstance(
Isolate* isolate, DirectHandle<WasmMemoryObject> memory,
DirectHandle<WasmTrustedInstanceData> trusted_instance_data,
DirectHandle<WasmTrustedInstanceData> shared_trusted_instance_data,
int memory_index_in_instance);
inline bool has_maximum_pages();
inline bool is_memory64() const;
V8_EXPORT_PRIVATE static DirectHandle<WasmMemoryObject> New(
Isolate* isolate, DirectHandle<JSArrayBuffer> buffer, int maximum,
wasm::AddressType address_type);
V8_EXPORT_PRIVATE static MaybeDirectHandle<WasmMemoryObject> New(
Isolate* isolate, int initial, int maximum, SharedFlag shared,
wasm::AddressType address_type);
void SetNewBuffer(Isolate* isolate, Tagged<JSArrayBuffer> new_buffer);
void UpdateInstances(Isolate* isolate);
void FixUpResizableArrayBuffer(Tagged<JSArrayBuffer> new_buffer);
static DirectHandle<JSArrayBuffer> RefreshBuffer(
Isolate* isolate, DirectHandle<WasmMemoryObject> memory,
std::shared_ptr<BackingStore> new_backing_store);
static DirectHandle<JSArrayBuffer> RefreshSharedBuffer(
Isolate* isolate, DirectHandle<WasmMemoryObject> memory,
DirectHandle<JSArrayBuffer> old_buffer, ResizableFlag resizable_by_js);
V8_EXPORT_PRIVATE static int32_t Grow(Isolate*,
DirectHandle<WasmMemoryObject>,
uint32_t pages);
static DirectHandle<JSArrayBuffer> ToFixedLengthBuffer(
Isolate* isolate, DirectHandle<WasmMemoryObject> memory,
DirectHandle<JSArrayBuffer> old_buffer);
static DirectHandle<JSArrayBuffer> ToResizableBuffer(
Isolate* isolate, DirectHandle<WasmMemoryObject> memory,
DirectHandle<JSArrayBuffer> old_buffer);
static constexpr int kNoMaximum = -1;
TQ_OBJECT_CONSTRUCTORS(WasmMemoryObject)
};
class WasmGlobalObject
: public TorqueGeneratedWasmGlobalObject<WasmGlobalObject, JSObject> {
public:
class BodyDescriptor;
DECL_ACCESSORS(untagged_buffer, Tagged<JSArrayBuffer>)
DECL_ACCESSORS(tagged_buffer, Tagged<FixedArray>)
DECL_PRIMITIVE_ACCESSORS(type, wasm::ValueType)
DECL_TRUSTED_POINTER_ACCESSORS(trusted_data, WasmTrustedInstanceData)
DECL_PRINTER(WasmGlobalObject)
V8_EXPORT_PRIVATE static MaybeDirectHandle<WasmGlobalObject> New(
Isolate* isolate, DirectHandle<WasmTrustedInstanceData> instance_object,
MaybeDirectHandle<JSArrayBuffer> maybe_untagged_buffer,
MaybeDirectHandle<FixedArray> maybe_tagged_buffer, wasm::ValueType type,
int32_t offset, bool is_mutable);
inline int type_size() const;
inline int32_t GetI32();
inline int64_t GetI64();
inline float GetF32();
inline double GetF64();
inline uint8_t* GetS128RawBytes();
inline DirectHandle<Object> GetRef();
inline void SetI32(int32_t value);
inline void SetI64(int64_t value);
inline void SetF32(float value);
inline void SetF64(double value);
inline void SetRef(DirectHandle<Object> value);
private:
inline Address address() const;
TQ_OBJECT_CONSTRUCTORS(WasmGlobalObject)
};
class FeedbackConstants {
public:
static constexpr int kHeaderSlots = 1;
static constexpr int kSlotsPerInstruction = 2;
};
class V8_EXPORT_PRIVATE WasmTrustedInstanceData : public ExposedTrustedObject {
public:
DECL_OPTIONAL_ACCESSORS(instance_object, Tagged<WasmInstanceObject>)
DECL_OPTIONAL_ACCESSORS(native_context, Tagged<Context>)
DECL_ACCESSORS(memory_objects, Tagged<FixedArray>)
#if V8_ENABLE_DRUMBRAKE
DECL_OPTIONAL_ACCESSORS(interpreter_object, Tagged<Tuple2>)
#endif
DECL_OPTIONAL_ACCESSORS(untagged_globals_buffer, Tagged<JSArrayBuffer>)
DECL_OPTIONAL_ACCESSORS(tagged_globals_buffer, Tagged<FixedArray>)
DECL_OPTIONAL_ACCESSORS(imported_mutable_globals_buffers, Tagged<FixedArray>)
DECL_OPTIONAL_ACCESSORS(tables, Tagged<FixedArray>)
DECL_PROTECTED_POINTER_ACCESSORS(dispatch_table_for_imports,
WasmDispatchTableForImports)
DECL_ACCESSORS(imported_mutable_globals, Tagged<FixedAddressArray>)
#if V8_ENABLE_DRUMBRAKE
DECL_ACCESSORS(imported_function_indices, Tagged<FixedInt32Array>)
#endif
DECL_PROTECTED_POINTER_ACCESSORS(shared_part, WasmTrustedInstanceData)
DECL_PROTECTED_POINTER_ACCESSORS(dispatch_table0, WasmDispatchTable)
DECL_PROTECTED_POINTER_ACCESSORS(dispatch_tables, ProtectedFixedArray)
DECL_OPTIONAL_ACCESSORS(tags_table, Tagged<FixedArray>)
DECL_ACCESSORS(func_refs, Tagged<FixedArray>)
DECL_ACCESSORS(managed_object_maps, Tagged<FixedArray>)
DECL_ACCESSORS(feedback_vectors, Tagged<FixedArray>)
DECL_ACCESSORS(well_known_imports, Tagged<FixedArray>)
DECL_PRIMITIVE_ACCESSORS(memory0_start, uint8_t*)
DECL_PRIMITIVE_ACCESSORS(memory0_size, size_t)
DECL_PROTECTED_POINTER_ACCESSORS(managed_native_module,
TrustedManaged<wasm::NativeModule>)
DECL_PRIMITIVE_ACCESSORS(globals_start, uint8_t*)
DECL_PRIMITIVE_ACCESSORS(jump_table_start, Address)
DECL_PRIMITIVE_ACCESSORS(hook_on_function_call_address, Address)
DECL_PRIMITIVE_ACCESSORS(tiering_budget_array, std::atomic<uint32_t>*)
DECL_PROTECTED_POINTER_ACCESSORS(memory_bases_and_sizes,
TrustedFixedAddressArray)
DECL_ACCESSORS(data_segment_starts, Tagged<FixedAddressArray>)
DECL_ACCESSORS(data_segment_sizes, Tagged<FixedUInt32Array>)
DECL_ACCESSORS(element_segments, Tagged<FixedArray>)
DECL_PRIMITIVE_ACCESSORS(break_on_entry, uint8_t)
inline void clear_padding();
inline Tagged<WasmMemoryObject> memory_object(int memory_index) const;
inline uint8_t* memory_base(int memory_index) const;
inline size_t memory_size(int memory_index) const;
inline wasm::NativeModule* native_module() const;
inline Tagged<WasmModuleObject> module_object() const;
inline const wasm::WasmModule* module() const;
DECL_PRINTER(WasmTrustedInstanceData)
DECL_VERIFIER(WasmTrustedInstanceData)
#define FIELD_LIST(V) \
\
\
V(kProtectedDispatchTable0Offset, kTaggedSize) \
V(kProtectedDispatchTableForImportsOffset, kTaggedSize) \
V(kImportedMutableGlobalsOffset, kTaggedSize) \
IF_WASM_DRUMBRAKE(V, kImportedFunctionIndicesOffset, kTaggedSize) \
\
V(kOptionalPaddingOffset, POINTER_SIZE_PADDING(kOptionalPaddingOffset)) \
V(kMemory0StartOffset, kSystemPointerSize) \
V(kMemory0SizeOffset, kSizetSize) \
V(kGlobalsStartOffset, kSystemPointerSize) \
V(kJumpTableStartOffset, kSystemPointerSize) \
\
\
V(kHookOnFunctionCallAddressOffset, kSystemPointerSize) \
V(kTieringBudgetArrayOffset, kSystemPointerSize) \
\
V(kProtectedMemoryBasesAndSizesOffset, kTaggedSize) \
V(kDataSegmentStartsOffset, kTaggedSize) \
V(kDataSegmentSizesOffset, kTaggedSize) \
V(kElementSegmentsOffset, kTaggedSize) \
V(kInstanceObjectOffset, kTaggedSize) \
V(kNativeContextOffset, kTaggedSize) \
V(kProtectedSharedPartOffset, kTaggedSize) \
V(kMemoryObjectsOffset, kTaggedSize) \
V(kUntaggedGlobalsBufferOffset, kTaggedSize) \
V(kTaggedGlobalsBufferOffset, kTaggedSize) \
V(kImportedMutableGlobalsBuffersOffset, kTaggedSize) \
IF_WASM_DRUMBRAKE(V, kInterpreterObjectOffset, kTaggedSize) \
V(kTablesOffset, kTaggedSize) \
V(kProtectedDispatchTablesOffset, kTaggedSize) \
V(kTagsTableOffset, kTaggedSize) \
V(kFuncRefsOffset, kTaggedSize) \
V(kManagedObjectMapsOffset, kTaggedSize) \
V(kFeedbackVectorsOffset, kTaggedSize) \
V(kWellKnownImportsOffset, kTaggedSize) \
V(kProtectedManagedNativeModuleOffset, kTaggedSize) \
V(kBreakOnEntryOffset, kUInt8Size) \
\
V(kHeaderPaddingOffset, POINTER_SIZE_PADDING(kHeaderPaddingOffset)) \
V(kHeaderSize, 0) \
V(kSize, 0)
DEFINE_FIELD_OFFSET_CONSTANTS(ExposedTrustedObject::kHeaderSize, FIELD_LIST)
static_assert(IsAligned(kHeaderSize, kTaggedSize));
#define ASSERT_FIELD_ALIGNED(offset, size) \
static_assert(size == 0 || IsAligned(offset, size) || \
(COMPRESS_POINTERS_BOOL && (size == kSystemPointerSize) && \
IsAligned(offset, kTaggedSize)));
FIELD_LIST(ASSERT_FIELD_ALIGNED)
#undef ASSERT_FIELD_ALIGNED
#undef FIELD_LIST
#define WASM_TAGGED_INSTANCE_DATA_FIELDS(V) \
V(kInstanceObjectOffset, "instance_object") \
V(kNativeContextOffset, "native_context") \
V(kMemoryObjectsOffset, "memory_objects") \
V(kUntaggedGlobalsBufferOffset, "untagged_globals_buffer") \
V(kTaggedGlobalsBufferOffset, "tagged_globals_buffer") \
V(kImportedMutableGlobalsBuffersOffset, "imported_mutable_globals_buffers") \
IF_WASM_DRUMBRAKE(V, kInterpreterObjectOffset, "interpreter_object") \
V(kTablesOffset, "tables") \
V(kTagsTableOffset, "tags_table") \
V(kFuncRefsOffset, "func_refs") \
V(kManagedObjectMapsOffset, "managed_object_maps") \
V(kFeedbackVectorsOffset, "feedback_vectors") \
V(kWellKnownImportsOffset, "well_known_imports") \
V(kImportedMutableGlobalsOffset, "imported_mutable_globals") \
IF_WASM_DRUMBRAKE(V, kImportedFunctionIndicesOffset, \
"imported_function_indices") \
V(kDataSegmentStartsOffset, "data_segment_starts") \
V(kDataSegmentSizesOffset, "data_segment_sizes") \
V(kElementSegmentsOffset, "element_segments")
#define WASM_PROTECTED_INSTANCE_DATA_FIELDS(V) \
V(kProtectedSharedPartOffset, "shared_part") \
V(kProtectedMemoryBasesAndSizesOffset, "memory_bases_and_sizes") \
V(kProtectedDispatchTable0Offset, "dispatch_table0") \
V(kProtectedDispatchTablesOffset, "dispatch_tables") \
V(kProtectedDispatchTableForImportsOffset, "dispatch_table_for_imports") \
V(kProtectedManagedNativeModuleOffset, "managed_native_module")
#define WASM_INSTANCE_FIELD_OFFSET(offset, _) offset,
#define WASM_INSTANCE_FIELD_NAME(_, name) name,
#if V8_ENABLE_DRUMBRAKE
static constexpr size_t kWasmInterpreterAdditionalFields = 2;
#else
static constexpr size_t kWasmInterpreterAdditionalFields = 0;
#endif
static constexpr size_t kTaggedFieldsCount =
16 + kWasmInterpreterAdditionalFields;
static constexpr std::array<uint16_t, kTaggedFieldsCount>
kTaggedFieldOffsets = {
WASM_TAGGED_INSTANCE_DATA_FIELDS(WASM_INSTANCE_FIELD_OFFSET)};
static constexpr std::array<const char*, kTaggedFieldsCount>
kTaggedFieldNames = {
WASM_TAGGED_INSTANCE_DATA_FIELDS(WASM_INSTANCE_FIELD_NAME)};
static constexpr std::array<uint16_t, 6> kProtectedFieldOffsets = {
WASM_PROTECTED_INSTANCE_DATA_FIELDS(WASM_INSTANCE_FIELD_OFFSET)};
static constexpr std::array<const char*, 6> kProtectedFieldNames = {
WASM_PROTECTED_INSTANCE_DATA_FIELDS(WASM_INSTANCE_FIELD_NAME)};
#undef WASM_INSTANCE_FIELD_OFFSET
#undef WASM_INSTANCE_FIELD_NAME
#undef WASM_TAGGED_INSTANCE_DATA_FIELDS
#undef WASM_PROTECTED_INSTANCE_DATA_FIELDS
static_assert(kTaggedFieldOffsets.size() == kTaggedFieldNames.size(),
"every tagged field offset needs a name");
static_assert(kProtectedFieldOffsets.size() == kProtectedFieldNames.size(),
"every protected field offset needs a name");
void SetRawMemory(int memory_index, uint8_t* mem_start, size_t mem_size);
#if V8_ENABLE_DRUMBRAKE
static DirectHandle<Tuple2> GetOrCreateInterpreterObject(
DirectHandle<WasmInstanceObject>);
static DirectHandle<Tuple2> GetInterpreterObject(
DirectHandle<WasmInstanceObject>);
#endif
static DirectHandle<WasmTrustedInstanceData> New(
Isolate*, DirectHandle<WasmModuleObject>,
std::shared_ptr<wasm::NativeModule>, bool shared);
WasmCodePointer GetCallTarget(uint32_t func_index);
inline Tagged<WasmDispatchTable> dispatch_table(uint32_t table_index);
inline bool has_dispatch_table(uint32_t table_index);
static bool CopyTableEntries(
Isolate* isolate,
DirectHandle<WasmTrustedInstanceData> trusted_instance_data,
uint32_t table_dst_index, uint32_t table_src_index, uint32_t dst,
uint32_t src, uint32_t count) V8_WARN_UNUSED_RESULT;
static std::optional<MessageTemplate> InitTableEntries(
Isolate* isolate,
DirectHandle<WasmTrustedInstanceData> trusted_instance_data,
DirectHandle<WasmTrustedInstanceData> shared_trusted_instance_data,
uint32_t table_index, uint32_t segment_index, uint32_t dst, uint32_t src,
uint32_t count) V8_WARN_UNUSED_RESULT;
class BodyDescriptor;
bool try_get_func_ref(int index, Tagged<WasmFuncRef>* result);
static DirectHandle<WasmFuncRef> GetOrCreateFuncRef(
Isolate* isolate,
DirectHandle<WasmTrustedInstanceData> trusted_instance_data,
int function_index,
wasm::PrecreateExternal precreate_external = wasm::kOnlyInternalFunction);
uint8_t* GetGlobalStorage(const wasm::WasmGlobal&);
std::pair<Tagged<FixedArray>, uint32_t> GetGlobalBufferAndIndex(
const wasm::WasmGlobal&);
wasm::WasmValue GetGlobalValue(Isolate*, const wasm::WasmGlobal&);
OBJECT_CONSTRUCTORS(WasmTrustedInstanceData, ExposedTrustedObject);
private:
void InitDataSegmentArrays(const wasm::NativeModule*);
};
class WasmInstanceObject
: public TorqueGeneratedWasmInstanceObject<WasmInstanceObject, JSObject> {
public:
DECL_TRUSTED_POINTER_ACCESSORS(trusted_data, WasmTrustedInstanceData)
inline const wasm::WasmModule* module() const;
class BodyDescriptor;
DECL_PRINTER(WasmInstanceObject)
TQ_OBJECT_CONSTRUCTORS(WasmInstanceObject)
};
class WasmTagObject
: public TorqueGeneratedWasmTagObject<WasmTagObject, JSObject> {
public:
class BodyDescriptor;
bool MatchesSignature(wasm::CanonicalTypeIndex expected_index);
static DirectHandle<WasmTagObject> New(
Isolate* isolate, const wasm::FunctionSig* sig,
wasm::CanonicalTypeIndex type_index, DirectHandle<HeapObject> tag,
DirectHandle<WasmTrustedInstanceData> instance);
DECL_TRUSTED_POINTER_ACCESSORS(trusted_data, WasmTrustedInstanceData)
TQ_OBJECT_CONSTRUCTORS(WasmTagObject)
};
class WasmDispatchTableData {
public:
V8_EXPORT_PRIVATE
std::optional<std::shared_ptr<wasm::WasmImportWrapperHandle>>
MaybeGetWrapperHandle(int index) const;
#ifdef DEBUG
WasmCodePointer WrapperCodePointerForDebugging(int index);
#endif
void Add(int index,
std::shared_ptr<wasm::WasmImportWrapperHandle> wrapper_handle);
void Remove(int index);
private:
friend class WasmDispatchTable;
std::unordered_map<int, std::shared_ptr<wasm::WasmImportWrapperHandle>>
wrappers_;
};
class WasmDispatchTable : public ExposedTrustedObject {
public:
#if V8_ENABLE_DRUMBRAKE
static const uint32_t kInvalidFunctionIndex = UINT_MAX;
#endif
enum NewOrExistingEntry : bool { kNewEntry, kExistingEntry };
class BodyDescriptor;
static constexpr size_t kLengthOffset = kHeaderSize;
static constexpr size_t kCapacityOffset = kLengthOffset + kUInt32Size;
static constexpr size_t kProtectedOffheapDataOffset =
kCapacityOffset + kUInt32Size;
static constexpr size_t kProtectedUsesOffset =
kProtectedOffheapDataOffset + kTaggedSize;
static constexpr size_t kTableTypeOffset = kProtectedUsesOffset + kTaggedSize;
static constexpr size_t kPaddingSize = TAGGED_SIZE_8_BYTES ? kUInt32Size : 0;
static constexpr size_t kEntriesOffset =
kTableTypeOffset + kUInt32Size + kPaddingSize;
#if V8_ENABLE_DRUMBRAKE
#endif
static constexpr size_t kTargetBias = 0;
#if V8_ENABLE_DRUMBRAKE
static constexpr size_t kFunctionIndexBias = kTargetBias;
#endif
static_assert(sizeof(WasmCodePointer) == kUInt32Size);
static constexpr size_t kSigBias = kTargetBias + kUInt32Size;
static constexpr size_t kImplicitArgBias = kSigBias + kUInt32Size;
static constexpr size_t kEntrySize = kImplicitArgBias + kTaggedSize;
static_assert(IsAligned(kProtectedOffheapDataOffset, kTaggedSize));
static_assert(IsAligned(kEntriesOffset, kTaggedSize));
static_assert(IsAligned(kEntrySize, kTaggedSize));
static_assert(IsAligned(kImplicitArgBias, kTaggedSize));
static constexpr int kMaxLength = (kMaxInt - kEntriesOffset) / kEntrySize;
static constexpr int SizeFor(int length) {
DCHECK_LE(length, kMaxLength);
return kEntriesOffset + length * kEntrySize;
}
static constexpr int OffsetOf(int index) {
DCHECK_LT(index, kMaxLength);
return SizeFor(index);
}
inline int length() const;
inline int length(AcquireLoadTag) const;
inline int capacity() const;
DECL_PROTECTED_POINTER_ACCESSORS(protected_offheap_data,
TrustedManaged<WasmDispatchTableData>)
inline WasmDispatchTableData* offheap_data() const;
DECL_PROTECTED_POINTER_ACCESSORS(protected_uses, ProtectedWeakFixedArray)
DECL_PRIMITIVE_ACCESSORS(table_type, wasm::CanonicalValueType)
inline Tagged<Object> implicit_arg(int index) const;
inline WasmCodePointer target(int index) const;
inline wasm::CanonicalTypeIndex sig(int index) const;
void V8_EXPORT_PRIVATE SetForNonWrapper(
int index, Tagged<Union<Smi, WasmTrustedInstanceData>> implicit_arg,
WasmCodePointer call_target, wasm::CanonicalTypeIndex sig_id,
#if V8_ENABLE_DRUMBRAKE
uint32_t function_index,
#endif
NewOrExistingEntry new_or_existing);
void V8_EXPORT_PRIVATE
SetForWrapper(int index, Tagged<WasmImportData> implicit_arg,
std::shared_ptr<wasm::WasmImportWrapperHandle> wrapper_handle,
wasm::CanonicalTypeIndex sig_id,
#if V8_ENABLE_DRUMBRAKE
uint32_t function_index,
#endif
NewOrExistingEntry new_or_existing);
#if V8_ENABLE_DRUMBRAKE
inline uint32_t function_index(int index) const;
#endif
void Clear(int index, NewOrExistingEntry new_or_existing);
std::optional<std::shared_ptr<wasm::WasmImportWrapperHandle>>
MaybeGetWrapperHandle(int index);
static void V8_EXPORT_PRIVATE
AddUse(Isolate* isolate, DirectHandle<WasmDispatchTable> dispatch_table,
DirectHandle<WasmTrustedInstanceData> instance, int table_index);
static Tagged<ProtectedWeakFixedArray> MaybeGrowUsesList(
Isolate* isolate, DirectHandle<WasmDispatchTable> dispatch_table);
static V8_WARN_UNUSED_RESULT DirectHandle<WasmDispatchTable> Grow(
Isolate*, DirectHandle<WasmDispatchTable>, uint32_t new_length);
DECL_PRINTER(WasmDispatchTable)
DECL_VERIFIER(WasmDispatchTable)
OBJECT_CONSTRUCTORS(WasmDispatchTable, ExposedTrustedObject);
};
class WasmDispatchTableForImports : public TrustedObject {
public:
class BodyDescriptor;
static constexpr size_t kLengthOffset = kHeaderSize;
static constexpr size_t kPaddingSize = TAGGED_SIZE_8_BYTES ? kUInt32Size : 0;
static constexpr size_t kProtectedOffheapDataOffset =
kLengthOffset + kUInt32Size + kPaddingSize;
static constexpr size_t kEntriesOffset =
kProtectedOffheapDataOffset + kTaggedSize;
#if V8_ENABLE_DRUMBRAKE
#endif
static constexpr size_t kTargetBias = 0;
#if V8_ENABLE_DRUMBRAKE
static constexpr size_t kFunctionIndexBias = kTargetBias;
#endif
static constexpr size_t kEntryPaddingSize =
TAGGED_SIZE_8_BYTES ? kUInt32Size : 0;
static_assert(sizeof(WasmCodePointer) == kUInt32Size);
static constexpr size_t kImplicitArgBias =
kTargetBias + kEntryPaddingSize + kUInt32Size;
static constexpr size_t kEntrySize = kImplicitArgBias + kTaggedSize;
static_assert(IsAligned(kProtectedOffheapDataOffset, kTaggedSize));
static_assert(IsAligned(kEntriesOffset, kTaggedSize));
static_assert(IsAligned(kEntrySize, kTaggedSize));
static_assert(IsAligned(kImplicitArgBias, kTaggedSize));
static constexpr int kMaxLength = (kMaxInt - kEntriesOffset) / kEntrySize;
static constexpr int SizeFor(int length) {
DCHECK_LE(length, kMaxLength);
return kEntriesOffset + length * kEntrySize;
}
static constexpr int OffsetOf(int index) {
DCHECK_LT(index, kMaxLength);
return SizeFor(index);
}
inline int length() const;
inline int length(AcquireLoadTag) const;
DECL_PROTECTED_POINTER_ACCESSORS(protected_offheap_data,
TrustedManaged<WasmDispatchTableData>)
inline WasmDispatchTableData* offheap_data() const;
inline Tagged<Object> implicit_arg(int index) const;
inline WasmCodePointer target(int index) const;
void V8_EXPORT_PRIVATE SetForNonWrapper(
int index, Tagged<Union<Smi, WasmTrustedInstanceData>> implicit_arg,
WasmCodePointer call_target, wasm::CanonicalTypeIndex sig_id,
#if V8_ENABLE_DRUMBRAKE
uint32_t function_index,
#endif
WasmDispatchTable::NewOrExistingEntry new_or_existing);
void SetForWrapper(
int index, Tagged<WasmImportData> implicit_arg,
std::shared_ptr<wasm::WasmImportWrapperHandle> wrapper_handle,
wasm::CanonicalTypeIndex sig_id,
#if V8_ENABLE_DRUMBRAKE
uint32_t function_index,
#endif
WasmDispatchTable::NewOrExistingEntry new_or_existing);
void Clear(int index, WasmDispatchTable::NewOrExistingEntry new_or_existing);
V8_EXPORT_PRIVATE
std::optional<std::shared_ptr<wasm::WasmImportWrapperHandle>>
MaybeGetWrapperHandle(int index);
DECL_PRINTER(WasmDispatchTableForImports)
DECL_VERIFIER(WasmDispatchTableForImports)
OBJECT_CONSTRUCTORS(WasmDispatchTableForImports, TrustedObject);
};
class V8_EXPORT_PRIVATE WasmExceptionPackage : public JSObject {
public:
static DirectHandle<WasmExceptionPackage> New(
Isolate* isolate, DirectHandle<WasmExceptionTag> exception_tag,
int encoded_size);
static DirectHandle<WasmExceptionPackage> New(
Isolate* isolate, DirectHandle<WasmExceptionTag> exception_tag,
DirectHandle<FixedArray> values);
static DirectHandle<Object> GetExceptionTag(
Isolate* isolate, DirectHandle<WasmExceptionPackage> exception_package);
static DirectHandle<Object> GetExceptionValues(
Isolate* isolate, DirectHandle<WasmExceptionPackage> exception_package);
static uint32_t GetEncodedSize(const wasm::WasmTagSig* tag);
static uint32_t GetEncodedSize(const wasm::WasmTag* tag);
enum { kTagIndex, kValuesIndex, kInObjectFieldCount };
static constexpr int kSize =
kHeaderSize + (kTaggedSize * kInObjectFieldCount);
DECL_PRINTER(WasmExceptionPackage)
DECL_VERIFIER(WasmExceptionPackage)
OBJECT_CONSTRUCTORS(WasmExceptionPackage, JSObject);
};
void V8_EXPORT_PRIVATE
EncodeI32ExceptionValue(DirectHandle<FixedArray> encoded_values,
uint32_t* encoded_index, uint32_t value);
void V8_EXPORT_PRIVATE
EncodeI64ExceptionValue(DirectHandle<FixedArray> encoded_values,
uint32_t* encoded_index, uint64_t value);
void V8_EXPORT_PRIVATE
DecodeI32ExceptionValue(DirectHandle<FixedArray> encoded_values,
uint32_t* encoded_index, uint32_t* value);
void V8_EXPORT_PRIVATE
DecodeI64ExceptionValue(DirectHandle<FixedArray> encoded_values,
uint32_t* encoded_index, uint64_t* value);
bool UseGenericWasmToJSWrapper(wasm::ImportCallKind kind,
const wasm::CanonicalSig* sig,
wasm::Suspend suspend);
class WasmExportedFunction : public JSFunction {
public:
V8_EXPORT_PRIVATE static bool IsWasmExportedFunction(Tagged<Object> object);
V8_EXPORT_PRIVATE static DirectHandle<WasmExportedFunction> New(
Isolate* isolate, DirectHandle<WasmTrustedInstanceData> instance_data,
DirectHandle<WasmFuncRef> func_ref,
DirectHandle<WasmInternalFunction> internal_function, int arity,
DirectHandle<Code> export_wrapper);
static DirectHandle<WasmExportedFunction> New(
Isolate* isolate, DirectHandle<WasmTrustedInstanceData> instance_data,
DirectHandle<WasmFuncRef> func_ref,
DirectHandle<WasmInternalFunction> internal_function, int arity,
DirectHandle<Code> export_wrapper, wasm::ModuleOrigin origin,
int func_index, wasm::Promise promise);
static void MarkAsReceiverIsFirstParam(
Isolate* isolate, DirectHandle<WasmExportedFunction> exported_function);
static DirectHandle<Code> GetWrapper(Isolate* isolate,
const wasm::CanonicalSig* sig,
bool receiver_is_first_param,
wasm::ModuleOrigin origin);
static std::unique_ptr<char[]> GetDebugName(const wasm::CanonicalSig* sig);
OBJECT_CONSTRUCTORS(WasmExportedFunction, JSFunction);
};
class WasmJSFunction : public JSFunction {
public:
static bool IsWasmJSFunction(Tagged<Object> object);
static DirectHandle<WasmJSFunction> New(Isolate* isolate,
const wasm::FunctionSig* sig,
DirectHandle<JSReceiver> callable,
wasm::Suspend suspend);
OBJECT_CONSTRUCTORS(WasmJSFunction, JSFunction);
};
class WasmCapiFunction : public JSFunction {
public:
static bool IsWasmCapiFunction(Tagged<Object> object);
static DirectHandle<WasmCapiFunction> New(Isolate* isolate,
Address call_target,
DirectHandle<Foreign> embedder_data,
const wasm::CanonicalSig* sig);
const wasm::CanonicalSig* sig() const;
bool MatchesSignature(
wasm::CanonicalTypeIndex other_canonical_sig_index) const;
OBJECT_CONSTRUCTORS(WasmCapiFunction, JSFunction);
};
class WasmExternalFunction : public JSFunction {
public:
static bool IsWasmExternalFunction(Tagged<Object> object);
inline Tagged<WasmFuncRef> func_ref() const;
OBJECT_CONSTRUCTORS(WasmExternalFunction, JSFunction);
};
class WasmFunctionData
: public TorqueGeneratedWasmFunctionData<WasmFunctionData,
ExposedTrustedObject> {
public:
DECL_CODE_POINTER_ACCESSORS(wrapper_code)
DECL_PROTECTED_POINTER_ACCESSORS(internal, WasmInternalFunction)
DECL_PRINTER(WasmFunctionData)
using BodyDescriptor = StackedBodyDescriptor<
FixedExposedTrustedObjectBodyDescriptor<
WasmFunctionData, kWasmFunctionDataIndirectPointerTag>,
WithStrongCodePointer<kWrapperCodeOffset>,
WithProtectedPointer<kProtectedInternalOffset>>;
using SuspendField = base::BitField<wasm::Suspend, 0, 1>;
using PromiseField = SuspendField::Next<wasm::Promise, 1>;
TQ_OBJECT_CONSTRUCTORS(WasmFunctionData)
};
class WasmExportedFunctionData
: public TorqueGeneratedWasmExportedFunctionData<WasmExportedFunctionData,
WasmFunctionData> {
public:
DECL_PROTECTED_POINTER_ACCESSORS(instance_data, WasmTrustedInstanceData)
DECL_CODE_POINTER_ACCESSORS(c_wrapper_code)
inline bool is_promising() const;
DECL_PRINTER(WasmExportedFunctionData)
DECL_VERIFIER(WasmExportedFunctionData)
using BodyDescriptor = StackedBodyDescriptor<
SubclassBodyDescriptor<WasmFunctionData::BodyDescriptor,
FixedBodyDescriptorFor<WasmExportedFunctionData>>,
WithProtectedPointer<kProtectedInstanceDataOffset>,
WithStrongCodePointer<kCWrapperCodeOffset>>;
TQ_OBJECT_CONSTRUCTORS(WasmExportedFunctionData)
};
class WasmImportData
: public TorqueGeneratedWasmImportData<WasmImportData, TrustedObject> {
public:
DECL_PRINTER(WasmImportData)
DECL_PROTECTED_POINTER_ACCESSORS(instance_data, WasmTrustedInstanceData)
DECL_PROTECTED_POINTER_ACCESSORS(call_origin, TrustedObject)
DECL_PRIMITIVE_ACCESSORS(suspend, wasm::Suspend)
DECL_PRIMITIVE_ACCESSORS(table_slot, uint32_t)
static constexpr int kInvalidCallOrigin = 0;
void SetIndexInTableAsCallOrigin(Tagged<WasmDispatchTable> table,
int entry_index);
void SetIndexInTableAsCallOrigin(Tagged<WasmDispatchTableForImports> table,
int entry_index);
void SetFuncRefAsCallOrigin(Tagged<WasmInternalFunction> func);
using BodyDescriptor =
StackedBodyDescriptor<FixedBodyDescriptorFor<WasmImportData>,
WithProtectedPointer<kProtectedInstanceDataOffset>,
WithProtectedPointer<kProtectedCallOriginOffset>>;
using SuspendField = base::BitField<wasm::Suspend, 0, 1>;
static constexpr int kTableSlotBits = 24;
static_assert(wasm::kV8MaxWasmTableSize < (1u << kTableSlotBits));
using TableSlotField = SuspendField::Next<uint32_t, kTableSlotBits>;
TQ_OBJECT_CONSTRUCTORS(WasmImportData)
};
class WasmInternalFunction
: public TorqueGeneratedWasmInternalFunction<WasmInternalFunction,
ExposedTrustedObject> {
public:
bool try_get_external(Tagged<JSFunction>* result);
V8_EXPORT_PRIVATE static DirectHandle<JSFunction> GetOrCreateExternal(
DirectHandle<WasmInternalFunction> internal);
DECL_PROTECTED_POINTER_ACCESSORS(implicit_arg, TrustedObject)
V8_INLINE WasmCodePointer call_target();
V8_INLINE void set_call_target(WasmCodePointer code_pointer);
DECL_PRINTER(WasmInternalFunction)
using BodyDescriptor = StackedBodyDescriptor<
FixedExposedTrustedObjectBodyDescriptor<
WasmInternalFunction, kWasmInternalFunctionIndirectPointerTag>,
WithProtectedPointer<kProtectedImplicitArgOffset>>;
TQ_OBJECT_CONSTRUCTORS(WasmInternalFunction)
};
class WasmFuncRef : public TorqueGeneratedWasmFuncRef<WasmFuncRef, HeapObject> {
public:
DECL_TRUSTED_POINTER_ACCESSORS(internal, WasmInternalFunction)
DECL_PRINTER(WasmFuncRef)
using BodyDescriptor = StackedBodyDescriptor<
FixedBodyDescriptorFor<WasmFuncRef>,
WithStrongTrustedPointer<kTrustedInternalOffset,
kWasmInternalFunctionIndirectPointerTag>>;
TQ_OBJECT_CONSTRUCTORS(WasmFuncRef)
};
class WasmJSFunctionData
: public TorqueGeneratedWasmJSFunctionData<WasmJSFunctionData,
WasmFunctionData> {
public:
class OffheapData {
public:
explicit OffheapData(
std::shared_ptr<wasm::WasmImportWrapperHandle> wrapper_handle)
: wrapper_handle_(wrapper_handle) {}
std::shared_ptr<wasm::WasmImportWrapperHandle> wrapper_handle() const {
return wrapper_handle_;
}
private:
const std::shared_ptr<wasm::WasmImportWrapperHandle> wrapper_handle_;
};
DECL_PROTECTED_POINTER_ACCESSORS(protected_offheap_data,
TrustedManaged<OffheapData>)
inline OffheapData* offheap_data() const;
Tagged<JSReceiver> GetCallable() const;
wasm::Suspend GetSuspend() const;
bool MatchesSignature(
wasm::CanonicalTypeIndex other_canonical_sig_index) const;
DECL_PRINTER(WasmJSFunctionData)
using BodyDescriptor = StackedBodyDescriptor<
SubclassBodyDescriptor<WasmFunctionData::BodyDescriptor,
FixedBodyDescriptorFor<WasmJSFunctionData>>,
WithProtectedPointer<kProtectedOffheapDataOffset>>;
private:
TQ_OBJECT_CONSTRUCTORS(WasmJSFunctionData)
};
class WasmCapiFunctionData
: public TorqueGeneratedWasmCapiFunctionData<WasmCapiFunctionData,
WasmFunctionData> {
public:
DECL_PRINTER(WasmCapiFunctionData)
using BodyDescriptor =
SubclassBodyDescriptor<WasmFunctionData::BodyDescriptor,
FixedBodyDescriptorFor<WasmCapiFunctionData>>;
TQ_OBJECT_CONSTRUCTORS(WasmCapiFunctionData)
};
class WasmResumeData
: public TorqueGeneratedWasmResumeData<WasmResumeData, HeapObject> {
public:
using BodyDescriptor = StackedBodyDescriptor<
FlexibleBodyDescriptor<WasmResumeData::kStartOfStrongFieldsOffset>,
WithStrongTrustedPointer<kTrustedSuspenderOffset,
kWasmSuspenderIndirectPointerTag>>;
DECL_PRINTER(WasmResumeData)
DECL_TRUSTED_POINTER_ACCESSORS(trusted_suspender, WasmSuspenderObject)
TQ_OBJECT_CONSTRUCTORS(WasmResumeData)
};
class WasmScript : public AllStatic {
public:
static constexpr int kOnEntryBreakpointPosition = -1;
V8_EXPORT_PRIVATE static bool SetBreakPoint(
DirectHandle<Script>, int* position,
DirectHandle<BreakPoint> break_point);
V8_EXPORT_PRIVATE static void SetInstrumentationBreakpoint(
DirectHandle<Script>, DirectHandle<BreakPoint> break_point);
V8_EXPORT_PRIVATE static bool SetBreakPointOnFirstBreakableForFunction(
DirectHandle<Script>, int function_index,
DirectHandle<BreakPoint> break_point);
V8_EXPORT_PRIVATE static bool SetBreakPointForFunction(
DirectHandle<Script>, int function_index, int breakable_offset,
DirectHandle<BreakPoint> break_point);
V8_EXPORT_PRIVATE static bool ClearBreakPoint(
DirectHandle<Script>, int position, DirectHandle<BreakPoint> break_point);
V8_EXPORT_PRIVATE static bool ClearBreakPointById(DirectHandle<Script>,
int breakpoint_id);
static void ClearAllBreakpoints(Tagged<Script>);
V8_EXPORT_PRIVATE static bool GetPossibleBreakpoints(
wasm::NativeModule* native_module, const debug::Location& start,
const debug::Location& end, std::vector<debug::BreakLocation>* locations);
static MaybeDirectHandle<FixedArray> CheckBreakPoints(
Isolate*, DirectHandle<Script>, int position,
StackFrameId stack_frame_id);
private:
static void AddBreakpointToInfo(DirectHandle<Script>, int position,
DirectHandle<BreakPoint> break_point);
};
class WasmExceptionTag
: public TorqueGeneratedWasmExceptionTag<WasmExceptionTag, Struct> {
public:
V8_EXPORT_PRIVATE static DirectHandle<WasmExceptionTag> New(Isolate* isolate,
int index);
using BodyDescriptor = StructBodyDescriptor;
TQ_OBJECT_CONSTRUCTORS(WasmExceptionTag)
};
class AsmWasmData : public TorqueGeneratedAsmWasmData<AsmWasmData, Struct> {
public:
static Handle<AsmWasmData> New(
Isolate* isolate, std::shared_ptr<wasm::NativeModule> native_module,
DirectHandle<HeapNumber> uses_bitset);
DECL_PRINTER(AsmWasmData)
using BodyDescriptor = StructBodyDescriptor;
TQ_OBJECT_CONSTRUCTORS(AsmWasmData)
};
class WasmTypeInfo
: public TorqueGeneratedWasmTypeInfo<WasmTypeInfo, HeapObject> {
public:
inline wasm::CanonicalValueType type() const;
inline wasm::CanonicalTypeIndex type_index() const;
inline wasm::CanonicalValueType element_type() const;
DECL_PRINTER(WasmTypeInfo)
class BodyDescriptor;
TQ_OBJECT_CONSTRUCTORS(WasmTypeInfo)
};
class WasmObject : public TorqueGeneratedWasmObject<WasmObject, JSReceiver> {
protected:
static inline DirectHandle<Object> ReadValueAt(Isolate* isolate,
DirectHandle<HeapObject> obj,
wasm::CanonicalValueType type,
uint32_t offset);
private:
template <typename ElementType>
static ElementType FromNumber(Tagged<Object> value);
TQ_OBJECT_CONSTRUCTORS(WasmObject)
};
class WasmStruct : public TorqueGeneratedWasmStruct<WasmStruct, WasmObject> {
public:
static const wasm::CanonicalStructType* GcSafeType(Tagged<Map> map);
static inline int Size(const wasm::StructType* type);
static inline int Size(const wasm::CanonicalStructType* type);
static inline int GcSafeSize(Tagged<Map> map);
static inline void EncodeInstanceSizeInMap(int instance_size,
Tagged<Map> map);
static inline int DecodeInstanceSizeFromMap(Tagged<Map> map);
inline Address RawFieldAddress(int raw_offset);
inline ObjectSlot RawField(int raw_offset);
static DirectHandle<WasmStruct> AllocateDescriptorUninitialized(
Isolate* isolate, DirectHandle<WasmTrustedInstanceData> trusted_data,
wasm::ModuleTypeIndex index, DirectHandle<Map> map,
DirectHandle<Object> first_field);
DECL_ACCESSORS(described_rtt, Tagged<Map>)
static DirectHandle<JSObject> AllocatePrototype(
Isolate* isolate, DirectHandle<JSPrototype> parent);
V8_EXPORT_PRIVATE wasm::WasmValue GetFieldValue(uint32_t field_index);
inline void SetTaggedFieldValue(int raw_offset, Tagged<Object> value,
WriteBarrierMode mode = UPDATE_WRITE_BARRIER);
DECL_PRINTER(WasmStruct)
class BodyDescriptor;
TQ_OBJECT_CONSTRUCTORS(WasmStruct)
};
int WasmStruct::Size(const wasm::StructType* type) {
static_assert(Smi::kMaxValue <= kMaxInt);
DCHECK_LE(type->total_fields_size(), Smi::kMaxValue - kHeaderSize);
return std::max(kHeaderSize + static_cast<int>(type->total_fields_size()),
Heap::kMinObjectSizeInTaggedWords * kTaggedSize);
}
int WasmStruct::Size(const wasm::CanonicalStructType* type) {
static_assert(Smi::kMaxValue <= kMaxInt);
DCHECK_LE(type->total_fields_size(), Smi::kMaxValue - kHeaderSize);
return std::max(kHeaderSize + static_cast<int>(type->total_fields_size()),
Heap::kMinObjectSizeInTaggedWords * kTaggedSize);
}
class WasmArray : public TorqueGeneratedWasmArray<WasmArray, WasmObject> {
public:
static inline wasm::CanonicalTypeIndex type_index(Tagged<Map> map);
static inline const wasm::CanonicalValueType GcSafeElementType(
Tagged<Map> map);
inline ObjectSlot ElementSlot(uint32_t index);
V8_EXPORT_PRIVATE wasm::WasmValue GetElement(uint32_t index);
static inline int SizeFor(Tagged<Map> map, int length);
static constexpr int SizeFor(int element_size, int length);
static inline DirectHandle<Object> GetElement(Isolate* isolate,
DirectHandle<WasmArray> array,
uint32_t index);
void SetTaggedElement(uint32_t index, DirectHandle<Object> value,
WriteBarrierMode mode = UPDATE_WRITE_BARRIER);
inline uint32_t element_offset(uint32_t index);
inline Address ElementAddress(uint32_t index);
static constexpr int MaxLength(uint32_t element_size_bytes) {
return RoundDown(
(int{SmiTagging<4>::kSmiMaxValue} - kHeaderSize) / element_size_bytes,
kTaggedSize);
}
static int MaxLength(const wasm::ArrayType* type) {
return MaxLength(type->element_type().value_kind_size());
}
static inline void EncodeElementSizeInMap(int element_size, Tagged<Map> map);
static inline int DecodeElementSizeFromMap(Tagged<Map> map);
DECL_PRINTER(WasmArray)
class BodyDescriptor;
TQ_OBJECT_CONSTRUCTORS(WasmArray)
};
class WasmSuspenderObject
: public TorqueGeneratedWasmSuspenderObject<WasmSuspenderObject,
ExposedTrustedObject> {
public:
using BodyDescriptor = StackedBodyDescriptor<
FixedExposedTrustedObjectBodyDescriptor<WasmSuspenderObject,
kWasmSuspenderIndirectPointerTag>,
WithExternalPointer<kStackOffset, kWasmStackMemoryTag>,
WithProtectedPointer<kParentOffset>>;
enum State : int { kInactive = 0, kActive, kSuspended };
DECL_EXTERNAL_POINTER_ACCESSORS(stack, wasm::StackMemory*)
DECL_PROTECTED_POINTER_ACCESSORS(parent, WasmSuspenderObject)
DECL_PRINTER(WasmSuspenderObject)
TQ_OBJECT_CONSTRUCTORS(WasmSuspenderObject)
};
class WasmSuspendingObject
: public TorqueGeneratedWasmSuspendingObject<WasmSuspendingObject,
JSObject> {
public:
V8_EXPORT_PRIVATE static DirectHandle<WasmSuspendingObject> New(
Isolate* isolate, DirectHandle<JSReceiver> callable);
DECL_PRINTER(WasmSuspendingObject)
TQ_OBJECT_CONSTRUCTORS(WasmSuspendingObject)
};
class WasmContinuationObject
: public TorqueGeneratedWasmContinuationObject<WasmContinuationObject,
HeapObject> {
public:
using BodyDescriptor = StackedBodyDescriptor<
FixedBodyDescriptorFor<WasmContinuationObject>,
WithExternalPointer<kStackOffset, kWasmStackMemoryTag>>;
DECL_EXTERNAL_POINTER_ACCESSORS(stack, wasm::StackMemory*)
DECL_PRINTER(WasmContinuationObject)
TQ_OBJECT_CONSTRUCTORS(WasmContinuationObject)
};
class WasmNull : public TorqueGeneratedWasmNull<WasmNull, HeapObject> {
public:
#if V8_STATIC_ROOTS_BOOL || V8_STATIC_ROOTS_GENERATION_BOOL
static constexpr int kPayloadSize = 64 * KB;
static_assert(kPayloadSize % kMinimumOSPageSize == 0);
Address payload() { return field_address(kPayloadOffset); }
static constexpr int kPayloadOffset = HeapObject::kHeaderSize;
static constexpr int kSizeWithPayload = kPayloadOffset + kPayloadSize;
static constexpr int kSize = kSizeWithPayload;
static_assert(kSizeWithPayload >=
WasmStruct::kHeaderSize +
(wasm::kMaxStructFieldIndexForImplicitNullCheck + 1) *
kSimd128Size);
#else
static constexpr int kSize = HeapObject::kHeaderSize;
#endif
class BodyDescriptor;
TQ_OBJECT_CONSTRUCTORS(WasmNull)
};
#undef DECL_OPTIONAL_ACCESSORS
DirectHandle<Map> CreateStructMap(
Isolate* isolate, wasm::CanonicalTypeIndex type,
DirectHandle<Map> opt_rtt_parent, int num_supertypes,
DirectHandle<NativeContext> opt_native_context);
DirectHandle<Map> CreateArrayMap(Isolate* isolate,
wasm::CanonicalTypeIndex array_index,
DirectHandle<Map> opt_rtt_parent,
int num_supertypes);
DirectHandle<Map> CreateFuncRefMap(Isolate* isolate,
wasm::CanonicalTypeIndex type,
DirectHandle<Map> opt_rtt_parent,
int num_supertypes, bool shared);
DirectHandle<Map> CreateContRefMap(Isolate* isolate,
wasm::CanonicalTypeIndex type);
namespace wasm {
MaybeDirectHandle<Object> JSToWasmObject(Isolate* isolate,
DirectHandle<Object> value,
CanonicalValueType expected,
const char** error_message);
MaybeDirectHandle<Object> JSToWasmObject(Isolate* isolate,
const WasmModule* module,
DirectHandle<Object> value,
ValueType expected,
const char** error_message);
DirectHandle<Object> WasmToJSObject(Isolate* isolate,
DirectHandle<Object> value);
}
}
}
#include "src/objects/object-macros-undef.h"
#endif