Skip to content

Commit 82a927f

Browse files
author
Zoltan Herczeg
committed
Support table initializers
1 parent 69054bf commit 82a927f

38 files changed

+1875
-79
lines changed

include/wabt/binary-reader-logging.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,12 @@ class BinaryReaderLogging : public BinaryReaderDelegate {
9696

9797
Result BeginTableSection(Offset size) override;
9898
Result OnTableCount(Index count) override;
99-
Result OnTable(Index index,
100-
Type elem_type,
101-
const Limits* elem_limits) override;
99+
Result BeginTable(Index index,
100+
Type elem_type,
101+
const Limits* elem_limits) override;
102+
Result BeginTableInitExpr(Index index) override;
103+
Result EndTableInitExpr(Index index) override;
104+
Result EndTable(Index index) override;
102105
Result EndTableSection() override;
103106

104107
Result BeginMemorySection(Offset size) override;

include/wabt/binary-reader-nop.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,11 +121,14 @@ class BinaryReaderNop : public BinaryReaderDelegate {
121121
/* Table section */
122122
Result BeginTableSection(Offset size) override { return Result::Ok; }
123123
Result OnTableCount(Index count) override { return Result::Ok; }
124-
Result OnTable(Index index,
125-
Type elem_type,
126-
const Limits* elem_limits) override {
124+
Result BeginTable(Index index,
125+
Type elem_type,
126+
const Limits* elem_limits) override {
127127
return Result::Ok;
128128
}
129+
Result BeginTableInitExpr(Index index) override { return Result::Ok; }
130+
Result EndTableInitExpr(Index index) override { return Result::Ok; }
131+
Result EndTable(Index index) override { return Result::Ok; }
129132
Result EndTableSection() override { return Result::Ok; }
130133

131134
/* Memory section */

include/wabt/binary-reader.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,9 +156,12 @@ class BinaryReaderDelegate {
156156
/* Table section */
157157
virtual Result BeginTableSection(Offset size) = 0;
158158
virtual Result OnTableCount(Index count) = 0;
159-
virtual Result OnTable(Index index,
160-
Type elem_type,
161-
const Limits* elem_limits) = 0;
159+
virtual Result BeginTable(Index index,
160+
Type elem_type,
161+
const Limits* elem_limits) = 0;
162+
virtual Result BeginTableInitExpr(Index index) = 0;
163+
virtual Result EndTableInitExpr(Index index) = 0;
164+
virtual Result EndTable(Index index) = 0;
162165
virtual Result EndTableSection() = 0;
163166

164167
/* Memory section */

include/wabt/interp/interp-inl.h

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,16 @@ void RequireType(ValueType type) {
425425
inline bool TypesMatch(ValueType expected, ValueType actual) {
426426
// Currently there is no subtyping, so expected and actual must match
427427
// exactly. In the future this may be expanded.
428-
return expected == actual;
428+
if (expected == actual) {
429+
return true;
430+
}
431+
432+
if (actual == Type(Type::FuncRef, Type::ReferenceNonNull) &&
433+
expected == Type(Type::FuncRef, Type::ReferenceOrNull)) {
434+
return true;
435+
}
436+
437+
return false;
429438
}
430439

431440
//// Value ////
@@ -682,8 +691,8 @@ inline bool Table::classof(const Object* obj) {
682691
}
683692

684693
// static
685-
inline Table::Ptr Table::New(Store& store, TableType type) {
686-
return store.Alloc<Table>(store, type);
694+
inline Table::Ptr Table::New(Store& store, TableType type, Ref init_ref) {
695+
return store.Alloc<Table>(store, type, init_ref);
687696
}
688697

689698
inline const ExternType& Table::extern_type() {

include/wabt/interp/interp.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,7 @@ struct FuncDesc {
330330

331331
struct TableDesc {
332332
TableType type;
333+
FuncDesc init_func;
333334
};
334335

335336
struct MemoryDesc {
@@ -814,7 +815,7 @@ class Table : public Extern {
814815
static const char* GetTypeName() { return "Table"; }
815816
using Ptr = RefPtr<Table>;
816817

817-
static Table::Ptr New(Store&, TableType);
818+
static Table::Ptr New(Store&, TableType, Ref);
818819

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

@@ -846,7 +847,7 @@ class Table : public Extern {
846847

847848
private:
848849
friend Store;
849-
explicit Table(Store&, TableType);
850+
explicit Table(Store&, TableType, Ref);
850851
void Mark(Store&) override;
851852

852853
TableType type_;

include/wabt/ir.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -984,13 +984,14 @@ struct Table {
984984
std::string name;
985985
Limits elem_limits;
986986
Type elem_type;
987+
ExprList init_expr;
987988
};
988989

989990
using ExprListVector = std::vector<ExprList>;
990991

991992
struct ElemSegment {
992993
explicit ElemSegment(std::string_view name) : name(name) {}
993-
uint8_t GetFlags(const Module*) const;
994+
uint8_t GetFlags(const Module*, bool) const;
994995

995996
SegmentKind kind = SegmentKind::Active;
996997
std::string name;

src/apply-names.cc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ class NameApplier : public ExprVisitor::DelegateNop {
102102
Result VisitGlobal(Global* global);
103103
Result VisitTag(Tag* tag);
104104
Result VisitExport(Index export_index, Export* export_);
105+
Result VisitTable(Table* table);
105106
Result VisitElemSegment(Index elem_segment_index, ElemSegment* segment);
106107
Result VisitDataSegment(Index data_segment_index, DataSegment* segment);
107108
Result VisitStart(Var* start_var);
@@ -559,6 +560,11 @@ Result NameApplier::VisitExport(Index export_index, Export* export_) {
559560
return Result::Ok;
560561
}
561562

563+
Result NameApplier::VisitTable(Table* table) {
564+
CHECK_RESULT(visitor_.VisitExprList(table->init_expr));
565+
return Result::Ok;
566+
}
567+
562568
Result NameApplier::VisitElemSegment(Index elem_segment_index,
563569
ElemSegment* segment) {
564570
CHECK_RESULT(UseNameForTableVar(&segment->table_var));
@@ -594,6 +600,8 @@ Result NameApplier::VisitModule(Module* module) {
594600
CHECK_RESULT(VisitTag(module->tags[i]));
595601
for (size_t i = 0; i < module->exports.size(); ++i)
596602
CHECK_RESULT(VisitExport(i, module->exports[i]));
603+
for (size_t i = 0; i < module->tables.size(); ++i)
604+
CHECK_RESULT(VisitTable(module->tables[i]));
597605
for (size_t i = 0; i < module->elem_segments.size(); ++i)
598606
CHECK_RESULT(VisitElemSegment(i, module->elem_segments[i]));
599607
for (size_t i = 0; i < module->data_segments.size(); ++i)

src/binary-reader-ir.cc

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,11 @@ class BinaryReaderIR : public BinaryReaderNop {
144144
Result OnFunction(Index index, Index sig_index) override;
145145

146146
Result OnTableCount(Index count) override;
147-
Result OnTable(Index index,
148-
Type elem_type,
149-
const Limits* elem_limits) override;
147+
Result BeginTable(Index index,
148+
Type elem_type,
149+
const Limits* elem_limits) override;
150+
Result BeginTableInitExpr(Index index) override;
151+
Result EndTableInitExpr(Index index) override;
150152

151153
Result OnMemoryCount(Index count) override;
152154
Result OnMemory(Index index,
@@ -700,9 +702,9 @@ Result BinaryReaderIR::OnTableCount(Index count) {
700702
return Result::Ok;
701703
}
702704

703-
Result BinaryReaderIR::OnTable(Index index,
704-
Type elem_type,
705-
const Limits* elem_limits) {
705+
Result BinaryReaderIR::BeginTable(Index index,
706+
Type elem_type,
707+
const Limits* elem_limits) {
706708
auto field = std::make_unique<TableModuleField>(GetLocation());
707709
Table& table = field->table;
708710
table.elem_limits = *elem_limits;
@@ -712,6 +714,16 @@ Result BinaryReaderIR::OnTable(Index index,
712714
return Result::Ok;
713715
}
714716

717+
Result BinaryReaderIR::BeginTableInitExpr(Index index) {
718+
assert(index == module_->tables.size() - 1);
719+
Table* table = module_->tables[index];
720+
return BeginInitExpr(&table->init_expr);
721+
}
722+
723+
Result BinaryReaderIR::EndTableInitExpr(Index index) {
724+
return EndInitExpr();
725+
}
726+
715727
Result BinaryReaderIR::OnMemoryCount(Index count) {
716728
WABT_TRY
717729
module_->memories.reserve(module_->num_memory_imports + count);

src/binary-reader-logging.cc

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -255,14 +255,14 @@ Result BinaryReaderLogging::OnImportTag(Index import_index,
255255
sig_index);
256256
}
257257

258-
Result BinaryReaderLogging::OnTable(Index index,
259-
Type elem_type,
260-
const Limits* elem_limits) {
258+
Result BinaryReaderLogging::BeginTable(Index index,
259+
Type elem_type,
260+
const Limits* elem_limits) {
261261
char buf[100];
262262
SPrintLimits(buf, sizeof(buf), elem_limits);
263263
LOGF("OnTable(index: %" PRIindex ", elem_type: %s, %s)\n", index,
264264
elem_type.GetName().c_str(), buf);
265-
return reader_->OnTable(index, elem_type, elem_limits);
265+
return reader_->BeginTable(index, elem_type, elem_limits);
266266
}
267267

268268
Result BinaryReaderLogging::OnMemory(Index index,
@@ -821,6 +821,9 @@ DEFINE_END(EndFunctionSection)
821821

822822
DEFINE_BEGIN(BeginTableSection)
823823
DEFINE_INDEX(OnTableCount)
824+
DEFINE_INDEX(BeginTableInitExpr)
825+
DEFINE_INDEX(EndTableInitExpr)
826+
DEFINE_INDEX(EndTable)
824827
DEFINE_END(EndTableSection)
825828

826829
DEFINE_BEGIN(BeginMemorySection)

src/binary-reader-objdump.cc

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1127,9 +1127,9 @@ class BinaryReaderObjdump : public BinaryReaderObjdumpBase {
11271127
Result OnFunction(Index index, Index sig_index) override;
11281128

11291129
Result OnTableCount(Index count) override;
1130-
Result OnTable(Index index,
1131-
Type elem_type,
1132-
const Limits* elem_limits) override;
1130+
Result BeginTable(Index index,
1131+
Type elem_type,
1132+
const Limits* elem_limits) override;
11331133

11341134
Result OnMemoryCount(Index count) override;
11351135
Result OnMemory(Index index,
@@ -1176,6 +1176,14 @@ class BinaryReaderObjdump : public BinaryReaderObjdumpBase {
11761176

11771177
Result EndDataSegmentInitExpr(Index index) override { return EndInitExpr(); }
11781178

1179+
Result BeginTableInitExpr(Index index) override {
1180+
reading_table_init_expr_ = true;
1181+
BeginInitExpr();
1182+
return Result::Ok;
1183+
}
1184+
1185+
Result EndTableInitExpr(Index index) override { return EndInitExpr(); }
1186+
11791187
Result BeginGlobalInitExpr(Index index) override {
11801188
reading_global_init_expr_ = true;
11811189
BeginInitExpr();
@@ -1305,6 +1313,7 @@ class BinaryReaderObjdump : public BinaryReaderObjdumpBase {
13051313
Index elem_index_ = 0;
13061314
Index table_index_ = 0;
13071315
Index next_data_reloc_ = 0;
1316+
bool reading_table_init_expr_ = false;
13081317
bool reading_elem_init_expr_ = false;
13091318
bool reading_data_init_expr_ = false;
13101319
bool reading_global_init_expr_ = false;
@@ -1317,8 +1326,9 @@ class BinaryReaderObjdump : public BinaryReaderObjdumpBase {
13171326
uint64_t elem_offset_ = 0;
13181327

13191328
bool ReadingInitExpr() {
1320-
return reading_elem_init_expr_ || reading_data_init_expr_ ||
1321-
reading_global_init_expr_ || reading_elem_expr_;
1329+
return reading_table_init_expr_ || reading_elem_init_expr_ ||
1330+
reading_data_init_expr_ || reading_global_init_expr_ ||
1331+
reading_elem_expr_;
13221332
}
13231333
};
13241334

@@ -1697,9 +1707,9 @@ Result BinaryReaderObjdump::OnTableCount(Index count) {
16971707
return OnCount(count);
16981708
}
16991709

1700-
Result BinaryReaderObjdump::OnTable(Index index,
1701-
Type elem_type,
1702-
const Limits* elem_limits) {
1710+
Result BinaryReaderObjdump::BeginTable(Index index,
1711+
Type elem_type,
1712+
const Limits* elem_limits) {
17031713
PrintDetails(" - table[%" PRIindex "] type=%s initial=%" PRId64, index,
17041714
elem_type.GetName().c_str(), elem_limits->initial);
17051715
if (elem_limits->has_max) {
@@ -1922,6 +1932,9 @@ Result BinaryReaderObjdump::EndInitExpr() {
19221932
if (reading_data_init_expr_) {
19231933
reading_data_init_expr_ = false;
19241934
InitExprToConstOffset(current_init_expr_, &data_offset_);
1935+
} else if (reading_table_init_expr_) {
1936+
reading_table_init_expr_ = false;
1937+
InitExprToConstOffset(current_init_expr_, &elem_offset_);
19251938
} else if (reading_elem_init_expr_) {
19261939
reading_elem_init_expr_ = false;
19271940
InitExprToConstOffset(current_init_expr_, &elem_offset_);

0 commit comments

Comments
 (0)