Skip to content

Support table initializers #2593

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 12 additions & 4 deletions include/wabt/binary-reader-logging.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,9 +96,13 @@ class BinaryReaderLogging : public BinaryReaderDelegate {

Result BeginTableSection(Offset size) override;
Result OnTableCount(Index count) override;
Result OnTable(Index index,
Type elem_type,
const Limits* elem_limits) override;
Result BeginTable(Index index,
Type elem_type,
const Limits* elem_limits,
bool has_init_expr) override;
Result BeginTableInitExpr(Index index) override;
Result EndTableInitExpr(Index index) override;
Result EndTable(Index index) override;
Result EndTableSection() override;

Result BeginMemorySection(Offset size) override;
Expand Down Expand Up @@ -174,14 +178,16 @@ class BinaryReaderLogging : public BinaryReaderDelegate {
Result OnBlockExpr(Type sig_type) override;
Result OnBrExpr(Index depth) override;
Result OnBrIfExpr(Index depth) override;
Result OnBrOnNonNullExpr(Index depth) override;
Result OnBrOnNullExpr(Index depth) override;
Result OnBrTableExpr(Index num_targets,
Index* target_depths,
Index default_target_depth) override;
Result OnCallExpr(Index func_index) override;
Result OnCatchExpr(Index tag_index) override;
Result OnCatchAllExpr() override;
Result OnCallIndirectExpr(Index sig_index, Index table_index) override;
Result OnCallRefExpr() override;
Result OnCallRefExpr(Type sig_type) override;
Result OnCompareExpr(Opcode opcode) override;
Result OnConvertExpr(Opcode opcode) override;
Result OnDelegateExpr(Index depth) override;
Expand Down Expand Up @@ -218,12 +224,14 @@ class BinaryReaderLogging : public BinaryReaderDelegate {
Result OnTableGrowExpr(Index table) override;
Result OnTableSizeExpr(Index table) override;
Result OnTableFillExpr(Index table) override;
Result OnRefAsNonNullExpr() override;
Result OnRefFuncExpr(Index index) override;
Result OnRefNullExpr(Type type) override;
Result OnRefIsNullExpr() override;
Result OnNopExpr() override;
Result OnRethrowExpr(Index depth) override;
Result OnReturnCallExpr(Index func_index) override;
Result OnReturnCallRefExpr(Type sig_type) override;
Result OnReturnCallIndirectExpr(Index sig_index, Index table_index) override;
Result OnReturnExpr() override;
Result OnSelectExpr(Index result_count, Type* result_types) override;
Expand Down
16 changes: 12 additions & 4 deletions include/wabt/binary-reader-nop.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,11 +121,15 @@ class BinaryReaderNop : public BinaryReaderDelegate {
/* Table section */
Result BeginTableSection(Offset size) override { return Result::Ok; }
Result OnTableCount(Index count) override { return Result::Ok; }
Result OnTable(Index index,
Type elem_type,
const Limits* elem_limits) override {
Result BeginTable(Index index,
Type elem_type,
const Limits* elem_limits,
bool has_init_expr) override {
return Result::Ok;
}
Result BeginTableInitExpr(Index index) override { return Result::Ok; }
Result EndTableInitExpr(Index index) override { return Result::Ok; }
Result EndTable(Index index) override { return Result::Ok; }
Result EndTableSection() override { return Result::Ok; }

/* Memory section */
Expand Down Expand Up @@ -241,6 +245,8 @@ class BinaryReaderNop : public BinaryReaderDelegate {
Result OnBlockExpr(Type sig_type) override { return Result::Ok; }
Result OnBrExpr(Index depth) override { return Result::Ok; }
Result OnBrIfExpr(Index depth) override { return Result::Ok; }
Result OnBrOnNonNullExpr(Index depth) override { return Result::Ok; }
Result OnBrOnNullExpr(Index depth) override { return Result::Ok; }
Result OnBrTableExpr(Index num_targets,
Index* target_depths,
Index default_target_depth) override {
Expand All @@ -250,7 +256,7 @@ class BinaryReaderNop : public BinaryReaderDelegate {
Result OnCallIndirectExpr(Index sig_index, Index table_index) override {
return Result::Ok;
}
Result OnCallRefExpr() override { return Result::Ok; }
Result OnCallRefExpr(Type sig_type) override { return Result::Ok; }
Result OnCatchExpr(Index tag_index) override { return Result::Ok; }
Result OnCatchAllExpr() override { return Result::Ok; }
Result OnCompareExpr(Opcode opcode) override { return Result::Ok; }
Expand Down Expand Up @@ -299,6 +305,7 @@ class BinaryReaderNop : public BinaryReaderDelegate {
Result OnTableGrowExpr(Index table_index) override { return Result::Ok; }
Result OnTableSizeExpr(Index table_index) override { return Result::Ok; }
Result OnTableFillExpr(Index table_index) override { return Result::Ok; }
Result OnRefAsNonNullExpr() override { return Result::Ok; }
Result OnRefFuncExpr(Index func_index) override { return Result::Ok; }
Result OnRefNullExpr(Type type) override { return Result::Ok; }
Result OnRefIsNullExpr() override { return Result::Ok; }
Expand All @@ -308,6 +315,7 @@ class BinaryReaderNop : public BinaryReaderDelegate {
Result OnReturnCallIndirectExpr(Index sig_index, Index table_index) override {
return Result::Ok;
}
Result OnReturnCallRefExpr(Type sig_type) override { return Result::Ok; }
Result OnReturnExpr() override { return Result::Ok; }
Result OnSelectExpr(Index result_count, Type* result_types) override {
return Result::Ok;
Expand Down
16 changes: 12 additions & 4 deletions include/wabt/binary-reader.h
Original file line number Diff line number Diff line change
Expand Up @@ -156,9 +156,13 @@ class BinaryReaderDelegate {
/* Table section */
virtual Result BeginTableSection(Offset size) = 0;
virtual Result OnTableCount(Index count) = 0;
virtual Result OnTable(Index index,
Type elem_type,
const Limits* elem_limits) = 0;
virtual Result BeginTable(Index index,
Type elem_type,
const Limits* elem_limits,
bool has_init_expr) = 0;
virtual Result BeginTableInitExpr(Index index) = 0;
virtual Result EndTableInitExpr(Index index) = 0;
virtual Result EndTable(Index index) = 0;
virtual Result EndTableSection() = 0;

/* Memory section */
Expand Down Expand Up @@ -250,12 +254,14 @@ class BinaryReaderDelegate {
virtual Result OnBlockExpr(Type sig_type) = 0;
virtual Result OnBrExpr(Index depth) = 0;
virtual Result OnBrIfExpr(Index depth) = 0;
virtual Result OnBrOnNonNullExpr(Index depth) = 0;
virtual Result OnBrOnNullExpr(Index depth) = 0;
virtual Result OnBrTableExpr(Index num_targets,
Index* target_depths,
Index default_target_depth) = 0;
virtual Result OnCallExpr(Index func_index) = 0;
virtual Result OnCallIndirectExpr(Index sig_index, Index table_index) = 0;
virtual Result OnCallRefExpr() = 0;
virtual Result OnCallRefExpr(Type sig_type) = 0;
virtual Result OnCatchExpr(Index tag_index) = 0;
virtual Result OnCatchAllExpr() = 0;
virtual Result OnCompareExpr(Opcode opcode) = 0;
Expand Down Expand Up @@ -294,6 +300,7 @@ class BinaryReaderDelegate {
virtual Result OnTableGrowExpr(Index table_index) = 0;
virtual Result OnTableSizeExpr(Index table_index) = 0;
virtual Result OnTableFillExpr(Index table_index) = 0;
virtual Result OnRefAsNonNullExpr() = 0;
virtual Result OnRefFuncExpr(Index func_index) = 0;
virtual Result OnRefNullExpr(Type type) = 0;
virtual Result OnRefIsNullExpr() = 0;
Expand All @@ -303,6 +310,7 @@ class BinaryReaderDelegate {
virtual Result OnReturnCallExpr(Index func_index) = 0;
virtual Result OnReturnCallIndirectExpr(Index sig_index,
Index table_index) = 0;
virtual Result OnReturnCallRefExpr(Type sig_type) = 0;
virtual Result OnSelectExpr(Index result_count, Type* result_types) = 0;
virtual Result OnStoreExpr(Opcode opcode,
Index memidx,
Expand Down
8 changes: 8 additions & 0 deletions include/wabt/expr-visitor.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,8 @@ class ExprVisitor::Delegate {
virtual Result EndBlockExpr(BlockExpr*) = 0;
virtual Result OnBrExpr(BrExpr*) = 0;
virtual Result OnBrIfExpr(BrIfExpr*) = 0;
virtual Result OnBrOnNonNullExpr(BrOnNonNullExpr*) = 0;
virtual Result OnBrOnNullExpr(BrOnNullExpr*) = 0;
virtual Result OnBrTableExpr(BrTableExpr*) = 0;
virtual Result BeginTryTableExpr(TryTableExpr*) = 0;
virtual Result EndTryTableExpr(TryTableExpr*) = 0;
Expand Down Expand Up @@ -109,13 +111,15 @@ class ExprVisitor::Delegate {
virtual Result OnTableGrowExpr(TableGrowExpr*) = 0;
virtual Result OnTableSizeExpr(TableSizeExpr*) = 0;
virtual Result OnTableFillExpr(TableFillExpr*) = 0;
virtual Result OnRefAsNonNullExpr(RefAsNonNullExpr*) = 0;
virtual Result OnRefFuncExpr(RefFuncExpr*) = 0;
virtual Result OnRefNullExpr(RefNullExpr*) = 0;
virtual Result OnRefIsNullExpr(RefIsNullExpr*) = 0;
virtual Result OnNopExpr(NopExpr*) = 0;
virtual Result OnReturnExpr(ReturnExpr*) = 0;
virtual Result OnReturnCallExpr(ReturnCallExpr*) = 0;
virtual Result OnReturnCallIndirectExpr(ReturnCallIndirectExpr*) = 0;
virtual Result OnReturnCallRefExpr(ReturnCallRefExpr*) = 0;
virtual Result OnSelectExpr(SelectExpr*) = 0;
virtual Result OnStoreExpr(StoreExpr*) = 0;
virtual Result OnUnaryExpr(UnaryExpr*) = 0;
Expand Down Expand Up @@ -150,6 +154,8 @@ class ExprVisitor::DelegateNop : public ExprVisitor::Delegate {
Result EndBlockExpr(BlockExpr*) override { return Result::Ok; }
Result OnBrExpr(BrExpr*) override { return Result::Ok; }
Result OnBrIfExpr(BrIfExpr*) override { return Result::Ok; }
Result OnBrOnNonNullExpr(BrOnNonNullExpr*) override { return Result::Ok; };
Result OnBrOnNullExpr(BrOnNullExpr*) override { return Result::Ok; };
Result OnBrTableExpr(BrTableExpr*) override { return Result::Ok; }
Result BeginTryTableExpr(TryTableExpr*) override { return Result::Ok; }
Result EndTryTableExpr(TryTableExpr*) override { return Result::Ok; }
Expand Down Expand Up @@ -186,6 +192,7 @@ class ExprVisitor::DelegateNop : public ExprVisitor::Delegate {
Result OnTableGrowExpr(TableGrowExpr*) override { return Result::Ok; }
Result OnTableSizeExpr(TableSizeExpr*) override { return Result::Ok; }
Result OnTableFillExpr(TableFillExpr*) override { return Result::Ok; }
Result OnRefAsNonNullExpr(RefAsNonNullExpr*) override { return Result::Ok; }
Result OnRefFuncExpr(RefFuncExpr*) override { return Result::Ok; }
Result OnRefNullExpr(RefNullExpr*) override { return Result::Ok; }
Result OnRefIsNullExpr(RefIsNullExpr*) override { return Result::Ok; }
Expand All @@ -195,6 +202,7 @@ class ExprVisitor::DelegateNop : public ExprVisitor::Delegate {
Result OnReturnCallIndirectExpr(ReturnCallIndirectExpr*) override {
return Result::Ok;
}
Result OnReturnCallRefExpr(ReturnCallRefExpr*) override { return Result::Ok; }
Result OnSelectExpr(SelectExpr*) override { return Result::Ok; }
Result OnStoreExpr(StoreExpr*) override { return Result::Ok; }
Result OnUnaryExpr(UnaryExpr*) override { return Result::Ok; }
Expand Down
12 changes: 3 additions & 9 deletions include/wabt/interp/interp-inl.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ inline bool FuncType::classof(const ExternType* type) {
}

inline FuncType::FuncType(ValueTypes params, ValueTypes results)
: ExternType(ExternKind::Func), params(params), results(results) {}
: ExternType(ExternKind::Func), params(params), results(results), func_types(nullptr) {}

//// TableType ////
// static
Expand Down Expand Up @@ -422,12 +422,6 @@ void RequireType(ValueType type) {
assert(HasType<T>(type));
}

inline bool TypesMatch(ValueType expected, ValueType actual) {
// Currently there is no subtyping, so expected and actual must match
// exactly. In the future this may be expanded.
return expected == actual;
}

//// Value ////
inline Value WABT_VECTORCALL Value::Make(s32 val) { Value res; res.i32_ = val; res.SetType(ValueType::I32); return res; }
inline Value WABT_VECTORCALL Value::Make(u32 val) { Value res; res.i32_ = val; res.SetType(ValueType::I32); return res; }
Expand Down Expand Up @@ -682,8 +676,8 @@ inline bool Table::classof(const Object* obj) {
}

// static
inline Table::Ptr Table::New(Store& store, TableType type) {
return store.Alloc<Table>(store, type);
inline Table::Ptr Table::New(Store& store, TableType type, Ref init_ref) {
return store.Alloc<Table>(store, type, init_ref);
}

inline const ExternType& Table::extern_type() {
Expand Down
10 changes: 8 additions & 2 deletions include/wabt/interp/interp.h
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,10 @@ using u32x2 = Simd<u32, 2>;

//// Types ////

bool TypesMatch(ValueType expected, ValueType actual);

//// Limits ////

bool CanGrow(const Limits&, u32 old_size, u32 delta, u32* new_size);
Result Match(const Limits& expected,
const Limits& actual,
Expand Down Expand Up @@ -184,6 +188,7 @@ struct FuncType : ExternType {

ValueTypes params;
ValueTypes results;
std::vector<FuncType>* func_types;
};

struct TableType : ExternType {
Expand Down Expand Up @@ -330,6 +335,7 @@ struct FuncDesc {

struct TableDesc {
TableType type;
FuncDesc init_func;
};

struct MemoryDesc {
Expand Down Expand Up @@ -814,7 +820,7 @@ class Table : public Extern {
static const char* GetTypeName() { return "Table"; }
using Ptr = RefPtr<Table>;

static Table::Ptr New(Store&, TableType);
static Table::Ptr New(Store&, TableType, Ref);

Result Match(Store&, const ImportType&, Trap::Ptr* out_trap) override;

Expand Down Expand Up @@ -846,7 +852,7 @@ class Table : public Extern {

private:
friend Store;
explicit Table(Store&, TableType);
explicit Table(Store&, TableType, Ref);
void Mark(Store&) override;

TableType type_;
Expand Down
Loading
Loading