Skip to content

Commit f461492

Browse files
authored
Implement bulk memory in the interpreter (#1074)
* Implement bulk memory in interpreter * Read/Write elem_type in element segments * Binary format * Text format (`(elem passive funcref...)`) * Add DataSegment runtime objects * Only initialize active data segments when instantiating
1 parent 3b8dfbf commit f461492

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+10537
-8699
lines changed

src/binary-reader-ir.cc

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,10 @@ class BinaryReaderIR : public BinaryReaderNop {
198198
Result OnSimdShuffleOpExpr(Opcode opcode, v128 value) override;
199199

200200
Result OnElemSegmentCount(Index count) override;
201-
Result BeginElemSegment(Index index, Index table_index, bool passive) override;
201+
Result BeginElemSegment(Index index,
202+
Index table_index,
203+
bool passive,
204+
Type elem_type) override;
202205
Result BeginElemSegmentInitExpr(Index index) override;
203206
Result EndElemSegmentInitExpr(Index index) override;
204207
Result OnElemSegmentElemExprCount(Index index, Index count) override;
@@ -984,11 +987,13 @@ Result BinaryReaderIR::OnElemSegmentCount(Index count) {
984987

985988
Result BinaryReaderIR::BeginElemSegment(Index index,
986989
Index table_index,
987-
bool passive) {
990+
bool passive,
991+
Type elem_type) {
988992
auto field = MakeUnique<ElemSegmentModuleField>(GetLocation());
989993
ElemSegment& elem_segment = field->elem_segment;
990994
elem_segment.table_var = Var(table_index, GetLocation());
991995
elem_segment.passive = passive;
996+
elem_segment.elem_type = elem_type;
992997
module_->AppendField(std::move(field));
993998
return Result::Ok;
994999
}

src/binary-reader-logging.cc

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,16 @@ Result BinaryReaderLogging::OnSimdShuffleOpExpr(Opcode opcode, v128 value) {
359359
return reader_->OnSimdShuffleOpExpr(opcode, value);
360360
}
361361

362+
Result BinaryReaderLogging::BeginElemSegment(Index index,
363+
Index table_index,
364+
bool passive,
365+
Type elem_type) {
366+
LOGF("BeginElemSegment(index: %" PRIindex ", table_index: %" PRIindex
367+
", passive: %s, elem_type: %s)\n",
368+
index, table_index, passive ? "true" : "false", GetTypeName(elem_type));
369+
return reader_->BeginElemSegment(index, table_index, passive, elem_type);
370+
}
371+
362372
Result BinaryReaderLogging::OnDataSegmentData(Index index,
363373
const void* data,
364374
Address size) {
@@ -723,7 +733,6 @@ DEFINE_END(EndCodeSection)
723733

724734
DEFINE_BEGIN(BeginElemSection)
725735
DEFINE_INDEX(OnElemSegmentCount)
726-
DEFINE_INDEX_INDEX_BOOL(BeginElemSegment, "index", "table_index", "passive")
727736
DEFINE_INDEX(BeginElemSegmentInitExpr)
728737
DEFINE_INDEX(EndElemSegmentInitExpr)
729738
DEFINE_INDEX_INDEX(OnElemSegmentElemExprCount, "index", "count")

src/binary-reader-logging.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,10 @@ class BinaryReaderLogging : public BinaryReaderDelegate {
221221

222222
Result BeginElemSection(Offset size) override;
223223
Result OnElemSegmentCount(Index count) override;
224-
Result BeginElemSegment(Index index, Index table_index, bool passive) override;
224+
Result BeginElemSegment(Index index,
225+
Index table_index,
226+
bool passive,
227+
Type elem_type) override;
225228
Result BeginElemSegmentInitExpr(Index index) override;
226229
Result EndElemSegmentInitExpr(Index index) override;
227230
Result OnElemSegmentElemExprCount(Index index, Index count) override;

src/binary-reader-nop.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,10 @@ class BinaryReaderNop : public BinaryReaderDelegate {
286286
/* Elem section */
287287
Result BeginElemSection(Offset size) override { return Result::Ok; }
288288
Result OnElemSegmentCount(Index count) override { return Result::Ok; }
289-
Result BeginElemSegment(Index index, Index table_index, bool passive) override {
289+
Result BeginElemSegment(Index index,
290+
Index table_index,
291+
bool passive,
292+
Type elem_type) override {
290293
return Result::Ok;
291294
}
292295
Result BeginElemSegmentInitExpr(Index index) override { return Result::Ok; }

src/binary-reader-objdump.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -771,7 +771,8 @@ class BinaryReaderObjdump : public BinaryReaderObjdumpBase {
771771
Result OnElemSegmentCount(Index count) override;
772772
Result BeginElemSegment(Index index,
773773
Index table_index,
774-
bool passive) override;
774+
bool passive,
775+
Type elem_type) override;
775776
Result OnElemSegmentElemExprCount(Index index, Index count) override;
776777
Result OnElemSegmentElemExpr_RefNull(Index segment_index) override;
777778
Result OnElemSegmentElemExpr_RefFunc(Index segment_index,
@@ -1216,7 +1217,8 @@ Result BinaryReaderObjdump::OnElemSegmentCount(Index count) {
12161217

12171218
Result BinaryReaderObjdump::BeginElemSegment(Index index,
12181219
Index table_index,
1219-
bool passive) {
1220+
bool passive,
1221+
Type elem_type) {
12201222
table_index_ = table_index;
12211223
elem_index_ = 0;
12221224
return Result::Ok;

src/binary-reader.cc

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2078,7 +2078,18 @@ Result BinaryReader::ReadElemSection(Offset section_size) {
20782078
if (flags == SegmentFlags::IndexOther) {
20792079
CHECK_RESULT(ReadIndex(&table_index, "elem segment table index"));
20802080
}
2081-
CALLBACK(BeginElemSegment, i, table_index, flags == SegmentFlags::Passive);
2081+
Type elem_type;
2082+
if (flags == SegmentFlags::Passive) {
2083+
CHECK_RESULT(ReadType(&elem_type, "table elem type"));
2084+
ERROR_UNLESS(elem_type == Type::Funcref || elem_type == Type::Anyref,
2085+
"segment elem type must by funcref or anyref");
2086+
} else {
2087+
elem_type = Type::Funcref;
2088+
}
2089+
2090+
CALLBACK(BeginElemSegment, i, table_index, flags == SegmentFlags::Passive,
2091+
elem_type);
2092+
20822093
if (flags != SegmentFlags::Passive) {
20832094
CALLBACK(BeginElemSegmentInitExpr, i);
20842095
CHECK_RESULT(ReadI32InitExpr(i));

src/binary-reader.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,8 @@ class BinaryReaderDelegate {
278278
virtual Result OnElemSegmentCount(Index count) = 0;
279279
virtual Result BeginElemSegment(Index index,
280280
Index table_index,
281-
bool passive) = 0;
281+
bool passive,
282+
Type elem_type) = 0;
282283
virtual Result BeginElemSegmentInitExpr(Index index) = 0;
283284
virtual Result EndElemSegmentInitExpr(Index index) = 0;
284285
virtual Result OnElemSegmentElemExprCount(Index index, Index count) = 0;

src/binary-writer.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1019,6 +1019,7 @@ Result BinaryWriter::WriteModule() {
10191019
WriteHeader("elem segment header", i);
10201020
if (segment->passive) {
10211021
stream_->WriteU8(static_cast<uint8_t>(SegmentFlags::Passive));
1022+
WriteType(stream_, segment->elem_type);
10221023
} else {
10231024
assert(module_->GetTableIndex(segment->table_var) == 0);
10241025
stream_->WriteU8(static_cast<uint8_t>(SegmentFlags::IndexZero));

0 commit comments

Comments
 (0)