Skip to content

Commit 55015b7

Browse files
committed
Code improvements for call ref and br_on_[non_]null
1 parent 8be9a01 commit 55015b7

File tree

7 files changed

+91
-42
lines changed

7 files changed

+91
-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: 15 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+
void UseNameForLabelVar(Var* var);
101102
Result VisitFunc(Index func_index, Func* func);
102103
Result VisitGlobal(Global* global);
103104
Result VisitTag(Tag* tag);
@@ -242,6 +243,11 @@ Result NameApplier::UseNameForParamAndLocalVar(Func* func, Var* var) {
242243
return Result::Ok;
243244
}
244245

246+
void NameApplier::UseNameForLabelVar(Var* var) {
247+
std::string_view label = FindLabelByVar(var);
248+
UseNameForVar(label, var);
249+
}
250+
245251
Result NameApplier::BeginBlockExpr(BlockExpr* expr) {
246252
PushLabel(expr->block.label);
247253
return Result::Ok;
@@ -342,37 +348,31 @@ Result NameApplier::OnStoreExpr(StoreExpr* expr) {
342348
}
343349

344350
Result NameApplier::OnBrExpr(BrExpr* expr) {
345-
std::string_view label = FindLabelByVar(&expr->var);
346-
UseNameForVar(label, &expr->var);
351+
UseNameForLabelVar(&expr->var);
347352
return Result::Ok;
348353
}
349354

350355
Result NameApplier::OnBrIfExpr(BrIfExpr* expr) {
351-
std::string_view label = FindLabelByVar(&expr->var);
352-
UseNameForVar(label, &expr->var);
356+
UseNameForLabelVar(&expr->var);
353357
return Result::Ok;
354358
}
355359

356360
Result NameApplier::OnBrOnNonNullExpr(BrOnNonNullExpr* expr) {
357-
std::string_view label = FindLabelByVar(&expr->var);
358-
UseNameForVar(label, &expr->var);
361+
UseNameForLabelVar(&expr->var);
359362
return Result::Ok;
360363
}
361364

362365
Result NameApplier::OnBrOnNullExpr(BrOnNullExpr* expr) {
363-
std::string_view label = FindLabelByVar(&expr->var);
364-
UseNameForVar(label, &expr->var);
366+
UseNameForLabelVar(&expr->var);
365367
return Result::Ok;
366368
}
367369

368370
Result NameApplier::OnBrTableExpr(BrTableExpr* expr) {
369371
for (Var& target : expr->targets) {
370-
std::string_view label = FindLabelByVar(&target);
371-
UseNameForVar(label, &target);
372+
UseNameForLabelVar(&target);
372373
}
373374

374-
std::string_view label = FindLabelByVar(&expr->default_target);
375-
UseNameForVar(label, &expr->default_target);
375+
UseNameForLabelVar(&expr->default_target);
376376
return Result::Ok;
377377
}
378378

@@ -391,8 +391,7 @@ Result NameApplier::BeginTryTableExpr(TryTableExpr* expr) {
391391
if (!catch_.IsCatchAll()) {
392392
CHECK_RESULT(UseNameForTagVar(&catch_.tag));
393393
}
394-
std::string_view label = FindLabelByVar(&catch_.target);
395-
UseNameForVar(label, &catch_.target);
394+
UseNameForLabelVar(&catch_.target);
396395
}
397396
PushLabel(expr->block.label);
398397
return Result::Ok;
@@ -412,8 +411,7 @@ Result NameApplier::OnCatchExpr(TryExpr*, Catch* expr) {
412411

413412
Result NameApplier::OnDelegateExpr(TryExpr* expr) {
414413
PopLabel();
415-
std::string_view label = FindLabelByVar(&expr->delegate_target);
416-
UseNameForVar(label, &expr->delegate_target);
414+
UseNameForLabelVar(&expr->delegate_target);
417415
return Result::Ok;
418416
}
419417

@@ -423,8 +421,7 @@ Result NameApplier::OnThrowExpr(ThrowExpr* expr) {
423421
}
424422

425423
Result NameApplier::OnRethrowExpr(RethrowExpr* expr) {
426-
std::string_view label = FindLabelByVar(&expr->var);
427-
UseNameForVar(label, &expr->var);
424+
UseNameForLabelVar(&expr->var);
428425
return Result::Ok;
429426
}
430427

src/shared-validator.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -851,9 +851,9 @@ Result SharedValidator::OnCallIndirect(const Location& loc,
851851
Result SharedValidator::OnCallRef(const Location& loc, Var function_type_var) {
852852
Result result = CheckInstr(Opcode::CallRef, loc);
853853
FuncType func_type;
854-
result |= typechecker_.OnCallRef(function_type_var.to_type());
855854
result |= CheckFuncTypeIndex(function_type_var, &func_type);
856-
result |= typechecker_.OnCall(func_type.params, func_type.results);
855+
result |= typechecker_.OnCallRef(function_type_var.to_type(),
856+
func_type.params, func_type.results);
857857
return result;
858858
}
859859

@@ -1218,9 +1218,9 @@ Result SharedValidator::OnReturnCallRef(const Location& loc,
12181218
Var function_type_var) {
12191219
Result result = CheckInstr(Opcode::ReturnCallRef, loc);
12201220
FuncType func_type;
1221-
result |= typechecker_.OnReturnCallRef(function_type_var.to_type());
12221221
result |= CheckFuncTypeIndex(function_type_var, &func_type);
1223-
result |= typechecker_.OnReturnCall(func_type.params, func_type.results);
1222+
result |= typechecker_.OnReturnCallRef(function_type_var.to_type(),
1223+
func_type.params, func_type.results);
12241224
return result;
12251225
}
12261226

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)