Skip to content

Commit 574d773

Browse files
committed
Code improvements for call ref and br_on_[non_]null
1 parent ed94ed7 commit 574d773

File tree

7 files changed

+92
-42
lines changed

7 files changed

+92
-42
lines changed

include/wabt/type-checker.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,12 +97,16 @@ class TypeChecker {
9797
Result OnCallIndirect(const TypeVector& param_types,
9898
const TypeVector& result_types,
9999
const Limits& table_limits);
100-
Result OnCallRef(Type);
100+
Result OnCallRef(Type type,
101+
const TypeVector& param_types,
102+
const TypeVector& result_types);
101103
Result OnReturnCall(const TypeVector& param_types,
102104
const TypeVector& result_types);
103105
Result OnReturnCallIndirect(const TypeVector& param_types,
104106
const TypeVector& result_types);
105-
Result OnReturnCallRef(Type);
107+
Result OnReturnCallRef(Type type,
108+
const TypeVector& param_types,
109+
const TypeVector& result_types);
106110
Result OnCatch(const TypeVector& sig);
107111
Result OnCompare(Opcode);
108112
Result OnConst(Type);
@@ -191,6 +195,8 @@ class TypeChecker {
191195
Result PopAndCheckCall(const TypeVector& param_types,
192196
const TypeVector& result_types,
193197
const char* desc);
198+
Result PopAndCheckReturnCall(const TypeVector& result_types,
199+
const char* desc);
194200
Result PopAndCheck1Type(Type expected, const char* desc);
195201
Result PopAndCheck2Types(Type expected1, Type expected2, const char* desc);
196202
Result PopAndCheck3Types(Type expected1,

src/apply-names.cc

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ class NameApplier : public ExprVisitor::DelegateNop {
9898
Result UseNameForDataSegmentVar(Var* var);
9999
Result UseNameForElemSegmentVar(Var* var);
100100
Result UseNameForParamAndLocalVar(Func* func, Var* var);
101+
Result UseNameForLabelVar(Var* var);
101102
Result VisitFunc(Index func_index, Func* func);
102103
Result VisitGlobal(Global* global);
103104
Result VisitTag(Tag* tag);
@@ -241,6 +242,12 @@ Result NameApplier::UseNameForParamAndLocalVar(Func* func, Var* var) {
241242
return Result::Ok;
242243
}
243244

245+
Result NameApplier::UseNameForLabelVar(Var* var) {
246+
std::string_view label = FindLabelByVar(var);
247+
UseNameForVar(label, var);
248+
return Result::Ok;
249+
}
250+
244251
Result NameApplier::BeginBlockExpr(BlockExpr* expr) {
245252
PushLabel(expr->block.label);
246253
return Result::Ok;
@@ -341,37 +348,31 @@ Result NameApplier::OnStoreExpr(StoreExpr* expr) {
341348
}
342349

343350
Result NameApplier::OnBrExpr(BrExpr* expr) {
344-
std::string_view label = FindLabelByVar(&expr->var);
345-
UseNameForVar(label, &expr->var);
351+
UseNameForLabelVar(&expr->var);
346352
return Result::Ok;
347353
}
348354

349355
Result NameApplier::OnBrIfExpr(BrIfExpr* expr) {
350-
std::string_view label = FindLabelByVar(&expr->var);
351-
UseNameForVar(label, &expr->var);
356+
UseNameForLabelVar(&expr->var);
352357
return Result::Ok;
353358
}
354359

355360
Result NameApplier::OnBrOnNonNullExpr(BrOnNonNullExpr* expr) {
356-
std::string_view label = FindLabelByVar(&expr->var);
357-
UseNameForVar(label, &expr->var);
361+
UseNameForLabelVar(&expr->var);
358362
return Result::Ok;
359363
}
360364

361365
Result NameApplier::OnBrOnNullExpr(BrOnNullExpr* expr) {
362-
std::string_view label = FindLabelByVar(&expr->var);
363-
UseNameForVar(label, &expr->var);
366+
UseNameForLabelVar(&expr->var);
364367
return Result::Ok;
365368
}
366369

367370
Result NameApplier::OnBrTableExpr(BrTableExpr* expr) {
368371
for (Var& target : expr->targets) {
369-
std::string_view label = FindLabelByVar(&target);
370-
UseNameForVar(label, &target);
372+
UseNameForLabelVar(&target);
371373
}
372374

373-
std::string_view label = FindLabelByVar(&expr->default_target);
374-
UseNameForVar(label, &expr->default_target);
375+
UseNameForLabelVar(&expr->default_target);
375376
return Result::Ok;
376377
}
377378

@@ -390,8 +391,7 @@ Result NameApplier::BeginTryTableExpr(TryTableExpr* expr) {
390391
if (!catch_.IsCatchAll()) {
391392
CHECK_RESULT(UseNameForTagVar(&catch_.tag));
392393
}
393-
std::string_view label = FindLabelByVar(&catch_.target);
394-
UseNameForVar(label, &catch_.target);
394+
UseNameForLabelVar(&catch_.target);
395395
}
396396
PushLabel(expr->block.label);
397397
return Result::Ok;
@@ -411,8 +411,7 @@ Result NameApplier::OnCatchExpr(TryExpr*, Catch* expr) {
411411

412412
Result NameApplier::OnDelegateExpr(TryExpr* expr) {
413413
PopLabel();
414-
std::string_view label = FindLabelByVar(&expr->delegate_target);
415-
UseNameForVar(label, &expr->delegate_target);
414+
UseNameForLabelVar(&expr->delegate_target);
416415
return Result::Ok;
417416
}
418417

@@ -422,8 +421,7 @@ Result NameApplier::OnThrowExpr(ThrowExpr* expr) {
422421
}
423422

424423
Result NameApplier::OnRethrowExpr(RethrowExpr* expr) {
425-
std::string_view label = FindLabelByVar(&expr->var);
426-
UseNameForVar(label, &expr->var);
424+
UseNameForLabelVar(&expr->var);
427425
return Result::Ok;
428426
}
429427

src/shared-validator.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -847,9 +847,9 @@ Result SharedValidator::OnCallIndirect(const Location& loc,
847847
Result SharedValidator::OnCallRef(const Location& loc, Var function_type_var) {
848848
Result result = CheckInstr(Opcode::CallRef, loc);
849849
FuncType func_type;
850-
result |= typechecker_.OnCallRef(function_type_var.to_type());
851850
result |= CheckFuncTypeIndex(function_type_var, &func_type);
852-
result |= typechecker_.OnCall(func_type.params, func_type.results);
851+
result |= typechecker_.OnCallRef(function_type_var.to_type(),
852+
func_type.params, func_type.results);
853853
return result;
854854
}
855855

@@ -1214,9 +1214,9 @@ Result SharedValidator::OnReturnCallRef(const Location& loc,
12141214
Var function_type_var) {
12151215
Result result = CheckInstr(Opcode::ReturnCallRef, loc);
12161216
FuncType func_type;
1217-
result |= typechecker_.OnReturnCallRef(function_type_var.to_type());
12181217
result |= CheckFuncTypeIndex(function_type_var, &func_type);
1219-
result |= typechecker_.OnReturnCall(func_type.params, func_type.results);
1218+
result |= typechecker_.OnReturnCallRef(function_type_var.to_type(),
1219+
func_type.params, func_type.results);
12201220
return result;
12211221
}
12221222

src/type-checker.cc

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,17 @@ Result TypeChecker::PopAndCheckCall(const TypeVector& param_types,
372372
return result;
373373
}
374374

375+
Result TypeChecker::PopAndCheckReturnCall(const TypeVector& result_types,
376+
const char* desc) {
377+
Label* func_label;
378+
CHECK_RESULT(GetThisFunctionLabel(&func_label));
379+
Result result =
380+
CheckReturnSignature(result_types, func_label->result_types, desc);
381+
382+
CHECK_RESULT(SetUnreachable());
383+
return result;
384+
}
385+
375386
Result TypeChecker::PopAndCheck1Type(Type expected, const char* desc) {
376387
Result result = Result::Ok;
377388
result |= PeekAndCheckType(0, expected);
@@ -658,19 +669,18 @@ Result TypeChecker::OnCallIndirect(const TypeVector& param_types,
658669
return result;
659670
}
660671

661-
Result TypeChecker::OnCallRef(Type type) {
662-
return PopAndCheck1Type(type, "call_ref");
672+
Result TypeChecker::OnCallRef(Type type,
673+
const TypeVector& param_types,
674+
const TypeVector& result_types) {
675+
Result result = PopAndCheck1Type(type, "call_ref");
676+
result |= PopAndCheckCall(param_types, result_types, "call_ref");
677+
return result;
663678
}
664679

665680
Result TypeChecker::OnReturnCall(const TypeVector& param_types,
666681
const TypeVector& result_types) {
667682
Result result = PopAndCheckSignature(param_types, "return_call");
668-
Label* func_label;
669-
CHECK_RESULT(GetThisFunctionLabel(&func_label));
670-
result |= CheckReturnSignature(result_types, func_label->result_types,
671-
"return_call");
672-
673-
CHECK_RESULT(SetUnreachable());
683+
result |= PopAndCheckReturnCall(result_types, "return_call");
674684
return result;
675685
}
676686

@@ -679,17 +689,18 @@ Result TypeChecker::OnReturnCallIndirect(const TypeVector& param_types,
679689
Result result = PopAndCheck1Type(Type::I32, "return_call_indirect");
680690

681691
result |= PopAndCheckSignature(param_types, "return_call_indirect");
682-
Label* func_label;
683-
CHECK_RESULT(GetThisFunctionLabel(&func_label));
684-
result |= CheckReturnSignature(result_types, func_label->result_types,
685-
"return_call_indirect");
686-
687-
CHECK_RESULT(SetUnreachable());
692+
result |= PopAndCheckReturnCall(result_types, "return_call_indirect");
688693
return result;
689694
}
690695

691-
Result TypeChecker::OnReturnCallRef(Type type) {
692-
return PopAndCheck1Type(type, "return_call_ref");
696+
Result TypeChecker::OnReturnCallRef(Type type,
697+
const TypeVector& param_types,
698+
const TypeVector& result_types) {
699+
Result result = PopAndCheck1Type(type, "return_call_ref");
700+
701+
result |= PopAndCheckSignature(param_types, "return_call_ref");
702+
result |= PopAndCheckReturnCall(result_types, "return_call_ref");
703+
return result;
693704
}
694705

695706
Result TypeChecker::OnCompare(Opcode opcode) {

test/parse/bad-call-ref.txt

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
;;; TOOL: wat2wasm
2+
;;; ARGS: --enable-function-references
3+
;;; ERROR: 1
4+
(module
5+
;; Implicit type declarations are not allowed
6+
(type $t0 (func (param f32 f32)))
7+
8+
(func $f1
9+
i32.const 1
10+
i32.const 2
11+
i32.const 3
12+
call_ref $t0
13+
)
14+
15+
(func $f2
16+
i32.const 1
17+
i32.const 2
18+
i32.const 3
19+
return_call_ref $t0
20+
)
21+
)
22+
(;; STDERR ;;;
23+
out/test/parse/bad-call-ref.txt:12:5: error: type mismatch in call_ref, expected [(ref null 0)] but got [... i32]
24+
call_ref $t0
25+
^^^^^^^^
26+
out/test/parse/bad-call-ref.txt:12:5: error: type mismatch in call_ref, expected [f32, f32] but got [i32, i32]
27+
call_ref $t0
28+
^^^^^^^^
29+
out/test/parse/bad-call-ref.txt:19:5: error: type mismatch in return_call_ref, expected [(ref null 0)] but got [... i32]
30+
return_call_ref $t0
31+
^^^^^^^^^^^^^^^
32+
out/test/parse/bad-call-ref.txt:19:5: error: type mismatch in return_call_ref, expected [f32, f32] but got [i32, i32]
33+
return_call_ref $t0
34+
^^^^^^^^^^^^^^^
35+
;;; STDERR ;;)

test/spec/function-references/call_ref.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ out/test/spec/function-references/call_ref.wast:136: assert_trap passed: unreach
77
out/test/spec/function-references/call_ref.wast:149: assert_trap passed: unreachable executed
88
out/test/spec/function-references/call_ref.wast:165: assert_trap passed: unreachable executed
99
out/test/spec/function-references/call_ref.wast:168: assert_invalid passed:
10-
out/test/spec/function-references/call_ref/call_ref.4.wasm:0000042: error: type mismatch in call, expected [i32] but got [i64]
10+
out/test/spec/function-references/call_ref/call_ref.4.wasm:0000042: error: type mismatch in call_ref, expected [i32] but got [i64]
1111
0000042: error: OnCallRefExpr callback failed
1212
out/test/spec/function-references/call_ref.wast:184: assert_invalid passed:
1313
out/test/spec/function-references/call_ref/call_ref.5.wasm:0000044: error: type mismatch in implicit return, expected [i32] but got [i64]

test/spec/function-references/return_call_ref.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ out/test/spec/function-references/return_call_ref.wast:306: assert_trap passed:
2626
out/test/spec/function-references/return_call_ref.wast:319: assert_trap passed: unreachable executed
2727
out/test/spec/function-references/return_call_ref.wast:334: assert_trap passed: unreachable executed
2828
out/test/spec/function-references/return_call_ref.wast:337: assert_invalid passed:
29-
out/test/spec/function-references/return_call_ref/return_call_ref.11.wasm:0000042: error: type mismatch in return_call, expected [i32] but got [i64]
29+
out/test/spec/function-references/return_call_ref/return_call_ref.11.wasm:0000042: error: type mismatch in return_call_ref, expected [i32] but got [i64]
3030
0000042: error: OnReturnCallRefExpr callback failed
3131
out/test/spec/function-references/return_call_ref.wast:353: assert_invalid passed:
3232
out/test/spec/function-references/return_call_ref/return_call_ref.12.wasm:0000043: error: type mismatch in implicit return, expected [i32] but got [i64]

0 commit comments

Comments
 (0)