v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
wasm-objects-inl.h
Go to the documentation of this file.
1// Copyright 2017 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_WASM_WASM_OBJECTS_INL_H_
6#define V8_WASM_WASM_OBJECTS_INL_H_
7
8#if !V8_ENABLE_WEBASSEMBLY
9#error This header should only be included if WebAssembly is enabled.
10#endif // !V8_ENABLE_WEBASSEMBLY
11
13// Include the non-inl header before the rest of the headers.
14
15#include <type_traits>
16
17#include "src/base/memory.h"
21#include "src/objects/foreign.h"
26#include "src/objects/managed.h"
29#include "src/roots/roots.h"
32#include "third_party/fp16/src/include/fp16.h"
33
34#if V8_ENABLE_DRUMBRAKE
36#endif // V8_ENABLE_DRUMBRAKE
37
38// Has to be the last include (doesn't have include guards)
40
41namespace v8::internal {
42
43#include "torque-generated/src/wasm/wasm-objects-tq-inl.inc"
44
47TQ_OBJECT_CONSTRUCTORS_IMPL(WasmCapiFunctionData)
48TQ_OBJECT_CONSTRUCTORS_IMPL(WasmExceptionTag)
49TQ_OBJECT_CONSTRUCTORS_IMPL(WasmExportedFunctionData)
50TQ_OBJECT_CONSTRUCTORS_IMPL(WasmFunctionData)
52TQ_OBJECT_CONSTRUCTORS_IMPL(WasmGlobalObject)
53TQ_OBJECT_CONSTRUCTORS_IMPL(WasmImportData)
54TQ_OBJECT_CONSTRUCTORS_IMPL(WasmInstanceObject)
56TQ_OBJECT_CONSTRUCTORS_IMPL(WasmJSFunctionData)
57TQ_OBJECT_CONSTRUCTORS_IMPL(WasmMemoryObject)
58TQ_OBJECT_CONSTRUCTORS_IMPL(WasmMemoryMapDescriptor)
59TQ_OBJECT_CONSTRUCTORS_IMPL(WasmModuleObject)
62TQ_OBJECT_CONSTRUCTORS_IMPL(WasmResumeData)
64TQ_OBJECT_CONSTRUCTORS_IMPL(WasmSuspenderObject)
65TQ_OBJECT_CONSTRUCTORS_IMPL(WasmSuspendingObject)
66TQ_OBJECT_CONSTRUCTORS_IMPL(WasmTableObject)
67TQ_OBJECT_CONSTRUCTORS_IMPL(WasmTagObject)
69
70#define OPTIONAL_ACCESSORS(holder, name, type, offset) \
71 DEF_GETTER(holder, has_##name, bool) { \
72 Tagged<Object> value = \
73 TaggedField<Object, offset>::load(cage_base, *this); \
74 return !IsUndefined(value); \
75 } \
76 ACCESSORS_CHECKED2(holder, name, type, offset, !IsUndefined(value), true)
77
78#define PRIMITIVE_ACCESSORS(holder, name, type, offset) \
79 type holder::name() const { \
80 return ReadMaybeUnalignedValue<type>(FIELD_ADDR(*this, offset)); \
81 } \
82 void holder::set_##name(type value) { \
83 WriteMaybeUnalignedValue<type>(FIELD_ADDR(*this, offset), value); \
84 }
85
86// WasmModuleObject
88 return managed_native_module()->raw();
89}
90const std::shared_ptr<wasm::NativeModule>&
92 return managed_native_module()->get();
93}
95 // TODO(clemensb): Remove this helper (inline in callers).
96 return native_module()->module();
97}
99 bool asm_js = is_asmjs_module(module());
100 DCHECK_EQ(asm_js, script()->IsUserJavaScript());
101 return asm_js;
102}
103
104// WasmMemoryObject
105ACCESSORS(WasmMemoryObject, instances, Tagged<WeakArrayList>, kInstancesOffset)
106
107// WasmGlobalObject
109 kUntaggedBufferOffset)
111 kTaggedBufferOffset)
114 kWasmTrustedInstanceDataIndirectPointerTag)
115
116wasm::ValueType WasmGlobalObject::type() const {
117 // Various consumers of ValueKind (e.g. ValueKind::name()) use the raw enum
118 // value as index into a global array. As such, if the index is corrupted
119 // (which must be assumed, as it comes from within the sandbox), this can
120 // lead to out-of-bounds reads outside the sandbox. While these are not
121 // technically sandbox violations, we should still try to avoid them to keep
122 // fuzzers happy. This SBXCHECK accomplishes that.
124 SBXCHECK(type.is_valid());
125 return type;
126}
127void WasmGlobalObject::set_type(wasm::ValueType value) {
128 set_raw_type(static_cast<int>(value.raw_bit_field()));
129}
130
131int WasmGlobalObject::type_size() const { return type().value_kind_size(); }
132
134 DCHECK(!type().is_reference());
135 DCHECK_LE(offset() + type_size(), untagged_buffer()->byte_length());
136 return reinterpret_cast<Address>(untagged_buffer()->backing_store()) +
137 offset();
138}
139
143
147
151
155
157 return reinterpret_cast<uint8_t*>(address());
158}
159
161 // We use this getter for externref, funcref, and stringref.
162 DCHECK(type().is_reference());
164}
165
166void WasmGlobalObject::SetI32(int32_t value) {
168}
169
170void WasmGlobalObject::SetI64(int64_t value) {
172}
173
174void WasmGlobalObject::SetF32(float value) {
176}
177
178void WasmGlobalObject::SetF64(double value) {
180}
181
183 DCHECK(type().is_object_reference());
184 tagged_buffer()->set(offset(), *value);
185}
186
187// WasmTrustedInstanceData
189
191 kMemory0StartOffset)
193 kMemory0SizeOffset)
195 TrustedManaged<wasm::NativeModule>,
196 kProtectedManagedNativeModuleOffset)
198 Address*, kNewAllocationLimitAddressOffset)
200 Address*, kNewAllocationTopAddressOffset)
202 Address*, kOldAllocationLimitAddressOffset)
204 Address*, kOldAllocationTopAddressOffset)
206 kGlobalsStartOffset)
207ACCESSORS(WasmTrustedInstanceData, imported_mutable_globals,
208 Tagged<FixedAddressArray>, kImportedMutableGlobalsOffset)
209#if V8_ENABLE_DRUMBRAKE
210ACCESSORS(WasmTrustedInstanceData, imported_function_indices,
211 Tagged<FixedInt32Array>, kImportedFunctionIndicesOffset)
212#endif // V8_ENABLE_DRUMBRAKE
214 kJumpTableStartOffset)
215PRIMITIVE_ACCESSORS(WasmTrustedInstanceData, hook_on_function_call_address,
216 Address, kHookOnFunctionCallAddressOffset)
218 std::atomic<uint32_t>*, kTieringBudgetArrayOffset)
221 kProtectedMemoryBasesAndSizesOffset)
223 Tagged<FixedAddressArray>, kDataSegmentStartsOffset)
225 kDataSegmentSizesOffset)
227 kElementSegmentsOffset)
229 kBreakOnEntryOffset)
230
232 Tagged<WasmInstanceObject>, kInstanceObjectOffset)
234 kNativeContextOffset)
236 kMemoryObjectsOffset)
238 Tagged<JSArrayBuffer>, kUntaggedGlobalsBufferOffset)
240 Tagged<FixedArray>, kTaggedGlobalsBufferOffset)
241OPTIONAL_ACCESSORS(WasmTrustedInstanceData, imported_mutable_globals_buffers,
242 Tagged<FixedArray>, kImportedMutableGlobalsBuffersOffset)
244 kTablesOffset)
245#if V8_ENABLE_DRUMBRAKE
247 kInterpreterObjectOffset)
248#endif // V8_ENABLE_DRUMBRAKE
250 WasmTrustedInstanceData, kProtectedSharedPartOffset)
252 WasmDispatchTable, kProtectedDispatchTable0Offset)
254 ProtectedFixedArray, kProtectedDispatchTablesOffset)
257 kProtectedDispatchTableForImportsOffset)
259 kTagsTableOffset)
261 kFuncRefsOffset)
263 kManagedObjectMapsOffset)
265 kFeedbackVectorsOffset)
267 kWellKnownImportsOffset)
269 Address, kStressDeoptCounterOffset)
270
271void WasmTrustedInstanceData::clear_padding() {
272 constexpr int kPaddingBytes = FIELD_SIZE(kOptionalPaddingOffset);
273 static_assert(kPaddingBytes == 0 || kPaddingBytes == kIntSize);
274 if constexpr (kPaddingBytes != 0) {
275 WriteField<int>(kOptionalPaddingOffset, 0);
276 }
277}
278
280 int memory_index) const {
281 return Cast<WasmMemoryObject>(memory_objects()->get(memory_index));
282}
283
284uint8_t* WasmTrustedInstanceData::memory_base(int memory_index) const {
285 DCHECK_EQ(memory0_start(),
286 reinterpret_cast<uint8_t*>(memory_bases_and_sizes()->get(0)));
287 return reinterpret_cast<uint8_t*>(
288 memory_bases_and_sizes()->get(2 * memory_index));
289}
290
291size_t WasmTrustedInstanceData::memory_size(int memory_index) const {
292 DCHECK_EQ(memory0_size(), memory_bases_and_sizes()->get(1));
293 return memory_bases_and_sizes()->get(2 * memory_index + 1);
294}
295
297 uint32_t table_index) {
298 Tagged<Object> table = dispatch_tables()->get(table_index);
299 DCHECK(IsWasmDispatchTable(table));
300 return Cast<WasmDispatchTable>(table);
301}
302
304 Tagged<Object> maybe_table = dispatch_tables()->get(table_index);
305 DCHECK(maybe_table == Smi::zero() || IsWasmDispatchTable(maybe_table));
306 return maybe_table != Smi::zero();
307}
308
310 return managed_native_module()->get().get();
311}
312
316
320
321// WasmInstanceObject
324 kWasmTrustedInstanceDataIndirectPointerTag)
325
326// Note: in case of existing in-sandbox corruption, this could return an
327// incorrect WasmModule! For security-relevant code, prefer reading
328// {native_module()} from a {WasmTrustedInstanceData}.
330 return module_object()->module();
331}
332
334 DirectHandle<WasmTrustedInstanceData> instance_data, int index)
335 : instance_data_(instance_data), index_(index) {
336 DCHECK_GE(index, 0);
337 DCHECK_LT(index, instance_data->module()->num_imported_functions);
338}
339
340// WasmDispatchTable
341OBJECT_CONSTRUCTORS_IMPL(WasmDispatchTable, ExposedTrustedObject)
342
345 kProtectedOffheapDataOffset)
346WasmDispatchTableData* WasmDispatchTable::offheap_data() const {
347 return protected_offheap_data()->get().get();
348}
349
350PROTECTED_POINTER_ACCESSORS(WasmDispatchTable, protected_uses,
351 ProtectedWeakFixedArray, kProtectedUsesOffset)
352
353wasm::CanonicalValueType WasmDispatchTable::table_type() const {
354 return wasm::CanonicalValueType::FromRawBitField(
355 ReadField<uint32_t>(kTableTypeOffset));
356}
357void WasmDispatchTable::set_table_type(wasm::CanonicalValueType type) {
358 DCHECK(type.IsFunctionType());
359 WriteField(kTableTypeOffset, type.raw_bit_field());
360}
361
362void WasmDispatchTable::clear_entry_padding(int index) {
363 static_assert(kEntryPaddingBytes == 0 || kEntryPaddingBytes == kIntSize);
364 if constexpr (kEntryPaddingBytes != 0) {
365 WriteField<int>(OffsetOf(index) + kEntryPaddingOffset, 0);
366 }
367}
368
369int WasmDispatchTable::length(AcquireLoadTag) const {
370 return ACQUIRE_READ_INT32_FIELD(*this, kLengthOffset);
371}
372
373int WasmDispatchTable::length() const { return ReadField<int>(kLengthOffset); }
374
375int WasmDispatchTable::capacity() const {
376 return ReadField<int>(kCapacityOffset);
377}
378
379inline Tagged<Object> WasmDispatchTable::implicit_arg(int index) const {
380 DCHECK_LT(index, length());
381 Tagged<Object> implicit_arg =
382 ReadProtectedPointerField(OffsetOf(index) + kImplicitArgBias);
383 DCHECK(IsWasmTrustedInstanceData(implicit_arg) ||
384 IsWasmImportData(implicit_arg) || implicit_arg == Smi::zero());
385 return implicit_arg;
386}
387
388inline WasmCodePointer WasmDispatchTable::target(int index) const {
389 DCHECK_LT(index, length());
390 if (v8_flags.wasm_jitless) return wasm::kInvalidWasmCodePointer;
391 return WasmCodePointer{ReadField<uint32_t>(OffsetOf(index) + kTargetBias)};
392}
393
394inline wasm::CanonicalTypeIndex WasmDispatchTable::sig(int index) const {
395 DCHECK_LT(index, length());
397 ReadField<uint32_t>(OffsetOf(index) + kSigBias)};
398}
399
400#if V8_ENABLE_DRUMBRAKE
401inline uint32_t WasmDispatchTable::function_index(int index) const {
402 DCHECK_LT(index, length());
403 if (!v8_flags.wasm_jitless) return UINT_MAX;
404 return ReadField<uint32_t>(OffsetOf(index) + kFunctionIndexBias);
405}
406#endif // V8_ENABLE_DRUMBRAKE
407
408// WasmExceptionPackage
409OBJECT_CONSTRUCTORS_IMPL(WasmExceptionPackage, JSObject)
410
411// WasmExportedFunction
412WasmExportedFunction::WasmExportedFunction(Address ptr) : JSFunction(ptr) {
413 SLOW_DCHECK(IsWasmExportedFunction(*this));
414}
415
416template <>
418 static inline bool AllowFrom(Tagged<Object> value) {
420 }
421 static inline bool AllowFrom(Tagged<HeapObject> value) {
423 }
424};
425
426// WasmImportData
427
430 kProtectedInstanceDataOffset)
431
433 kProtectedCallOriginOffset)
434
435wasm::Suspend WasmImportData::suspend() const {
436 return SuspendField::decode(bit_field());
437}
438
439void WasmImportData::set_suspend(wasm::Suspend value) {
440 set_bit_field(SuspendField::update(bit_field(), value));
441}
442
443uint32_t WasmImportData::table_slot() const {
445}
446
447void WasmImportData::set_table_slot(uint32_t value) {
448 set_bit_field(TableSlotField::update(bit_field(), value));
449}
450
451// WasmInternalFunction
452
453// {implicit_arg} will be a WasmTrustedInstanceData or a WasmImportData.
455 kProtectedImplicitArgOffset)
456
457// WasmFuncRef
460 kWasmInternalFunctionIndirectPointerTag)
461
462// WasmFunctionData
463CODE_POINTER_ACCESSORS(WasmFunctionData, wrapper_code, kWrapperCodeOffset)
464
466 kProtectedInternalOffset)
467
468// WasmExportedFunctionData
471 kProtectedInstanceDataOffset)
472
474 kCWrapperCodeOffset)
475
477 kSigOffset)
478
479wasm::CanonicalTypeIndex WasmExportedFunctionData::sig_index() const {
481 static_cast<uint32_t>(canonical_type_index())};
482}
483
488
493 set_raw_call_target(code_pointer.value());
494}
495
496// WasmJSFunctionData
498 return wasm::CanonicalTypeIndex{static_cast<uint32_t>(canonical_sig_index())};
499}
502 kProtectedOffheapDataOffset)
503
504WasmJSFunctionData::OffheapData* WasmJSFunctionData::offheap_data() const {
505 return protected_offheap_data()->get().get();
506}
507
508// WasmJSFunction
509WasmJSFunction::WasmJSFunction(Address ptr) : JSFunction(ptr) {
510 SLOW_DCHECK(IsWasmJSFunction(*this));
511}
512
513template <>
515 static inline bool AllowFrom(Tagged<Object> value) {
516 return WasmJSFunction::IsWasmJSFunction(value);
517 }
518 static inline bool AllowFrom(Tagged<HeapObject> value) {
519 return WasmJSFunction::IsWasmJSFunction(value);
520 }
521};
522
523// WasmCapiFunctionData
524wasm::CanonicalTypeIndex WasmCapiFunctionData::sig_index() const {
525 return wasm::CanonicalTypeIndex{static_cast<uint32_t>(canonical_sig_index())};
526}
527
528// WasmCapiFunction
529WasmCapiFunction::WasmCapiFunction(Address ptr) : JSFunction(ptr) {
530 SLOW_DCHECK(IsWasmCapiFunction(*this));
531}
532
533template <>
535 static inline bool AllowFrom(Tagged<Object> value) {
537 }
538 static inline bool AllowFrom(Tagged<HeapObject> value) {
540 }
541};
542
543// WasmExternalFunction
544WasmExternalFunction::WasmExternalFunction(Address ptr) : JSFunction(ptr) {
545 SLOW_DCHECK(IsWasmExternalFunction(*this));
546}
547
548template <>
550 static inline bool AllowFrom(Tagged<Object> value) {
552 }
553 static inline bool AllowFrom(Tagged<HeapObject> value) {
555 }
556};
557
559 return shared()->wasm_function_data()->func_ref();
560}
561
562// WasmTypeInfo
566
570
574
575#undef OPTIONAL_ACCESSORS
576#undef READ_PRIMITIVE_FIELD
577#undef WRITE_PRIMITIVE_FIELD
578#undef PRIMITIVE_ACCESSORS
579
582 kWasmTrustedInstanceDataIndirectPointerTag)
583
586 kWasmDispatchTableIndirectPointerTag)
587
589 wasm::ValueType type = unsafe_type();
590 SBXCHECK(!type.has_index() || module->has_type(type.ref_index()));
591 return type;
592}
593
595 const wasm::WasmModule* module) {
596 wasm::ValueType unsafe = unsafe_type();
597 if (!unsafe.has_index()) return wasm::CanonicalValueType{unsafe};
598 SBXCHECK(module != nullptr && module->has_type(unsafe.ref_index()));
599 return module->canonical_type(unsafe);
600}
601
603 // Various consumers of ValueKind (e.g. ValueKind::name()) use the raw enum
604 // value as index into a global array. As such, if the index is corrupted
605 // (which must be assumed, as it comes from within the sandbox), this can
606 // lead to out-of-bounds reads outside the sandbox. While these are not
607 // technically sandbox violations, we should still try to avoid them to keep
608 // fuzzers happy. This SBXCHECK accomplishes that.
610 SBXCHECK(type.is_valid());
611 return type;
612}
613
614bool WasmTableObject::is_in_bounds(uint32_t entry_index) {
615 return entry_index < static_cast<uint32_t>(current_length());
616}
617
619 return address_type() == wasm::AddressType::kI64;
620}
621
622std::optional<uint64_t> WasmTableObject::maximum_length_u64() const {
623 Tagged<Object> max = maximum_length();
624 if (IsUndefined(max)) return std::nullopt;
625 if (is_table64()) {
626 DCHECK(IsBigInt(max));
627#if DEBUG
628 bool lossless;
629 uint64_t value = Cast<BigInt>(maximum_length())->AsUint64(&lossless);
630 DCHECK(lossless);
631 return value;
632#else
633 return Cast<BigInt>(maximum_length())->AsUint64();
634#endif
635 }
636 DCHECK(IsNumber(max));
637 double value = Object::NumberValue(max);
638 DCHECK_LE(0, value);
639 DCHECK_GE(std::numeric_limits<uint64_t>::max(), value);
640 return value;
641}
642
643bool WasmMemoryObject::has_maximum_pages() { return maximum_pages() >= 0; }
644
646 return address_type() == wasm::AddressType::kI64;
647}
648
649// static
653 uint32_t offset) {
654 Address field_address = obj->GetFieldAddress(offset);
655 switch (type.kind()) {
656 case wasm::kI8: {
657 int8_t value = base::Memory<int8_t>(field_address);
658 return direct_handle(Smi::FromInt(value), isolate);
659 }
660 case wasm::kI16: {
661 int16_t value = base::Memory<int16_t>(field_address);
662 return direct_handle(Smi::FromInt(value), isolate);
663 }
664 case wasm::kI32: {
665 int32_t value = base::Memory<int32_t>(field_address);
666 return isolate->factory()->NewNumberFromInt(value);
667 }
668 case wasm::kI64: {
669 int64_t value = base::ReadUnalignedValue<int64_t>(field_address);
670 return BigInt::FromInt64(isolate, value);
671 }
672 case wasm::kF16: {
673 uint16_t value = base::Memory<uint16_t>(field_address);
674 return isolate->factory()->NewNumber(fp16_ieee_to_fp32_value(value));
675 }
676 case wasm::kF32: {
677 float value = base::Memory<float>(field_address);
678 return isolate->factory()->NewNumber(value);
679 }
680 case wasm::kF64: {
681 double value = base::ReadUnalignedValue<double>(field_address);
682 return isolate->factory()->NewNumber(value);
683 }
684 case wasm::kS128:
685 // TODO(v8:11804): implement
686 UNREACHABLE();
687
688 case wasm::kRef:
689 case wasm::kRefNull: {
690 ObjectSlot slot(field_address);
691 return direct_handle(slot.load(isolate), isolate);
692 }
693
694 case wasm::kVoid:
695 case wasm::kTop:
696 case wasm::kBottom:
697 UNREACHABLE();
698 }
699}
700
701// Conversions from Numeric objects.
702// static
703template <typename ElementType>
705 // The value must already be prepared for storing to numeric fields.
706 DCHECK(IsNumber(value));
707 if (IsSmi(value)) {
708 return static_cast<ElementType>(Smi::ToInt(value));
709
710 } else if (IsHeapNumber(value)) {
711 double double_value = Cast<HeapNumber>(value)->value();
712 if (std::is_same<ElementType, double>::value ||
713 std::is_same<ElementType, float>::value) {
714 return static_cast<ElementType>(double_value);
715 } else {
716 CHECK(std::is_integral<ElementType>::value);
717 return static_cast<ElementType>(DoubleToInt32(double_value));
718 }
719 }
720 UNREACHABLE();
721}
722
723// static
725 // WasmStructs can be bigger than the {map.instance_size_in_words} field
726 // can describe; yet we have to store the instance size somewhere on the
727 // map so that the GC can read it without relying on any other objects
728 // still being around. To solve this problem, we store the instance size
729 // in two other fields that are otherwise unused for WasmStructs.
730 static_assert(0xFFFF > ((kHeaderSize + wasm::kMaxValueTypeSize *
733 map->SetWasmByte1((instance_size >> kObjectAlignmentBits) & 0xff);
734 map->SetWasmByte2(instance_size >> (8 + kObjectAlignmentBits));
735}
736
737// static
739 return (map->WasmByte2() << (8 + kObjectAlignmentBits)) |
740 (map->WasmByte1() << kObjectAlignmentBits);
741}
742
746
748 int offset = WasmStruct::kHeaderSize + raw_offset;
749 return FIELD_ADDR(*this, offset);
750}
751
753 return ObjectSlot(RawFieldAddress(raw_offset));
754}
755
759
763
765 DCHECK_EQ(WASM_ARRAY_TYPE, map->instance_type());
766 Tagged<WasmTypeInfo> type_info = map->wasm_type_info();
767 return type_info->type().ref_index();
768}
769
771 DCHECK_EQ(WASM_ARRAY_TYPE, map->instance_type());
772 Tagged<HeapObject> raw = Cast<HeapObject>(map->constructor_or_back_pointer());
773 // The {WasmTypeInfo} might be in the middle of being moved, which is why we
774 // can't read its map for a checked cast. But we can rely on its native type
775 // pointer being intact in the old location.
777 return type_info->element_type();
778}
779
780int WasmArray::SizeFor(Tagged<Map> map, int length) {
781 int element_size = DecodeElementSizeFromMap(map);
782 return kHeaderSize + RoundUp(element_size * length, kTaggedSize);
783}
784
785uint32_t WasmArray::element_offset(uint32_t index) {
786 DCHECK_LE(index, length());
787 int element_size = DecodeElementSizeFromMap(map());
788 return WasmArray::kHeaderSize + index * element_size;
789}
790
792 return ptr() + element_offset(index) - kHeapObjectTag;
793}
794
796 DCHECK_LE(index, length());
797 DCHECK(map()->wasm_type_info()->element_type().is_reference());
798 return RawField(kHeaderSize + kTaggedSize * index);
799}
800
801// static
804 uint32_t index) {
805 if (index >= array->length()) {
806 return isolate->factory()->undefined_value();
807 }
808 wasm::CanonicalValueType element_type =
809 array->map()->wasm_type_info()->element_type();
810 return ReadValueAt(isolate, array, element_type,
811 array->element_offset(index));
812}
813
814// static
816 map->SetWasmByte1(element_size);
817}
818
819// static
821 return map->WasmByte1();
822}
823
825 kStackOffset, kWasmStackMemoryTag)
826
829 kWasmTrustedInstanceDataIndirectPointerTag)
830
831#include "src/objects/object-macros-undef.h"
832
833} // namespace v8::internal
834
835#endif // V8_WASM_WASM_OBJECTS_INL_H_
#define SBXCHECK(condition)
Definition check.h:61
#define SLOW_DCHECK(condition)
Definition checks.h:21
static constexpr T decode(U value)
Definition bit-field.h:66
static V8_NODISCARD constexpr U update(U previous, T value)
Definition bit-field.h:61
static V8_EXPORT_PRIVATE Handle< BigInt > FromInt64(Isolate *isolate, int64_t n)
Definition bigint.cc:1333
Tagged< Object > load() const
Definition slots-inl.h:48
ImportedFunctionEntry(DirectHandle< WasmTrustedInstanceData >, int index)
static V8_INLINE Isolate * Current()
Definition isolate-inl.h:35
static double NumberValue(Tagged< Number > obj)
static constexpr int ToInt(const Tagged< Object > object)
Definition smi.h:33
static constexpr Tagged< Smi > FromInt(int value)
Definition smi.h:38
static constexpr Tagged< Smi > zero()
Definition smi.h:99
static PtrType load(Tagged< HeapObject > host, int offset=0)
static void store(Tagged< HeapObject > host, PtrType value)
V8_EXPORT_PRIVATE wasm::WasmValue GetElement(uint32_t index)
static int SizeFor(Tagged< Map > map, int length)
uint32_t element_offset(uint32_t index)
static const wasm::CanonicalValueType GcSafeElementType(Tagged< Map > map)
static int DecodeElementSizeFromMap(Tagged< Map > map)
static wasm::CanonicalTypeIndex type_index(Tagged< Map > map)
static void EncodeElementSizeInMap(int element_size, Tagged< Map > map)
Address ElementAddress(uint32_t index)
ObjectSlot ElementSlot(uint32_t index)
static bool IsWasmCapiFunction(Tagged< Object > object)
static V8_EXPORT_PRIVATE bool IsWasmExportedFunction(Tagged< Object > object)
static bool IsWasmExternalFunction(Tagged< Object > object)
Tagged< WasmFuncRef > func_ref() const
DirectHandle< Object > GetRef()
void SetRef(DirectHandle< Object > value)
const wasm::WasmModule * module() const
V8_INLINE void set_call_target(WasmCodePointer code_pointer)
V8_INLINE WasmCodePointer call_target()
wasm::CanonicalTypeIndex sig_index() const
const wasm::WasmModule * module() const
wasm::NativeModule * native_module() const
const std::shared_ptr< wasm::NativeModule > & shared_native_module() const
static DirectHandle< Object > ReadValueAt(Isolate *isolate, DirectHandle< HeapObject > obj, wasm::CanonicalValueType type, uint32_t offset)
static ElementType FromNumber(Tagged< Object > value)
Address RawFieldAddress(int raw_offset)
static int DecodeInstanceSizeFromMap(Tagged< Map > map)
static void EncodeInstanceSizeInMap(int instance_size, Tagged< Map > map)
Tagged< Map > get_described_rtt() const
ObjectSlot RawField(int raw_offset)
void set_described_rtt(Tagged< Map > rtt)
static int GcSafeSize(Tagged< Map > map)
bool is_in_bounds(uint32_t entry_index)
wasm::CanonicalValueType canonical_type(const wasm::WasmModule *module)
std::optional< uint64_t > maximum_length_u64() const
wasm::NativeModule * native_module() const
Tagged< WasmModuleObject > module_object() const
size_t memory_size(int memory_index) const
uint8_t * memory_base(int memory_index) const
Tagged< WasmDispatchTable > dispatch_table(uint32_t table_index)
const wasm::WasmModule * module() const
Tagged< WasmMemoryObject > memory_object(int memory_index) const
bool has_dispatch_table(uint32_t table_index)
wasm::CanonicalValueType type() const
wasm::CanonicalTypeIndex type_index() const
wasm::CanonicalValueType element_type() const
static constexpr CanonicalValueType FromRawBitField(uint32_t bits)
constexpr CanonicalTypeIndex ref_index() const
const WasmModule * module() const
constexpr bool has_index() const
Definition value-type.h:367
static constexpr ValueType FromRawBitField(uint32_t bits)
Definition value-type.h:913
constexpr ModuleTypeIndex ref_index() const
Register const index_
int32_t offset
SharedFunctionInfoRef shared
std::map< const std::string, const std::string > map
STL namespace.
static V ReadUnalignedValue(Address p)
Definition memory.h:28
T & Memory(Address addr)
Definition memory.h:18
static void WriteUnalignedValue(Address p, V value)
Definition memory.h:41
constexpr int kMaxValueTypeSize
Definition value-type.h:49
constexpr size_t kV8MaxWasmStructFields
Definition wasm-limits.h:64
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset uint8_t kGlobalsStartOffset kJumpTableStartOffset std::atomic< uint32_t > kTieringBudgetArrayOffset kDataSegmentStartsOffset kElementSegmentsOffset kInstanceObjectOffset kMemoryObjectsOffset kTaggedGlobalsBufferOffset kTablesOffset kProtectedDispatchTable0Offset kProtectedDispatchTableForImportsOffset kFuncRefsOffset feedback_vectors
constexpr int kIntSize
Definition globals.h:400
constexpr int kTaggedSize
Definition globals.h:542
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset uint8_t kGlobalsStartOffset kJumpTableStartOffset std::atomic< uint32_t > kTieringBudgetArrayOffset kDataSegmentStartsOffset kElementSegmentsOffset kInstanceObjectOffset kMemoryObjectsOffset kTaggedGlobalsBufferOffset kTablesOffset kProtectedDispatchTable0Offset kProtectedDispatchTableForImportsOffset kFuncRefsOffset kFeedbackVectorsOffset stress_deopt_counter_address
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset uint8_t kGlobalsStartOffset kJumpTableStartOffset std::atomic< uint32_t > kTieringBudgetArrayOffset kDataSegmentStartsOffset kElementSegmentsOffset kInstanceObjectOffset kMemoryObjectsOffset kTaggedGlobalsBufferOffset kTablesOffset kProtectedDispatchTable0Offset dispatch_table_for_imports
SlotTraits::TObjectSlot ObjectSlot
Definition globals.h:1243
kMemory0SizeOffset new_allocation_limit_address
bool IsNumber(Tagged< Object > obj)
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset uint8_t kGlobalsStartOffset kJumpTableStartOffset tiering_budget_array
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset old_allocation_limit_address
kWasmInternalFunctionIndirectPointerTag instance_data
V8_INLINE constexpr bool IsSmi(TaggedImpl< kRefType, StorageType > obj)
Definition objects.h:665
V8_INLINE DirectHandle< T > direct_handle(Tagged< T > object, Isolate *isolate)
kWasmInternalFunctionIndirectPointerTag kProtectedInstanceDataOffset sig
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset globals_start
Handle< To > UncheckedCast(Handle< From > value)
Definition handles-inl.h:55
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset uint8_t kGlobalsStartOffset kJumpTableStartOffset std::atomic< uint32_t > kTieringBudgetArrayOffset kDataSegmentStartsOffset kElementSegmentsOffset kInstanceObjectOffset memory_objects
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset uint8_t kGlobalsStartOffset jump_table_start
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset uint8_t kGlobalsStartOffset kJumpTableStartOffset std::atomic< uint32_t > kTieringBudgetArrayOffset kDataSegmentStartsOffset kElementSegmentsOffset kInstanceObjectOffset kMemoryObjectsOffset kTaggedGlobalsBufferOffset tables
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset uint8_t kGlobalsStartOffset kJumpTableStartOffset std::atomic< uint32_t > kTieringBudgetArrayOffset data_segment_starts
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset uint8_t kGlobalsStartOffset kJumpTableStartOffset std::atomic< uint32_t > kTieringBudgetArrayOffset kDataSegmentStartsOffset kElementSegmentsOffset kInstanceObjectOffset kMemoryObjectsOffset kTaggedGlobalsBufferOffset kTablesOffset kProtectedDispatchTable0Offset kProtectedDispatchTableForImportsOffset func_refs
int32_t DoubleToInt32(double x)
const int kHeapObjectTag
Definition v8-internal.h:72
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset uint8_t kGlobalsStartOffset kJumpTableStartOffset std::atomic< uint32_t > kTieringBudgetArrayOffset kDataSegmentStartsOffset element_segments
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset uint8_t kGlobalsStartOffset kJumpTableStartOffset std::atomic< uint32_t > kTieringBudgetArrayOffset kDataSegmentStartsOffset kElementSegmentsOffset kInstanceObjectOffset kMemoryObjectsOffset tagged_globals_buffer
V8_EXPORT_PRIVATE FlagValues v8_flags
return value
Definition map-inl.h:893
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset uint8_t kGlobalsStartOffset kJumpTableStartOffset std::atomic< uint32_t > kTieringBudgetArrayOffset kDataSegmentStartsOffset kElementSegmentsOffset kInstanceObjectOffset kMemoryObjectsOffset kTaggedGlobalsBufferOffset kTablesOffset dispatch_table0
kMemory0SizeOffset Address kNewAllocationLimitAddressOffset Address kOldAllocationLimitAddressOffset uint8_t kGlobalsStartOffset kJumpTableStartOffset std::atomic< uint32_t > kTieringBudgetArrayOffset kDataSegmentStartsOffset kElementSegmentsOffset instance_object
constexpr int kObjectAlignmentBits
Definition globals.h:929
kInterpreterTrampolineOffset script
!IsContextMap !IsContextMap native_context
Definition map-inl.h:877
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
Definition casting.h:150
Definition c-api.cc:87
#define FIELD_ADDR(p, offset)
#define CODE_POINTER_ACCESSORS(holder, name, offset)
#define PROTECTED_POINTER_ACCESSORS(holder, name, type, offset)
#define EXTERNAL_POINTER_ACCESSORS(holder, name, type, offset, tag)
#define OBJECT_CONSTRUCTORS_IMPL(Type, Super)
#define ACQUIRE_READ_INT32_FIELD(p, offset)
#define ACCESSORS(holder, name, type, offset)
#define TRUSTED_POINTER_ACCESSORS(holder, name, type, offset, tag)
#define TQ_OBJECT_CONSTRUCTORS_IMPL(Type)
#define DCHECK_LE(v1, v2)
Definition logging.h:490
#define CHECK(condition)
Definition logging.h:124
#define DCHECK_GE(v1, v2)
Definition logging.h:488
#define DCHECK(condition)
Definition logging.h:482
#define DCHECK_LT(v1, v2)
Definition logging.h:489
#define DCHECK_EQ(v1, v2)
Definition logging.h:485
constexpr T RoundUp(T x, intptr_t m)
Definition macros.h:387
static bool AllowFrom(Tagged< Object > value)
static bool AllowFrom(Tagged< HeapObject > value)
static bool AllowFrom(Tagged< Object > value)
static bool AllowFrom(Tagged< HeapObject > value)
static bool AllowFrom(Tagged< Object > value)
static bool AllowFrom(Tagged< HeapObject > value)
static bool AllowFrom(Tagged< HeapObject > value)
static bool AllowFrom(Tagged< Object > value)
bool has_type(ModuleTypeIndex index) const
#define FIELD_SIZE(Name)
Definition utils.h:259
wasm::ValueType type
#define PRIMITIVE_ACCESSORS(holder, name, type, offset)
#define OPTIONAL_ACCESSORS(holder, name, type, offset)