Skip to content

Commit 58cbc74

Browse files
committed
Implement ref.as_non_null, br_non_null, br_on_non_null instructions
1 parent 61bf5d3 commit 58cbc74

33 files changed

+997
-601
lines changed

include/wabt/binary-reader-logging.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,8 @@ class BinaryReaderLogging : public BinaryReaderDelegate {
174174
Result OnBlockExpr(Type sig_type) override;
175175
Result OnBrExpr(Index depth) override;
176176
Result OnBrIfExpr(Index depth) override;
177+
Result OnBrOnNonNullExpr(Index depth) override;
178+
Result OnBrOnNullExpr(Index depth) override;
177179
Result OnBrTableExpr(Index num_targets,
178180
Index* target_depths,
179181
Index default_target_depth) override;
@@ -218,6 +220,7 @@ class BinaryReaderLogging : public BinaryReaderDelegate {
218220
Result OnTableGrowExpr(Index table) override;
219221
Result OnTableSizeExpr(Index table) override;
220222
Result OnTableFillExpr(Index table) override;
223+
Result OnRefAsNonNullExpr() override;
221224
Result OnRefFuncExpr(Index index) override;
222225
Result OnRefNullExpr(Type type) override;
223226
Result OnRefIsNullExpr() override;

include/wabt/binary-reader-nop.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,8 @@ class BinaryReaderNop : public BinaryReaderDelegate {
241241
Result OnBlockExpr(Type sig_type) override { return Result::Ok; }
242242
Result OnBrExpr(Index depth) override { return Result::Ok; }
243243
Result OnBrIfExpr(Index depth) override { return Result::Ok; }
244+
Result OnBrOnNonNullExpr(Index depth) override { return Result::Ok; }
245+
Result OnBrOnNullExpr(Index depth) override { return Result::Ok; }
244246
Result OnBrTableExpr(Index num_targets,
245247
Index* target_depths,
246248
Index default_target_depth) override {
@@ -299,6 +301,7 @@ class BinaryReaderNop : public BinaryReaderDelegate {
299301
Result OnTableGrowExpr(Index table_index) override { return Result::Ok; }
300302
Result OnTableSizeExpr(Index table_index) override { return Result::Ok; }
301303
Result OnTableFillExpr(Index table_index) override { return Result::Ok; }
304+
Result OnRefAsNonNullExpr() override { return Result::Ok; }
302305
Result OnRefFuncExpr(Index func_index) override { return Result::Ok; }
303306
Result OnRefNullExpr(Type type) override { return Result::Ok; }
304307
Result OnRefIsNullExpr() override { return Result::Ok; }

include/wabt/binary-reader.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,8 @@ class BinaryReaderDelegate {
250250
virtual Result OnBlockExpr(Type sig_type) = 0;
251251
virtual Result OnBrExpr(Index depth) = 0;
252252
virtual Result OnBrIfExpr(Index depth) = 0;
253+
virtual Result OnBrOnNonNullExpr(Index depth) = 0;
254+
virtual Result OnBrOnNullExpr(Index depth) = 0;
253255
virtual Result OnBrTableExpr(Index num_targets,
254256
Index* target_depths,
255257
Index default_target_depth) = 0;
@@ -294,6 +296,7 @@ class BinaryReaderDelegate {
294296
virtual Result OnTableGrowExpr(Index table_index) = 0;
295297
virtual Result OnTableSizeExpr(Index table_index) = 0;
296298
virtual Result OnTableFillExpr(Index table_index) = 0;
299+
virtual Result OnRefAsNonNullExpr() = 0;
297300
virtual Result OnRefFuncExpr(Index func_index) = 0;
298301
virtual Result OnRefNullExpr(Type type) = 0;
299302
virtual Result OnRefIsNullExpr() = 0;

include/wabt/expr-visitor.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ class ExprVisitor::Delegate {
7373
virtual Result EndBlockExpr(BlockExpr*) = 0;
7474
virtual Result OnBrExpr(BrExpr*) = 0;
7575
virtual Result OnBrIfExpr(BrIfExpr*) = 0;
76+
virtual Result OnBrOnNonNullExpr(BrOnNonNullExpr*) = 0;
77+
virtual Result OnBrOnNullExpr(BrOnNullExpr*) = 0;
7678
virtual Result OnBrTableExpr(BrTableExpr*) = 0;
7779
virtual Result BeginTryTableExpr(TryTableExpr*) = 0;
7880
virtual Result EndTryTableExpr(TryTableExpr*) = 0;
@@ -109,6 +111,7 @@ class ExprVisitor::Delegate {
109111
virtual Result OnTableGrowExpr(TableGrowExpr*) = 0;
110112
virtual Result OnTableSizeExpr(TableSizeExpr*) = 0;
111113
virtual Result OnTableFillExpr(TableFillExpr*) = 0;
114+
virtual Result OnRefAsNonNullExpr(RefAsNonNullExpr*) = 0;
112115
virtual Result OnRefFuncExpr(RefFuncExpr*) = 0;
113116
virtual Result OnRefNullExpr(RefNullExpr*) = 0;
114117
virtual Result OnRefIsNullExpr(RefIsNullExpr*) = 0;
@@ -150,6 +153,8 @@ class ExprVisitor::DelegateNop : public ExprVisitor::Delegate {
150153
Result EndBlockExpr(BlockExpr*) override { return Result::Ok; }
151154
Result OnBrExpr(BrExpr*) override { return Result::Ok; }
152155
Result OnBrIfExpr(BrIfExpr*) override { return Result::Ok; }
156+
Result OnBrOnNonNullExpr(BrOnNonNullExpr*) override { return Result::Ok; };
157+
Result OnBrOnNullExpr(BrOnNullExpr*) override { return Result::Ok; };
153158
Result OnBrTableExpr(BrTableExpr*) override { return Result::Ok; }
154159
Result BeginTryTableExpr(TryTableExpr*) override { return Result::Ok; }
155160
Result EndTryTableExpr(TryTableExpr*) override { return Result::Ok; }
@@ -186,6 +191,7 @@ class ExprVisitor::DelegateNop : public ExprVisitor::Delegate {
186191
Result OnTableGrowExpr(TableGrowExpr*) override { return Result::Ok; }
187192
Result OnTableSizeExpr(TableSizeExpr*) override { return Result::Ok; }
188193
Result OnTableFillExpr(TableFillExpr*) override { return Result::Ok; }
194+
Result OnRefAsNonNullExpr(RefAsNonNullExpr*) override { return Result::Ok; }
189195
Result OnRefFuncExpr(RefFuncExpr*) override { return Result::Ok; }
190196
Result OnRefNullExpr(RefNullExpr*) override { return Result::Ok; }
191197
Result OnRefIsNullExpr(RefIsNullExpr*) override { return Result::Ok; }

include/wabt/ir.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,8 @@ enum class ExprType {
398398
Block,
399399
Br,
400400
BrIf,
401+
BrOnNonNull,
402+
BrOnNull,
401403
BrTable,
402404
Call,
403405
CallIndirect,
@@ -422,6 +424,7 @@ enum class ExprType {
422424
MemoryInit,
423425
MemorySize,
424426
Nop,
427+
RefAsNonNull,
425428
RefIsNull,
426429
RefFunc,
427430
RefNull,
@@ -592,6 +595,7 @@ using CompareExpr = OpcodeExpr<ExprType::Compare>;
592595
using ConvertExpr = OpcodeExpr<ExprType::Convert>;
593596
using UnaryExpr = OpcodeExpr<ExprType::Unary>;
594597
using TernaryExpr = OpcodeExpr<ExprType::Ternary>;
598+
using RefAsNonNullExpr = OpcodeExpr<ExprType::RefAsNonNull>;
595599

596600
class SimdLaneOpExpr : public ExprMixin<ExprType::SimdLaneOp> {
597601
public:
@@ -671,6 +675,8 @@ class MemoryVarExpr : public MemoryExpr<TypeEnum> {
671675

672676
using BrExpr = VarExpr<ExprType::Br>;
673677
using BrIfExpr = VarExpr<ExprType::BrIf>;
678+
using BrOnNonNullExpr = VarExpr<ExprType::BrOnNonNull>;
679+
using BrOnNullExpr = VarExpr<ExprType::BrOnNull>;
674680
using CallExpr = VarExpr<ExprType::Call>;
675681
using RefFuncExpr = VarExpr<ExprType::RefFunc>;
676682
using GlobalGetExpr = VarExpr<ExprType::GlobalGet>;

include/wabt/opcode.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,9 @@ WABT_OPCODE(___, I32, ___, I32, 0, 0xfc, 0x11, TableFill, "table.fill", "")
267267
WABT_OPCODE(___, ___, ___, ___, 0, 0, 0xd0, RefNull, "ref.null", "")
268268
WABT_OPCODE(___, ___, ___, ___, 0, 0, 0xd1, RefIsNull, "ref.is_null", "")
269269
WABT_OPCODE(___, ___, ___, ___, 0, 0, 0xd2, RefFunc, "ref.func", "")
270+
WABT_OPCODE(___, ___, ___, ___, 0, 0, 0xd4, RefAsNonNull, "ref.as_non_null", "")
271+
WABT_OPCODE(___, ___, ___, ___, 0, 0, 0xd5, BrOnNull, "br_on_null", "")
272+
WABT_OPCODE(___, ___, ___, ___, 0, 0, 0xd6, BrOnNonNull, "br_on_non_null", "")
270273

271274
/* Simd opcodes */
272275
WABT_OPCODE(V128, I32, ___, ___, 16, 0xfd, 0x00, V128Load, "v128.load", "")

include/wabt/shared-validator.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,8 @@ class SharedValidator {
136136
Result OnBlock(const Location&, Type sig_type);
137137
Result OnBr(const Location&, Var depth);
138138
Result OnBrIf(const Location&, Var depth);
139+
Result OnBrOnNonNull(const Location&, Var depth);
140+
Result OnBrOnNull(const Location&, Var depth);
139141
Result BeginBrTable(const Location&);
140142
Result OnBrTableTarget(const Location&, Var depth);
141143
Result EndBrTable(const Location&);
@@ -176,6 +178,7 @@ class SharedValidator {
176178
Result OnMemoryInit(const Location&, Var segment_var, Var memidx);
177179
Result OnMemorySize(const Location&, Var memidx);
178180
Result OnNop(const Location&);
181+
Result OnRefAsNonNull(const Location&);
179182
Result OnRefFunc(const Location&, Var func_var);
180183
Result OnRefIsNull(const Location&);
181184
Result OnRefNull(const Location&, Var func_type_var);

include/wabt/token.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ WABT_TOKEN(Binary, "BINARY")
9999
WABT_TOKEN(Block, "block")
100100
WABT_TOKEN(Br, "br")
101101
WABT_TOKEN(BrIf, "br_if")
102+
WABT_TOKEN(BrOnNonNull, "br_on_non_null")
103+
WABT_TOKEN(BrOnNull, "br_on_null")
102104
WABT_TOKEN(BrTable, "br_table")
103105
WABT_TOKEN(Code, "code")
104106
WABT_TOKEN(Call, "call")
@@ -130,6 +132,7 @@ WABT_TOKEN(MemoryGrow, "memory.grow")
130132
WABT_TOKEN(MemoryInit, "memory.init")
131133
WABT_TOKEN(MemorySize, "memory.size")
132134
WABT_TOKEN(Nop, "nop")
135+
WABT_TOKEN(RefAsNonNull, "ref.as_non_null")
133136
WABT_TOKEN(RefExtern, "ref.extern")
134137
WABT_TOKEN(RefFunc, "ref.func")
135138
WABT_TOKEN(RefIsNull, "ref.is_null")

include/wabt/type-checker.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ class TypeChecker {
8787
Result OnBlock(const TypeVector& param_types, const TypeVector& result_types);
8888
Result OnBr(Index depth);
8989
Result OnBrIf(Index depth);
90+
Result OnBrOnNonNull(Index depth);
91+
Result OnBrOnNull(Index depth);
9092
Result BeginBrTable();
9193
Result OnBrTableTarget(Index depth);
9294
Result EndBrTable();
@@ -129,6 +131,7 @@ class TypeChecker {
129131
Result OnTableGrow(Type elem_type, const Limits& limits);
130132
Result OnTableSize(const Limits& limits);
131133
Result OnTableFill(Type elem_type, const Limits& limits);
134+
Result OnRefAsNonNullExpr();
132135
Result OnRefFuncExpr(Index func_type, bool force_generic_funcref);
133136
Result OnRefNullExpr(Type type);
134137
Result OnRefIsNullExpr();
@@ -192,6 +195,7 @@ class TypeChecker {
192195
Type expected2,
193196
Type expected3,
194197
const char* desc);
198+
Result PopAndCheckReference(Type* actual, const char* desc);
195199
Result CheckOpcode1(Opcode opcode, const Limits* limits = nullptr);
196200
Result CheckOpcode2(Opcode opcode, const Limits* limits = nullptr);
197201
Result CheckOpcode3(Opcode opcode,

src/apply-names.cc

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ class NameApplier : public ExprVisitor::DelegateNop {
4040
Result EndBlockExpr(BlockExpr*) override;
4141
Result OnBrExpr(BrExpr*) override;
4242
Result OnBrIfExpr(BrIfExpr*) override;
43+
Result OnBrOnNonNullExpr(BrOnNonNullExpr*) override;
44+
Result OnBrOnNullExpr(BrOnNullExpr*) override;
4345
Result OnBrTableExpr(BrTableExpr*) override;
4446
Result OnCallExpr(CallExpr*) override;
4547
Result OnRefFuncExpr(RefFuncExpr*) override;
@@ -350,6 +352,18 @@ Result NameApplier::OnBrIfExpr(BrIfExpr* expr) {
350352
return Result::Ok;
351353
}
352354

355+
Result NameApplier::OnBrOnNonNullExpr(BrOnNonNullExpr* expr) {
356+
std::string_view label = FindLabelByVar(&expr->var);
357+
UseNameForVar(label, &expr->var);
358+
return Result::Ok;
359+
}
360+
361+
Result NameApplier::OnBrOnNullExpr(BrOnNullExpr* expr) {
362+
std::string_view label = FindLabelByVar(&expr->var);
363+
UseNameForVar(label, &expr->var);
364+
return Result::Ok;
365+
}
366+
353367
Result NameApplier::OnBrTableExpr(BrTableExpr* expr) {
354368
for (Var& target : expr->targets) {
355369
std::string_view label = FindLabelByVar(&target);

0 commit comments

Comments
 (0)