From 2e2991e5a0e6a75d57c9ed6ff7ee0ae88adf253f Mon Sep 17 00:00:00 2001 From: Sam Clegg Date: Thu, 7 Nov 2019 18:42:51 -0800 Subject: Initial implementation of reftype proposal in the interpreter. (#1206) - Implement ref.func everywhere. - Implement table.get and table.set in the interpreter. --- src/validator.cc | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'src/validator.cc') 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; -- cgit v1.2.3