5#ifndef V8_WASM_STRUCT_TYPES_H_
6#define V8_WASM_STRUCT_TYPES_H_
8#if !V8_ENABLE_WEBASSEMBLY
9#error This header should only be included if WebAssembly is enabled.
63 DCHECK(offsets_initialized_);
79 DCHECK(!offsets_initialized_);
87 uint32_t gap_position = 0;
88 uint32_t gap_size = 0;
91 if (field_size <= gap_size) {
92 uint32_t aligned_gap =
Align(gap_position, field_size);
93 uint32_t gap_before = aligned_gap - gap_position;
94 uint32_t aligned_gap_size = gap_size - gap_before;
95 if (field_size <= aligned_gap_size) {
97 uint32_t gap_after = aligned_gap_size - field_size;
98 if (gap_before > gap_after) {
100 gap_size = gap_before;
102 gap_position = aligned_gap + field_size;
103 gap_size = gap_after;
108 uint32_t old_offset =
offset;
110 uint32_t gap =
offset - old_offset;
111 if (gap > gap_size) {
113 gap_position = old_offset;
121 offsets_initialized_ =
true;
126 template <
class Sub
class,
class ValueTypeSub
class>
140 buffer_(zone->AllocateArray<ValueTypeSubclass>(
173 result->InitializeOffsets();
176 bool offsets_specified =
true;
179 offsets_specified =
false;
183 result->offsets_initialized_ = offsets_specified;
206 static_assert(kV8MaxWasmStructFields < std::numeric_limits<uint16_t>::max());
210 bool offsets_initialized_ =
false;
229 if (
this == &other)
return true;
230 if (
field_count() != other.field_count())
return false;
233 other.fields().begin()) &&
235 other.mutabilities().begin());
265 if (
this == &other)
return true;
266 if (
field_count() != other.field_count())
return false;
269 other.fields().begin()) &&
271 other.mutabilities().begin());
284 out << field.name() <<
", ";
337 return index_ == other.index_;
352 return index_ == other.index_;
constexpr ArrayTypeBase(bool mutability)
ValueType * element_type_writable_ptr()
bool operator==(const ArrayType &other) const
ValueType element_type() const
constexpr ArrayType(ValueType rep, bool mutability)
bool operator==(const CanonicalArrayType &other) const
CanonicalValueType element_type() const
CanonicalArrayType(CanonicalValueType rep, bool mutability)
CanonicalTypeIndex contfun_typeindex() const
CanonicalContType(CanonicalTypeIndex idx)
bool operator==(const CanonicalContType &other) const
CanonicalTypeIndex index_
base::iterator_range< const CanonicalValueType * > fields() const
CanonicalValueType field(uint32_t index) const
bool operator==(const CanonicalStructType &other) const
CanonicalStructType(uint32_t field_count, uint32_t *field_offsets, const CanonicalValueType *reps, const bool *mutabilities, bool is_descriptor)
ModuleTypeIndex contfun_typeindex() const
constexpr ContType(ModuleTypeIndex idx)
bool operator==(const ContType &other) const
const uint32_t field_count_
bool *const mutabilities_
BuilderImpl(Zone *zone, uint32_t field_count, bool is_descriptor)
const bool is_descriptor_
uint32_t * field_offsets_
ValueTypeSubclass *const buffer_
void AddField(ValueTypeSubclass type, bool mutability, uint32_t offset=0)
void set_total_fields_size(uint32_t size)
Subclass * Build(ComputeOffsets compute_offsets=kComputeOffsets)
ValueTypeBase field(uint32_t index) const
bool mutability(uint32_t index) const
const bool *const mutabilities_
StructTypeBase(uint32_t field_count, uint32_t *field_offsets, const ValueTypeBase *reps, const bool *mutabilities, bool is_descriptor)
base::iterator_range< const bool * > mutabilities() const
uint32_t *const field_offsets_
uint32_t field_offset(uint32_t index) const
static const size_t kMaxFieldOffset
bool is_descriptor() const
const ValueTypeBase *const reps_
uint32_t field_count() const
uint32_t total_fields_size() const
base::iterator_range< const ValueTypeBase * > fields() const
const bool is_descriptor_
const uint16_t field_count_
uint32_t Align(uint32_t offset, uint32_t alignment)
bool operator==(const StructType &other) const
ValueType field(uint32_t index) const
StructType(uint32_t field_count, uint32_t *field_offsets, const ValueType *reps, const bool *mutabilities, bool is_descriptor)
base::iterator_range< const ValueType * > fields() const
constexpr int value_kind_size() const
ZoneVector< RpoNumber > & result
std::ostream & operator<<(std::ostream &os, LiftoffVarState slot)
constexpr int kMaxValueTypeSize
constexpr size_t kV8MaxWasmStructFields
constexpr int kTaggedSize
#define DCHECK_LE(v1, v2)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)
constexpr T RoundUp(T x, intptr_t m)