summaryrefslogtreecommitdiff
path: root/src/validator.cc
diff options
context:
space:
mode:
authorSam Clegg <sbc@chromium.org>2019-11-07 18:42:51 -0800
committerGitHub <noreply@github.com>2019-11-07 18:42:51 -0800
commit2e2991e5a0e6a75d57c9ed6ff7ee0ae88adf253f (patch)
tree724bddd7110147c66163e6f230d4456e1e1e870f /src/validator.cc
parent2561eaca9cdba262eaa1e74ce877ffc7be543323 (diff)
downloadwabt-2e2991e5a0e6a75d57c9ed6ff7ee0ae88adf253f.tar.gz
wabt-2e2991e5a0e6a75d57c9ed6ff7ee0ae88adf253f.tar.bz2
wabt-2e2991e5a0e6a75d57c9ed6ff7ee0ae88adf253f.zip
Initial implementation of reftype proposal in the interpreter. (#1206)
- Implement ref.func everywhere. - Implement table.get and table.set in the interpreter.
Diffstat (limited to 'src/validator.cc')
-rw-r--r--src/validator.cc16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/validator.cc b/src/validator.cc
index 01bd6c8c..d3e9519a 100644
--- a/src/validator.cc
+++ b/src/validator.cc
@@ -80,6 +80,7 @@ class Validator : public ExprVisitor::Delegate {
Result OnTableSetExpr(TableSetExpr*) override;
Result OnTableGrowExpr(TableGrowExpr*) override;
Result OnTableSizeExpr(TableSizeExpr*) override;
+ Result OnRefFuncExpr(RefFuncExpr*) override;
Result OnRefNullExpr(RefNullExpr*) override;
Result OnRefIsNullExpr(RefIsNullExpr*) override;
Result OnNopExpr(NopExpr*) override;
@@ -826,6 +827,15 @@ Result Validator::OnTableSizeExpr(TableSizeExpr* expr) {
return Result::Ok;
}
+Result Validator::OnRefFuncExpr(RefFuncExpr* expr) {
+ expr_loc_ = &expr->loc;
+ const Func* callee;
+ if (Succeeded(CheckFuncVar(&expr->var, &callee))) {
+ typechecker_.OnRefFuncExpr(expr->var.index());
+ }
+ return Result::Ok;
+}
+
Result Validator::OnRefNullExpr(RefNullExpr* expr) {
expr_loc_ = &expr->loc;
typechecker_.OnRefNullExpr();
@@ -1069,10 +1079,14 @@ void Validator::CheckConstInitExpr(const Location* loc,
break;
}
+ case ExprType::RefFunc:
+ type = Type::Funcref;
+ break;
+
case ExprType::RefNull:
type = Type::Nullref;
break;
-
+
default:
PrintConstExprError(loc, desc);
return;