summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBen Smith <binjimin@gmail.com>2017-06-23 18:41:59 -0700
committerGitHub <noreply@github.com>2017-06-23 18:41:59 -0700
commit29e8e9ee0068b0f90f30c69c4f6c0c3fd30bf96e (patch)
tree07ac2e58343a65309726118ab2908a61a7144f05 /src
parent72edc598a20d79d5d19caf7b397be4254a7d5fb8 (diff)
downloadwabt-29e8e9ee0068b0f90f30c69c4f6c0c3fd30bf96e.tar.gz
wabt-29e8e9ee0068b0f90f30c69c4f6c0c3fd30bf96e.tar.bz2
wabt-29e8e9ee0068b0f90f30c69c4f6c0c3fd30bf96e.zip
Refactor Expr as class hierarchy instead of union (#524)
This has the benefit of making things much more type-safe, as well as simplifying destroying member variables. For now, many of the members are still raw pointers, but they probably should become unique_ptrs or ordinary values.
Diffstat (limited to 'src')
-rw-r--r--src/apply-names.cc96
-rw-r--r--src/binary-reader-ir.cc87
-rw-r--r--src/binary-writer.cc99
-rw-r--r--src/expr-visitor.cc101
-rw-r--r--src/expr-visitor.h149
-rw-r--r--src/generate-names.cc16
-rw-r--r--src/ir.cc289
-rw-r--r--src/ir.h189
-rw-r--r--src/prebuilt/wast-parser-gen.cc1224
-rw-r--r--src/resolve-names.cc116
-rw-r--r--src/validator.cc128
-rw-r--r--src/wast-parser-lexer-shared.h1
-rw-r--r--src/wast-parser.y147
-rw-r--r--src/wat-writer.cc126
14 files changed, 1308 insertions, 1460 deletions
diff --git a/src/apply-names.cc b/src/apply-names.cc
index 1197968a..a0d55818 100644
--- a/src/apply-names.cc
+++ b/src/apply-names.cc
@@ -40,22 +40,22 @@ class NameApplier : public ExprVisitor::DelegateNop {
Result VisitModule(Module* module);
// Implementation of ExprVisitor::DelegateNop.
- Result BeginBlockExpr(Expr*) override;
- Result EndBlockExpr(Expr*) override;
- Result OnBrExpr(Expr*) override;
- Result OnBrIfExpr(Expr*) override;
- Result OnBrTableExpr(Expr*) override;
- Result OnCallExpr(Expr*) override;
- Result OnCallIndirectExpr(Expr*) override;
- Result OnGetGlobalExpr(Expr*) override;
- Result OnGetLocalExpr(Expr*) override;
- Result BeginIfExpr(Expr*) override;
- Result EndIfExpr(Expr*) override;
- Result BeginLoopExpr(Expr*) override;
- Result EndLoopExpr(Expr*) override;
- Result OnSetGlobalExpr(Expr*) override;
- Result OnSetLocalExpr(Expr*) override;
- Result OnTeeLocalExpr(Expr*) override;
+ Result BeginBlockExpr(BlockExpr*) override;
+ Result EndBlockExpr(BlockExpr*) override;
+ Result OnBrExpr(BrExpr*) override;
+ Result OnBrIfExpr(BrIfExpr*) override;
+ Result OnBrTableExpr(BrTableExpr*) override;
+ Result OnCallExpr(CallExpr*) override;
+ Result OnCallIndirectExpr(CallIndirectExpr*) override;
+ Result OnGetGlobalExpr(GetGlobalExpr*) override;
+ Result OnGetLocalExpr(GetLocalExpr*) override;
+ Result BeginIfExpr(IfExpr*) override;
+ Result EndIfExpr(IfExpr*) override;
+ Result BeginLoopExpr(LoopExpr*) override;
+ Result EndLoopExpr(LoopExpr*) override;
+ Result OnSetGlobalExpr(SetGlobalExpr*) override;
+ Result OnSetLocalExpr(SetLocalExpr*) override;
+ Result OnTeeLocalExpr(TeeLocalExpr*) override;
private:
void PushLabel(Label* label);
@@ -189,92 +189,92 @@ Result NameApplier::UseNameForParamAndLocalVar(Func* func, Var* var) {
return Result::Ok;
}
-Result NameApplier::BeginBlockExpr(Expr* expr) {
+Result NameApplier::BeginBlockExpr(BlockExpr* expr) {
PushLabel(&expr->block->label);
return Result::Ok;
}
-Result NameApplier::EndBlockExpr(Expr* expr) {
+Result NameApplier::EndBlockExpr(BlockExpr* expr) {
PopLabel();
return Result::Ok;
}
-Result NameApplier::BeginLoopExpr(Expr* expr) {
- PushLabel(&expr->loop->label);
+Result NameApplier::BeginLoopExpr(LoopExpr* expr) {
+ PushLabel(&expr->block->label);
return Result::Ok;
}
-Result NameApplier::EndLoopExpr(Expr* expr) {
+Result NameApplier::EndLoopExpr(LoopExpr* expr) {
PopLabel();
return Result::Ok;
}
-Result NameApplier::OnBrExpr(Expr* expr) {
- Label* label = FindLabelByVar(&expr->br.var);
- UseNameForVar(label, &expr->br.var);
+Result NameApplier::OnBrExpr(BrExpr* expr) {
+ Label* label = FindLabelByVar(&expr->var);
+ UseNameForVar(label, &expr->var);
return Result::Ok;
}
-Result NameApplier::OnBrIfExpr(Expr* expr) {
- Label* label = FindLabelByVar(&expr->br_if.var);
- UseNameForVar(label, &expr->br_if.var);
+Result NameApplier::OnBrIfExpr(BrIfExpr* expr) {
+ Label* label = FindLabelByVar(&expr->var);
+ UseNameForVar(label, &expr->var);
return Result::Ok;
}
-Result NameApplier::OnBrTableExpr(Expr* expr) {
- VarVector& targets = *expr->br_table.targets;
+Result NameApplier::OnBrTableExpr(BrTableExpr* expr) {
+ VarVector& targets = *expr->targets;
for (Var& target : targets) {
Label* label = FindLabelByVar(&target);
UseNameForVar(label, &target);
}
- Label* label = FindLabelByVar(&expr->br_table.default_target);
- UseNameForVar(label, &expr->br_table.default_target);
+ Label* label = FindLabelByVar(&expr->default_target);
+ UseNameForVar(label, &expr->default_target);
return Result::Ok;
}
-Result NameApplier::OnCallExpr(Expr* expr) {
- CHECK_RESULT(UseNameForFuncVar(module_, &expr->call.var));
+Result NameApplier::OnCallExpr(CallExpr* expr) {
+ CHECK_RESULT(UseNameForFuncVar(module_, &expr->var));
return Result::Ok;
}
-Result NameApplier::OnCallIndirectExpr(Expr* expr) {
- CHECK_RESULT(UseNameForFuncTypeVar(module_, &expr->call_indirect.var));
+Result NameApplier::OnCallIndirectExpr(CallIndirectExpr* expr) {
+ CHECK_RESULT(UseNameForFuncTypeVar(module_, &expr->var));
return Result::Ok;
}
-Result NameApplier::OnGetGlobalExpr(Expr* expr) {
- CHECK_RESULT(UseNameForGlobalVar(module_, &expr->get_global.var));
+Result NameApplier::OnGetGlobalExpr(GetGlobalExpr* expr) {
+ CHECK_RESULT(UseNameForGlobalVar(module_, &expr->var));
return Result::Ok;
}
-Result NameApplier::OnGetLocalExpr(Expr* expr) {
- CHECK_RESULT(UseNameForParamAndLocalVar(current_func_, &expr->get_local.var));
+Result NameApplier::OnGetLocalExpr(GetLocalExpr* expr) {
+ CHECK_RESULT(UseNameForParamAndLocalVar(current_func_, &expr->var));
return Result::Ok;
}
-Result NameApplier::BeginIfExpr(Expr* expr) {
- PushLabel(&expr->if_.true_->label);
+Result NameApplier::BeginIfExpr(IfExpr* expr) {
+ PushLabel(&expr->true_->label);
return Result::Ok;
}
-Result NameApplier::EndIfExpr(Expr* expr) {
+Result NameApplier::EndIfExpr(IfExpr* expr) {
PopLabel();
return Result::Ok;
}
-Result NameApplier::OnSetGlobalExpr(Expr* expr) {
- CHECK_RESULT(UseNameForGlobalVar(module_, &expr->set_global.var));
+Result NameApplier::OnSetGlobalExpr(SetGlobalExpr* expr) {
+ CHECK_RESULT(UseNameForGlobalVar(module_, &expr->var));
return Result::Ok;
}
-Result NameApplier::OnSetLocalExpr(Expr* expr) {
- CHECK_RESULT(UseNameForParamAndLocalVar(current_func_, &expr->set_local.var));
+Result NameApplier::OnSetLocalExpr(SetLocalExpr* expr) {
+ CHECK_RESULT(UseNameForParamAndLocalVar(current_func_, &expr->var));
return Result::Ok;
}
-Result NameApplier::OnTeeLocalExpr(Expr* expr) {
- CHECK_RESULT(UseNameForParamAndLocalVar(current_func_, &expr->tee_local.var));
+Result NameApplier::OnTeeLocalExpr(TeeLocalExpr* expr) {
+ CHECK_RESULT(UseNameForParamAndLocalVar(current_func_, &expr->var));
return Result::Ok;
}
diff --git a/src/binary-reader-ir.cc b/src/binary-reader-ir.cc
index 128aae4c..bd7759c1 100644
--- a/src/binary-reader-ir.cc
+++ b/src/binary-reader-ir.cc
@@ -258,7 +258,7 @@ Result BinaryReaderIR::TopLabel(LabelNode** label) {
}
Result BinaryReaderIR::AppendExpr(Expr* expr) {
- // TODO(binji): Probably should be set in the Expr::Create* function instead.
+ // TODO(binji): Probably should be set in the Expr constructor instead.
expr->loc = GetLocation();
LabelNode* label;
@@ -543,12 +543,12 @@ Result BinaryReaderIR::OnLocalDecl(Index decl_index, Index count, Type type) {
}
Result BinaryReaderIR::OnBinaryExpr(Opcode opcode) {
- Expr* expr = Expr::CreateBinary(opcode);
+ auto expr = new BinaryExpr(opcode);
return AppendExpr(expr);
}
Result BinaryReaderIR::OnBlockExpr(Index num_types, Type* sig_types) {
- Expr* expr = Expr::CreateBlock(new Block());
+ auto expr = new BlockExpr(new Block());
expr->block->sig.assign(sig_types, sig_types + num_types);
AppendExpr(expr);
PushLabel(LabelType::Block, &expr->block->first);
@@ -556,12 +556,12 @@ Result BinaryReaderIR::OnBlockExpr(Index num_types, Type* sig_types) {
}
Result BinaryReaderIR::OnBrExpr(Index depth) {
- Expr* expr = Expr::CreateBr(Var(depth));
+ auto expr = new BrExpr(Var(depth));
return AppendExpr(expr);
}
Result BinaryReaderIR::OnBrIfExpr(Index depth) {
- Expr* expr = Expr::CreateBrIf(Var(depth));
+ auto expr = new BrIfExpr(Var(depth));
return AppendExpr(expr);
}
@@ -573,39 +573,39 @@ Result BinaryReaderIR::OnBrTableExpr(Index num_targets,
for (Index i = 0; i < num_targets; ++i) {
(*targets)[i] = Var(target_depths[i]);
}
- Expr* expr = Expr::CreateBrTable(targets, Var(default_target_depth));
+ auto expr = new BrTableExpr(targets, Var(default_target_depth));
return AppendExpr(expr);
}
Result BinaryReaderIR::OnCallExpr(Index func_index) {
assert(func_index < module->funcs.size());
- Expr* expr = Expr::CreateCall(Var(func_index));
+ auto expr = new CallExpr(Var(func_index));
return AppendExpr(expr);
}
Result BinaryReaderIR::OnCallIndirectExpr(Index sig_index) {
assert(sig_index < module->func_types.size());
- Expr* expr = Expr::CreateCallIndirect(Var(sig_index));
+ auto expr = new CallIndirectExpr(Var(sig_index));
return AppendExpr(expr);
}
Result BinaryReaderIR::OnCompareExpr(Opcode opcode) {
- Expr* expr = Expr::CreateCompare(opcode);
+ auto expr = new CompareExpr(opcode);
return AppendExpr(expr);
}
Result BinaryReaderIR::OnConvertExpr(Opcode opcode) {
- Expr* expr = Expr::CreateConvert(opcode);
+ auto expr = new ConvertExpr(opcode);
return AppendExpr(expr);
}
Result BinaryReaderIR::OnCurrentMemoryExpr() {
- Expr* expr = Expr::CreateCurrentMemory();
+ auto expr = new CurrentMemoryExpr();
return AppendExpr(expr);
}
Result BinaryReaderIR::OnDropExpr() {
- Expr* expr = Expr::CreateDrop();
+ auto expr = new DropExpr();
return AppendExpr(expr);
}
@@ -619,10 +619,9 @@ Result BinaryReaderIR::OnElseExpr() {
LabelNode* parent_label;
CHECK_RESULT(GetLabelAt(&parent_label, 1));
- assert(parent_label->last->type == ExprType::If);
label->label_type = LabelType::Else;
- label->first = &parent_label->last->if_.false_;
+ label->first = &parent_label->last->As<IfExpr>()->false_;
label->last = nullptr;
return Result::Ok;
}
@@ -632,110 +631,108 @@ Result BinaryReaderIR::OnEndExpr() {
}
Result BinaryReaderIR::OnF32ConstExpr(uint32_t value_bits) {
- Expr* expr =
- Expr::CreateConst(Const(Const::F32(), value_bits, GetLocation()));
+ auto expr = new ConstExpr(Const(Const::F32(), value_bits, GetLocation()));
return AppendExpr(expr);
}
Result BinaryReaderIR::OnF64ConstExpr(uint64_t value_bits) {
- Expr* expr =
- Expr::CreateConst(Const(Const::F64(), value_bits, GetLocation()));
+ auto expr = new ConstExpr(Const(Const::F64(), value_bits, GetLocation()));
return AppendExpr(expr);
}
Result BinaryReaderIR::OnGetGlobalExpr(Index global_index) {
- Expr* expr = Expr::CreateGetGlobal(Var(global_index, GetLocation()));
+ auto expr = new GetGlobalExpr(Var(global_index, GetLocation()));
return AppendExpr(expr);
}
Result BinaryReaderIR::OnGetLocalExpr(Index local_index) {
- Expr* expr = Expr::CreateGetLocal(Var(local_index, GetLocation()));
+ auto expr = new GetLocalExpr(Var(local_index, GetLocation()));
return AppendExpr(expr);
}
Result BinaryReaderIR::OnGrowMemoryExpr() {
- Expr* expr = Expr::CreateGrowMemory();
+ auto expr = new GrowMemoryExpr();
return AppendExpr(expr);
}
Result BinaryReaderIR::OnI32ConstExpr(uint32_t value) {
- Expr* expr = Expr::CreateConst(Const(Const::I32(), value, GetLocation()));
+ auto expr = new ConstExpr(Const(Const::I32(), value, GetLocation()));
return AppendExpr(expr);
}
Result BinaryReaderIR::OnI64ConstExpr(uint64_t value) {
- Expr* expr = Expr::CreateConst(Const(Const::I64(), value, GetLocation()));
+ auto expr = new ConstExpr(Const(Const::I64(), value, GetLocation()));
return AppendExpr(expr);
}
Result BinaryReaderIR::OnIfExpr(Index num_types, Type* sig_types) {
- Expr* expr = Expr::CreateIf(new Block());
- expr->if_.true_->sig.assign(sig_types, sig_types + num_types);
- expr->if_.false_ = nullptr;
+ auto expr = new IfExpr(new Block());
+ expr->true_->sig.assign(sig_types, sig_types + num_types);
+ expr->false_ = nullptr;
AppendExpr(expr);
- PushLabel(LabelType::If, &expr->if_.true_->first);
+ PushLabel(LabelType::If, &expr->true_->first);
return Result::Ok;
}
Result BinaryReaderIR::OnLoadExpr(Opcode opcode,
uint32_t alignment_log2,
Address offset) {
- Expr* expr = Expr::CreateLoad(opcode, 1 << alignment_log2, offset);
+ auto expr = new LoadExpr(opcode, 1 << alignment_log2, offset);
return AppendExpr(expr);
}
Result BinaryReaderIR::OnLoopExpr(Index num_types, Type* sig_types) {
- Expr* expr = Expr::CreateLoop(new Block());
- expr->loop->sig.assign(sig_types, sig_types + num_types);
+ auto expr = new LoopExpr(new Block());
+ expr->block->sig.assign(sig_types, sig_types + num_types);
AppendExpr(expr);
- PushLabel(LabelType::Loop, &expr->loop->first);
+ PushLabel(LabelType::Loop, &expr->block->first);
return Result::Ok;
}
Result BinaryReaderIR::OnNopExpr() {
- Expr* expr = Expr::CreateNop();
+ auto expr = new NopExpr();
return AppendExpr(expr);
}
Result BinaryReaderIR::OnReturnExpr() {
- Expr* expr = Expr::CreateReturn();
+ auto expr = new ReturnExpr();
return AppendExpr(expr);
}
Result BinaryReaderIR::OnSelectExpr() {
- Expr* expr = Expr::CreateSelect();
+ auto expr = new SelectExpr();
return AppendExpr(expr);
}
Result BinaryReaderIR::OnSetGlobalExpr(Index global_index) {
- Expr* expr = Expr::CreateSetGlobal(Var(global_index, GetLocation()));
+ auto expr = new SetGlobalExpr(Var(global_index, GetLocation()));
return AppendExpr(expr);
}
Result BinaryReaderIR::OnSetLocalExpr(Index local_index) {
- Expr* expr = Expr::CreateSetLocal(Var(local_index, GetLocation()));
+ auto expr = new SetLocalExpr(Var(local_index, GetLocation()));
return AppendExpr(expr);
}
Result BinaryReaderIR::OnStoreExpr(Opcode opcode,
uint32_t alignment_log2,
Address offset) {
- Expr* expr = Expr::CreateStore(opcode, 1 << alignment_log2, offset);
+ auto expr = new StoreExpr(opcode, 1 << alignment_log2, offset);
return AppendExpr(expr);
}
Result BinaryReaderIR::OnTeeLocalExpr(Index local_index) {
- Expr* expr = Expr::CreateTeeLocal(Var(local_index, GetLocation()));
+ auto expr = new TeeLocalExpr(Var(local_index, GetLocation()));
return AppendExpr(expr);
}
Result BinaryReaderIR::OnUnaryExpr(Opcode opcode) {
- Expr* expr = Expr::CreateUnary(opcode);
+ auto expr = new UnaryExpr(opcode);
return AppendExpr(expr);
}
Result BinaryReaderIR::OnUnreachableExpr() {
- Expr* expr = Expr::CreateUnreachable();
+ auto expr = new UnreachableExpr();
return AppendExpr(expr);
}
@@ -868,14 +865,14 @@ Result BinaryReaderIR::OnLocalNameLocalCount(Index index, Index count) {
}
Result BinaryReaderIR::OnInitExprF32ConstExpr(Index index, uint32_t value) {
- Expr* expr = Expr::CreateConst(Const(Const::F32(), value, GetLocation()));
+ auto expr = new ConstExpr(Const(Const::F32(), value, GetLocation()));
expr->loc = GetLocation();
*current_init_expr = expr;
return Result::Ok;
}
Result BinaryReaderIR::OnInitExprF64ConstExpr(Index index, uint64_t value) {
- Expr* expr = Expr::CreateConst(Const(Const::F64(), value, GetLocation()));
+ auto expr = new ConstExpr(Const(Const::F64(), value, GetLocation()));
expr->loc = GetLocation();
*current_init_expr = expr;
return Result::Ok;
@@ -883,21 +880,21 @@ Result BinaryReaderIR::OnInitExprF64ConstExpr(Index index, uint64_t value) {
Result BinaryReaderIR::OnInitExprGetGlobalExpr(Index index,
Index global_index) {
- Expr* expr = Expr::CreateGetGlobal(Var(global_index, GetLocation()));
+ auto expr = new GetGlobalExpr(Var(global_index, GetLocation()));
expr->loc = GetLocation();
*current_init_expr = expr;
return Result::Ok;
}
Result BinaryReaderIR::OnInitExprI32ConstExpr(Index index, uint32_t value) {
- Expr* expr = Expr::CreateConst(Const(Const::I32(), value, GetLocation()));
+ auto expr = new ConstExpr(Const(Const::I32(), value, GetLocation()));
expr->loc = GetLocation();
*current_init_expr = expr;
return Result::Ok;
}
Result BinaryReaderIR::OnInitExprI64ConstExpr(Index index, uint64_t value) {
- Expr* expr = Expr::CreateConst(Const(Const::I64(), value, GetLocation()));
+ auto expr = new ConstExpr(Const(Const::I64(), value, GetLocation()));
expr->loc = GetLocation();
*current_init_expr = expr;
return Result::Ok;
diff --git a/src/binary-writer.cc b/src/binary-writer.cc
index 6a012418..785e6917 100644
--- a/src/binary-writer.cc
+++ b/src/binary-writer.cc
@@ -420,77 +420,81 @@ void BinaryWriter::WriteExpr(const Module* module,
const Expr* expr) {
switch (expr->type) {
case ExprType::Binary:
- write_opcode(&stream_, expr->binary.opcode);
+ write_opcode(&stream_, expr->As<BinaryExpr>()->opcode);
break;
case ExprType::Block:
write_opcode(&stream_, Opcode::Block);
- write_inline_signature_type(&stream_, expr->block->sig);
- WriteExprList(module, func, expr->block->first);
+ write_inline_signature_type(&stream_, expr->As<BlockExpr>()->block->sig);
+ WriteExprList(module, func, expr->As<BlockExpr>()->block->first);
write_opcode(&stream_, Opcode::End);
break;
case ExprType::Br:
write_opcode(&stream_, Opcode::Br);
- write_u32_leb128(&stream_, GetLabelVarDepth(&expr->br.var),
+ write_u32_leb128(&stream_, GetLabelVarDepth(&expr->As<BrExpr>()->var),
"break depth");
break;
case ExprType::BrIf:
write_opcode(&stream_, Opcode::BrIf);
- write_u32_leb128(&stream_, GetLabelVarDepth(&expr->br_if.var),
+ write_u32_leb128(&stream_, GetLabelVarDepth(&expr->As<BrIfExpr>()->var),
"break depth");
break;
case ExprType::BrTable: {
+ auto br_table_expr = expr->As<BrTableExpr>();
write_opcode(&stream_, Opcode::BrTable);
- write_u32_leb128(&stream_, expr->br_table.targets->size(), "num targets");
+ write_u32_leb128(&stream_, br_table_expr->targets->size(), "num targets");
Index depth;
- for (const Var& var : *expr->br_table.targets) {
+ for (const Var& var : *br_table_expr->targets) {
depth = GetLabelVarDepth(&var);
write_u32_leb128(&stream_, depth, "break depth");
}
- depth = GetLabelVarDepth(&expr->br_table.default_target);
+ depth = GetLabelVarDepth(&br_table_expr->default_target);
write_u32_leb128(&stream_, depth, "break depth for default");
break;
}
case ExprType::Call: {
- Index index = module->GetFuncIndex(expr->call.var);
+ Index index = module->GetFuncIndex(expr->As<CallExpr>()->var);
write_opcode(&stream_, Opcode::Call);
WriteU32Leb128WithReloc(index, "function index", RelocType::FuncIndexLEB);
break;
}
case ExprType::CallIndirect: {
- Index index = module->GetFuncTypeIndex(expr->call_indirect.var);
+ Index index = module->GetFuncTypeIndex(expr->As<CallIndirectExpr>()->var);
write_opcode(&stream_, Opcode::CallIndirect);
- WriteU32Leb128WithReloc(index, "signature index", RelocType::TypeIndexLEB);
+ WriteU32Leb128WithReloc(index, "signature index",
+ RelocType::TypeIndexLEB);
write_u32_leb128(&stream_, 0, "call_indirect reserved");
break;
}
case ExprType::Compare:
- write_opcode(&stream_, expr->compare.opcode);
+ write_opcode(&stream_, expr->As<CompareExpr>()->opcode);
break;
- case ExprType::Const:
- switch (expr->const_.type) {
+ case ExprType::Const: {
+ const Const& const_ = expr->As<ConstExpr>()->const_;
+ switch (const_.type) {
case Type::I32: {
write_opcode(&stream_, Opcode::I32Const);
- write_i32_leb128(&stream_, expr->const_.u32, "i32 literal");
+ write_i32_leb128(&stream_, const_.u32, "i32 literal");
break;
}
case Type::I64:
write_opcode(&stream_, Opcode::I64Const);
- write_i64_leb128(&stream_, expr->const_.u64, "i64 literal");
+ write_i64_leb128(&stream_, const_.u64, "i64 literal");
break;
case Type::F32:
write_opcode(&stream_, Opcode::F32Const);
- stream_.WriteU32(expr->const_.f32_bits, "f32 literal");
+ stream_.WriteU32(const_.f32_bits, "f32 literal");
break;
case Type::F64:
write_opcode(&stream_, Opcode::F64Const);
- stream_.WriteU64(expr->const_.f64_bits, "f64 literal");
+ stream_.WriteU64(const_.f64_bits, "f64 literal");
break;
default:
assert(0);
}
break;
+ }
case ExprType::Convert:
- write_opcode(&stream_, expr->convert.opcode);
+ write_opcode(&stream_, expr->As<ConvertExpr>()->opcode);
break;
case ExprType::CurrentMemory:
write_opcode(&stream_, Opcode::CurrentMemory);
@@ -500,13 +504,13 @@ void BinaryWriter::WriteExpr(const Module* module,
write_opcode(&stream_, Opcode::Drop);
break;
case ExprType::GetGlobal: {
- Index index = module->GetGlobalIndex(expr->get_global.var);
+ Index index = module->GetGlobalIndex(expr->As<GetGlobalExpr>()->var);
write_opcode(&stream_, Opcode::GetGlobal);
WriteU32Leb128WithReloc(index, "global index", RelocType::GlobalIndexLEB);
break;
}
case ExprType::GetLocal: {
- Index index = GetLocalIndex(func, expr->get_local.var);
+ Index index = GetLocalIndex(func, expr->As<GetLocalExpr>()->var);
write_opcode(&stream_, Opcode::GetLocal);
write_u32_leb128(&stream_, index, "local index");
break;
@@ -515,27 +519,30 @@ void BinaryWriter::WriteExpr(const Module* module,
write_opcode(&stream_, Opcode::GrowMemory);
write_u32_leb128(&stream_, 0, "grow_memory reserved");
break;
- case ExprType::If:
+ case ExprType::If: {
+ auto if_expr = expr->As<IfExpr>();
write_opcode(&stream_, Opcode::If);
- write_inline_signature_type(&stream_, expr->if_.true_->sig);
- WriteExprList(module, func, expr->if_.true_->first);
- if (expr->if_.false_) {
+ write_inline_signature_type(&stream_, if_expr->true_->sig);
+ WriteExprList(module, func, if_expr->true_->first);
+ if (if_expr->false_) {
write_opcode(&stream_, Opcode::Else);
- WriteExprList(module, func, expr->if_.false_);
+ WriteExprList(module, func, if_expr->false_);
}
write_opcode(&stream_, Opcode::End);
break;
+ }
case ExprType::Load: {
- write_opcode(&stream_, expr->load.opcode);
- Address align = expr->load.opcode.GetAlignment(expr->load.align);
+ auto load_expr = expr->As<LoadExpr>();
+ write_opcode(&stream_, load_expr->opcode);
+ Address align = load_expr->opcode.GetAlignment(load_expr->align);
stream_.WriteU8(log2_u32(align), "alignment");
- write_u32_leb128(&stream_, expr->load.offset, "load offset");
+ write_u32_leb128(&stream_, load_expr->offset, "load offset");
break;
}
case ExprType::Loop:
write_opcode(&stream_, Opcode::Loop);
- write_inline_signature_type(&stream_, expr->loop->sig);
- WriteExprList(module, func, expr->loop->first);
+ write_inline_signature_type(&stream_, expr->As<LoopExpr>()->block->sig);
+ WriteExprList(module, func, expr->As<LoopExpr>()->block->first);
write_opcode(&stream_, Opcode::End);
break;
case ExprType::Nop:
@@ -543,7 +550,8 @@ void BinaryWriter::WriteExpr(const Module* module,
break;
case ExprType::Rethrow:
write_opcode(&stream_, Opcode::Rethrow);
- write_u32_leb128(&stream_, GetLabelVarDepth(&expr->rethrow_.var),
+ write_u32_leb128(&stream_,
+ GetLabelVarDepth(&expr->As<RethrowExpr>()->var),
"rethrow depth");
break;
case ExprType::Return:
@@ -553,40 +561,42 @@ void BinaryWriter::WriteExpr(const Module* module,
write_opcode(&stream_, Opcode::Select);
break;
case ExprType::SetGlobal: {
- Index index = module->GetGlobalIndex(expr->get_global.var);
+ Index index = module->GetGlobalIndex(expr->As<SetGlobalExpr>()->var);
write_opcode(&stream_, Opcode::SetGlobal);
WriteU32Leb128WithReloc(index, "global index", RelocType::GlobalIndexLEB);
break;
}
case ExprType::SetLocal: {
- Index index = GetLocalIndex(func, expr->get_local.var);
+ Index index = GetLocalIndex(func, expr->As<SetLocalExpr>()->var);
write_opcode(&stream_, Opcode::SetLocal);
write_u32_leb128(&stream_, index, "local index");
break;
}
case ExprType::Store: {
- write_opcode(&stream_, expr->store.opcode);
- Address align = expr->store.opcode.GetAlignment(expr->store.align);
+ auto store_expr = expr->As<StoreExpr>();
+ write_opcode(&stream_, store_expr->opcode);
+ Address align = store_expr->opcode.GetAlignment(store_expr->align);
stream_.WriteU8(log2_u32(align), "alignment");
- write_u32_leb128(&stream_, expr->store.offset, "store offset");
+ write_u32_leb128(&stream_, store_expr->offset, "store offset");
break;
}
case ExprType::TeeLocal: {
- Index index = GetLocalIndex(func, expr->get_local.var);
+ Index index = GetLocalIndex(func, expr->As<TeeLocalExpr>()->var);
write_opcode(&stream_, Opcode::TeeLocal);
write_u32_leb128(&stream_, index, "local index");
break;
}
case ExprType::Throw:
write_opcode(&stream_, Opcode::Throw);
- write_u32_leb128(&stream_, GetExceptVarDepth(&expr->throw_.var),
+ write_u32_leb128(&stream_, GetExceptVarDepth(&expr->As<ThrowExpr>()->var),
"throw exception");
break;
- case ExprType::TryBlock:
+ case ExprType::TryBlock: {
+ auto try_expr = expr->As<TryExpr>();
write_opcode(&stream_, Opcode::Try);
- write_inline_signature_type(&stream_, expr->try_block.block->sig);
- WriteExprList(module, func, expr->try_block.block->first);
- for (Catch* catch_ : *expr->try_block.catches) {
+ write_inline_signature_type(&stream_, try_expr->block->sig);
+ WriteExprList(module, func, try_expr->block->first);
+ for (Catch* catch_ : try_expr->catches) {
if (catch_->IsCatchAll()) {
write_opcode(&stream_, Opcode::CatchAll);
} else {
@@ -598,8 +608,9 @@ void BinaryWriter::WriteExpr(const Module* module,
}
write_opcode(&stream_, Opcode::End);
break;
+ }
case ExprType::Unary:
- write_opcode(&stream_, expr->unary.opcode);
+ write_opcode(&stream_, expr->As<UnaryExpr>()->opcode);
break;
case ExprType::Unreachable:
write_opcode(&stream_, Opcode::Unreachable);
diff --git a/src/expr-visitor.cc b/src/expr-visitor.cc
index db34a49b..451c2e55 100644
--- a/src/expr-visitor.cc
+++ b/src/expr-visitor.cc
@@ -31,137 +31,146 @@ ExprVisitor::ExprVisitor(Delegate* delegate) : delegate_(delegate) {}
Result ExprVisitor::VisitExpr(Expr* expr) {
switch (expr->type) {
case ExprType::Binary:
- CHECK_RESULT(delegate_->OnBinaryExpr(expr));
+ CHECK_RESULT(delegate_->OnBinaryExpr(expr->As<BinaryExpr>()));
break;
- case ExprType::Block:
- CHECK_RESULT(delegate_->BeginBlockExpr(expr));
- CHECK_RESULT(VisitExprList(expr->block->first));
- CHECK_RESULT(delegate_->EndBlockExpr(expr));
+ case ExprType::Block: {
+ auto block_expr = expr->As<BlockExpr>();
+ CHECK_RESULT(delegate_->BeginBlockExpr(block_expr));
+ CHECK_RESULT(VisitExprList(block_expr->block->first));
+ CHECK_RESULT(delegate_->EndBlockExpr(block_expr));
break;
+ }
case ExprType::Br:
- CHECK_RESULT(delegate_->OnBrExpr(expr));
+ CHECK_RESULT(delegate_->OnBrExpr(expr->As<BrExpr>()));
break;
case ExprType::BrIf:
- CHECK_RESULT(delegate_->OnBrIfExpr(expr));
+ CHECK_RESULT(delegate_->OnBrIfExpr(expr->As<BrIfExpr>()));
break;
case ExprType::BrTable:
- CHECK_RESULT(delegate_->OnBrTableExpr(expr));
+ CHECK_RESULT(delegate_->OnBrTableExpr(expr->As<BrTableExpr>()));
break;
case ExprType::Call:
- CHECK_RESULT(delegate_->OnCallExpr(expr));
+ CHECK_RESULT(delegate_->OnCallExpr(expr->As<CallExpr>()));
break;
case ExprType::CallIndirect:
- CHECK_RESULT(delegate_->OnCallIndirectExpr(expr));
+ CHECK_RESULT(delegate_->OnCallIndirectExpr(expr->As<CallIndirectExpr>()));
break;
case ExprType::Compare:
- CHECK_RESULT(delegate_->OnCompareExpr(expr));
+ CHECK_RESULT(delegate_->OnCompareExpr(expr->As<CompareExpr>()));
break;
case ExprType::Const:
- CHECK_RESULT(delegate_->OnConstExpr(expr));
+ CHECK_RESULT(delegate_->OnConstExpr(expr->As<ConstExpr>()));
break;
case ExprType::Convert:
- CHECK_RESULT(delegate_->OnConvertExpr(expr));
+ CHECK_RESULT(delegate_->OnConvertExpr(expr->As<ConvertExpr>()));
break;
case ExprType::CurrentMemory:
- CHECK_RESULT(delegate_->OnCurrentMemoryExpr(expr));
+ CHECK_RESULT(
+ delegate_->OnCurrentMemoryExpr(expr->As<CurrentMemoryExpr>()));
break;
case ExprType::Drop:
- CHECK_RESULT(delegate_->OnDropExpr(expr));
+ CHECK_RESULT(delegate_->OnDropExpr(expr->As<DropExpr>()));
break;
case ExprType::GetGlobal:
- CHECK_RESULT(delegate_->OnGetGlobalExpr(expr));
+ CHECK_RESULT(delegate_->OnGetGlobalExpr(expr->As<GetGlobalExpr>()));
break;
case ExprType::GetLocal:
- CHECK_RESULT(delegate_->OnGetLocalExpr(expr));
+ CHECK_RESULT(delegate_->OnGetLocalExpr(expr->As<GetLocalExpr>()));
break;
case ExprType::GrowMemory:
- CHECK_RESULT(delegate_->OnGrowMemoryExpr(expr));
+ CHECK_RESULT(delegate_->OnGrowMemoryExpr(expr->As<GrowMemoryExpr>()));
break;
- case ExprType::If:
- CHECK_RESULT(delegate_->BeginIfExpr(expr));
- CHECK_RESULT(VisitExprList(expr->if_.true_->first));
- CHECK_RESULT(delegate_->AfterIfTrueExpr(expr));
- CHECK_RESULT(VisitExprList(expr->if_.false_));
- CHECK_RESULT(delegate_->EndIfExpr(expr));
+ case ExprType::If: {
+ auto if_expr = expr->As<IfExpr>();
+ CHECK_RESULT(delegate_->BeginIfExpr(if_expr));
+ CHECK_RESULT(VisitExprList(if_expr->true_->first));
+ CHECK_RESULT(delegate_->AfterIfTrueExpr(if_expr));
+ CHECK_RESULT(VisitExprList(if_expr->false_));
+ CHECK_RESULT(delegate_->EndIfExpr(if_expr));
break;
+ }
case ExprType::Load:
- CHECK_RESULT(delegate_->OnLoadExpr(expr));
+ CHECK_RESULT(delegate_->OnLoadExpr(expr->As<LoadExpr>()));
break;
- case ExprType::Loop:
- CHECK_RESULT(delegate_->BeginLoopExpr(expr));
- CHECK_RESULT(VisitExprList(expr->loop->first));
- CHECK_RESULT(delegate_->EndLoopExpr(expr));
+ case ExprType::Loop: {
+ auto loop_expr = expr->As<LoopExpr>();
+ CHECK_RESULT(delegate_->BeginLoopExpr(loop_expr));
+ CHECK_RESULT(VisitExprList(loop_expr->block->first));
+ CHECK_RESULT(delegate_->EndLoopExpr(loop_expr));
break;
+ }
case ExprType::Nop:
- CHECK_RESULT(delegate_->OnNopExpr(expr));
+ CHECK_RESULT(delegate_->OnNopExpr(expr->As<NopExpr>()));
break;
case ExprType::Rethrow:
- CHECK_RESULT(delegate_->OnRethrowExpr(expr));
+ CHECK_RESULT(delegate_->OnRethrowExpr(expr->As<RethrowExpr>()));
break;
case ExprType::Return:
- CHECK_RESULT(delegate_->OnReturnExpr(expr));
+ CHECK_RESULT(delegate_->OnReturnExpr(expr->As<ReturnExpr>()));
break;
case ExprType::Select:
- CHECK_RESULT(delegate_->OnSelectExpr(expr));
+ CHECK_RESULT(delegate_->OnSelectExpr(expr->As<SelectExpr>()));
break;
case ExprType::SetGlobal:
- CHECK_RESULT(delegate_->OnSetGlobalExpr(expr));
+ CHECK_RESULT(delegate_->OnSetGlobalExpr(expr->As<SetGlobalExpr>()));
break;
case ExprType::SetLocal:
- CHECK_RESULT(delegate_->OnSetLocalExpr(expr));
+ CHECK_RESULT(delegate_->OnSetLocalExpr(expr->As<SetLocalExpr>()));
break;
case ExprType::Store:
- CHECK_RESULT(delegate_->OnStoreExpr(expr));
+ CHECK_RESULT(delegate_->OnStoreExpr(expr->As<StoreExpr>()));
break;
case ExprType::TeeLocal:
- CHECK_RESULT(delegate_->OnTeeLocalExpr(expr));
+ CHECK_RESULT(delegate_->OnTeeLocalExpr(expr->As<TeeLocalExpr>()));
break;
case ExprType::Throw:
- CHECK_RESULT(delegate_->OnThrowExpr(expr));
+ CHECK_RESULT(delegate_->OnThrowExpr(expr->As<ThrowExpr>()));
break;
- case ExprType::TryBlock:
- CHECK_RESULT(delegate_->BeginTryExpr(expr));
- CHECK_RESULT(VisitExprList(expr->try_block.block->first));
- for (Catch* catch_ : *expr->try_block.catches) {
- CHECK_RESULT(delegate_->OnCatchExpr(expr, catch_));
+ case ExprType::TryBlock: {
+ auto try_expr = expr->As<TryExpr>();
+ CHECK_RESULT(delegate_->BeginTryExpr(try_expr));
+ CHECK_RESULT(VisitExprList(try_expr->block->first));
+ for (Catch* catch_ : try_expr->catches) {
+ CHECK_RESULT(delegate_->OnCatchExpr(try_expr, catch_));
CHECK_RESULT(VisitExprList(catch_->first));
}
- CHECK_RESULT(delegate_->EndTryExpr(expr));
+ CHECK_RESULT(delegate_->EndTryExpr(try_expr));
break;
+ }
case ExprType::Unary:
- CHECK_RESULT(delegate_->OnUnaryExpr(expr));
+ CHECK_RESULT(delegate_->OnUnaryExpr(expr->As<UnaryExpr>()));
break;
case ExprType::Unreachable:
- CHECK_RESULT(delegate_->OnUnreachableExpr(expr));
+ CHECK_RESULT(delegate_->OnUnreachableExpr(expr->As<UnreachableExpr>()));
break;
}
diff --git a/src/expr-visitor.h b/src/expr-visitor.h
index 99a74ec1..3c8b6b5f 100644
--- a/src/expr-visitor.h
+++ b/src/expr-visitor.h
@@ -18,13 +18,10 @@
#define WABT_EXPR_VISITOR_H_
#include "common.h"
+#include "ir.h"
namespace wabt {
-struct Catch;
-struct Expr;
-struct Func;
-
class ExprVisitor {
public:
class Delegate;
@@ -44,82 +41,82 @@ class ExprVisitor::Delegate {
public:
virtual ~Delegate() {}
- virtual Result OnBinaryExpr(Expr*) = 0;
- virtual Result BeginBlockExpr(Expr*) = 0;
- virtual Result EndBlockExpr(Expr*) = 0;
- virtual Result OnBrExpr(Expr*) = 0;
- virtual Result OnBrIfExpr(Expr*) = 0;
- virtual Result OnBrTableExpr(Expr*) = 0;
- virtual Result OnCallExpr(Expr*) = 0;
- virtual Result OnCallIndirectExpr(Expr*) = 0;
- virtual Result OnCompareExpr(Expr*) = 0;
- virtual Result OnConstExpr(Expr*) = 0;
- virtual Result OnConvertExpr(Expr*) = 0;
- virtual Result OnCurrentMemoryExpr(Expr*) = 0;
- virtual Result OnDropExpr(Expr*) = 0;
- virtual Result OnGetGlobalExpr(Expr*) = 0;
- virtual Result OnGetLocalExpr(Expr*) = 0;
- virtual Result OnGrowMemoryExpr(Expr*) = 0;
- virtual Result BeginIfExpr(Expr*) = 0;
- virtual Result AfterIfTrueExpr(Expr*) = 0;
- virtual Result EndIfExpr(Expr*) = 0;
- virtual Result OnLoadExpr(Expr*) = 0;
- virtual Result BeginLoopExpr(Expr*) = 0;
- virtual Result EndLoopExpr(Expr*) = 0;
- virtual Result OnNopExpr(Expr*) = 0;
- virtual Result OnReturnExpr(Expr*) = 0;
- virtual Result OnSelectExpr(Expr*) = 0;
- virtual Result OnSetGlobalExpr(Expr*) = 0;
- virtual Result OnSetLocalExpr(Expr*) = 0;
- virtual Result OnStoreExpr(Expr*) = 0;
- virtual Result OnTeeLocalExpr(Expr*) = 0;
- virtual Result OnUnaryExpr(Expr*) = 0;
- virtual Result OnUnreachableExpr(Expr*) = 0;
- virtual Result BeginTryExpr(Expr*) = 0;
- virtual Result EndTryExpr(Expr*) = 0;
- virtual Result OnCatchExpr(Expr*, Catch*) = 0;
- virtual Result OnThrowExpr(Expr*) = 0;
- virtual Result OnRethrowExpr(Expr*) = 0;
+ virtual Result OnBinaryExpr(BinaryExpr*) = 0;
+ virtual Result BeginBlockExpr(BlockExpr*) = 0;
+ virtual Result EndBlockExpr(BlockExpr*) = 0;
+ virtual Result OnBrExpr(BrExpr*) = 0;
+ virtual Result OnBrIfExpr(BrIfExpr*) = 0;
+ virtual Result OnBrTableExpr(BrTableExpr*) = 0;
+ virtual Result OnCallExpr(CallExpr*) = 0;
+ virtual Result OnCallIndirectExpr(CallIndirectExpr*) = 0;
+ virtual Result OnCompareExpr(CompareExpr*) = 0;
+ virtual Result OnConstExpr(ConstExpr*) = 0;
+ virtual Result OnConvertExpr(ConvertExpr*) = 0;
+ virtual Result OnCurrentMemoryExpr(CurrentMemoryExpr*) = 0;
+ virtual Result OnDropExpr(DropExpr*) = 0;
+ virtual Result OnGetGlobalExpr(GetGlobalExpr*) = 0;
+ virtual Result OnGetLocalExpr(GetLocalExpr*) = 0;
+ virtual Result OnGrowMemoryExpr(GrowMemoryExpr*) = 0;
+ virtual Result BeginIfExpr(IfExpr*) = 0;
+ virtual Result AfterIfTrueExpr(IfExpr*) = 0;
+ virtual Result EndIfExpr(IfExpr*) = 0;
+ virtual Result OnLoadExpr(LoadExpr*) = 0;
+ virtual Result BeginLoopExpr(LoopExpr*) = 0;
+ virtual Result EndLoopExpr(LoopExpr*) = 0;
+ virtual Result OnNopExpr(NopExpr*) = 0;
+ virtual Result OnReturnExpr(ReturnExpr*) = 0;
+ virtual Result OnSelectExpr(SelectExpr*) = 0;
+ virtual Result OnSetGlobalExpr(SetGlobalExpr*) = 0;
+ virtual Result OnSetLocalExpr(SetLocalExpr*) = 0;
+ virtual Result OnStoreExpr(StoreExpr*) = 0;
+ virtual Result OnTeeLocalExpr(TeeLocalExpr*) = 0;
+ virtual Result OnUnaryExpr(UnaryExpr*) = 0;
+ virtual Result OnUnreachableExpr(UnreachableExpr*) = 0;
+ virtual Result BeginTryExpr(TryExpr*) = 0;
+ virtual Result EndTryExpr(TryExpr*) = 0;
+ virtual Result OnCatchExpr(TryExpr*, Catch*) = 0;
+ virtual Result OnThrowExpr(ThrowExpr*) = 0;
+ virtual Result OnRethrowExpr(RethrowExpr*) = 0;
};
class ExprVisitor::DelegateNop : public ExprVisitor::Delegate {
public:
- Result OnBinaryExpr(Expr*) override { return Result::Ok; }
- Result BeginBlockExpr(Expr*) override { return Result::Ok; }
- Result EndBlockExpr(Expr*) override { return Result::Ok; }
- Result OnBrExpr(Expr*) override { return Result::Ok; }
- Result OnBrIfExpr(Expr*) override { return Result::Ok; }
- Result OnBrTableExpr(Expr*) override { return Result::Ok; }
- Result OnCallExpr(Expr*) override { return Result::Ok; }
- Result OnCallIndirectExpr(Expr*) override { return Result::Ok; }
- Result OnCompareExpr(Expr*) override { return Result::Ok; }
- Result OnConstExpr(Expr*) override { return Result::Ok; }
- Result OnConvertExpr(Expr*) override { return Result::Ok; }
- Result OnCurrentMemoryExpr(Expr*) override { return Result::Ok; }
- Result OnDropExpr(Expr*) override { return Result::Ok; }
- Result OnGetGlobalExpr(Expr*) override { return Result::Ok; }
- Result OnGetLocalExpr(Expr*) override { return Result::Ok; }
- Result OnGrowMemoryExpr(Expr*) override { return Result::Ok; }
- Result BeginIfExpr(Expr*) override { return Result::Ok; }
- Result AfterIfTrueExpr(Expr*) override { return Result::Ok; }
- Result EndIfExpr(Expr*) override { return Result::Ok; }
- Result OnLoadExpr(Expr*) override { return Result::Ok; }
- Result BeginLoopExpr(Expr*) override { return Result::Ok; }
- Result EndLoopExpr(Expr*) override { return Result::Ok; }
- Result OnNopExpr(Expr*) override { return Result::Ok; }
- Result OnReturnExpr(Expr*) override { return Result::Ok; }
- Result OnSelectExpr(Expr*) override { return Result::Ok; }
- Result OnSetGlobalExpr(Expr*) override { return Result::Ok; }
- Result OnSetLocalExpr(Expr*) override { return Result::Ok; }
- Result OnStoreExpr(Expr*) override { return Result::Ok; }
- Result OnTeeLocalExpr(Expr*) override { return Result::Ok; }
- Result OnUnaryExpr(Expr*) override { return Result::Ok; }
- Result OnUnreachableExpr(Expr*) override { return Result::Ok; }
- Result BeginTryExpr(Expr*) override { return Result::Ok; }
- Result EndTryExpr(Expr*) override { return Result::Ok; }
- Result OnCatchExpr(Expr*, Catch*) override { return Result::Ok; }
- Result OnThrowExpr(Expr*) override { return Result::Ok; }
- Result OnRethrowExpr(Expr*) override { return Result::Ok; }
+ Result OnBinaryExpr(BinaryExpr*) override { return Result::Ok; }
+ Result BeginBlockExpr(BlockExpr*) override { return Result::Ok; }
+ Result EndBlockExpr(BlockExpr*) override { return Result::Ok; }
+ Result OnBrExpr(BrExpr*) override { return Result::Ok; }
+ Result OnBrIfExpr(BrIfExpr*) override { return Result::Ok; }
+ Result OnBrTableExpr(BrTableExpr*) override { return Result::Ok; }
+ Result OnCallExpr(CallExpr*) override { return Result::Ok; }
+ Result OnCallIndirectExpr(CallIndirectExpr*) override { return Result::Ok; }
+ Result OnCompareExpr(CompareExpr*) override { return Result::Ok; }
+ Result OnConstExpr(ConstExpr*) override { return Result::Ok; }
+ Result OnConvertExpr(ConvertExpr*) override { return Result::Ok; }
+ Result OnCurrentMemoryExpr(CurrentMemoryExpr*) override { return Result::Ok; }
+ Result OnDropExpr(DropExpr*) override { return Result::Ok; }
+ Result OnGetGlobalExpr(GetGlobalExpr*) override { return Result::Ok; }
+ Result OnGetLocalExpr(GetLocalExpr*) override { return Result::Ok; }
+ Result OnGrowMemoryExpr(GrowMemoryExpr*) override { return Result::Ok; }
+ Result BeginIfExpr(IfExpr*) override { return Result::Ok; }
+ Result AfterIfTrueExpr(IfExpr*) override { return Result::Ok; }
+ Result EndIfExpr(IfExpr*) override { return Result::Ok; }
+ Result OnLoadExpr(LoadExpr*) override { return Result::Ok; }
+ Result BeginLoopExpr(LoopExpr*) override { return Result::Ok; }
+ Result EndLoopExpr(LoopExpr*) override { return Result::Ok; }
+ Result OnNopExpr(NopExpr*) override { return Result::Ok; }
+ Result OnReturnExpr(ReturnExpr*) override { return Result::Ok; }
+ Result OnSelectExpr(SelectExpr*) override { return Result::Ok; }
+ Result OnSetGlobalExpr(SetGlobalExpr*) override { return Result::Ok; }
+ Result OnSetLocalExpr(SetLocalExpr*) override { return Result::Ok; }
+ Result OnStoreExpr(StoreExpr*) override { return Result::Ok; }
+ Result OnTeeLocalExpr(TeeLocalExpr*) override { return Result::Ok; }
+ Result OnUnaryExpr(UnaryExpr*) override { return Result::Ok; }
+ Result OnUnreachableExpr(UnreachableExpr*) override { return Result::Ok; }
+ Result BeginTryExpr(TryExpr*) override { return Result::Ok; }
+ Result EndTryExpr(TryExpr*) override { return Result::Ok; }
+ Result OnCatchExpr(TryExpr*, Catch*) override { return Result::Ok; }
+ Result OnThrowExpr(ThrowExpr*) override { return Result::Ok; }
+ Result OnRethrowExpr(RethrowExpr*) override { return Result::Ok; }
};
} // namespace wabt
diff --git a/src/generate-names.cc b/src/generate-names.cc
index f3332d5c..c2c602e7 100644
--- a/src/generate-names.cc
+++ b/src/generate-names.cc
@@ -41,9 +41,9 @@ class NameGenerator : public ExprVisitor::DelegateNop {
Result VisitModule(Module* module);
// Implementation of ExprVisitor::DelegateNop.
- Result BeginBlockExpr(Expr* expr) override;
- Result BeginLoopExpr(Expr* expr) override;
- Result BeginIfExpr(Expr* expr) override;
+ Result BeginBlockExpr(BlockExpr* expr) override;
+ Result BeginLoopExpr(LoopExpr* expr) override;
+ Result BeginIfExpr(IfExpr* expr) override;
private:
static bool HasName(StringSlice* str);
@@ -135,18 +135,18 @@ void NameGenerator::GenerateAndBindLocalNames(BindingHash* bindings,
}
}
-Result NameGenerator::BeginBlockExpr(Expr* expr) {
+Result NameGenerator::BeginBlockExpr(BlockExpr* expr) {
MaybeGenerateName("$B", label_count_++, &expr->block->label);
return Result::Ok;
}
-Result NameGenerator::BeginLoopExpr(Expr* expr) {
- MaybeGenerateName("$L", label_count_++, &expr->loop->label);
+Result NameGenerator::BeginLoopExpr(LoopExpr* expr) {
+ MaybeGenerateName("$L", label_count_++, &expr->block->label);
return Result::Ok;
}
-Result NameGenerator::BeginIfExpr(Expr* expr) {
- MaybeGenerateName("$I", label_count_++, &expr->if_.true_->label);
+Result NameGenerator::BeginIfExpr(IfExpr* expr) {
+ MaybeGenerateName("$I", label_count_++, &expr->true_->label);
return Result::Ok;
}
diff --git a/src/ir.cc b/src/ir.cc
index b80c14e9..cc7b8f48 100644
--- a/src/ir.cc
+++ b/src/ir.cc
@@ -323,296 +323,21 @@ Catch::~Catch() {
delete first;
}
-void destroy_catches(CatchVector* catches) {
- for (Catch* catch_ : *catches)
- delete catch_;
- delete catches;
+IfExpr::~IfExpr() {
+ delete true_;
+ DestroyExprList(false_);
}
-
-Expr::Expr() : type(ExprType::Binary), next(nullptr) {
- WABT_ZERO_MEMORY(loc);
- binary.opcode = Opcode::Nop;
+TryExpr::~TryExpr() {
+ delete block;
+ for (Catch* catch_ : catches)
+ delete catch_;
}
Expr::Expr(ExprType type) : type(type), next(nullptr) {
WABT_ZERO_MEMORY(loc);
}
-Expr::~Expr() {
- switch (type) {
- case ExprType::Block:
- delete block;
- break;
- case ExprType::Br:
- br.var.~Var();
- break;
- case ExprType::BrIf:
- br_if.var.~Var();
- break;
- case ExprType::BrTable:
- delete br_table.targets;
- br_table.default_target.~Var();
- break;
- case ExprType::Call:
- call.var.~Var();
- break;
- case ExprType::CallIndirect:
- call_indirect.var.~Var();
- break;
- case ExprType::GetGlobal:
- get_global.var.~Var();
- break;
- case ExprType::GetLocal:
- get_local.var.~Var();
- break;
- case ExprType::If:
- delete if_.true_;
- DestroyExprList(if_.false_);
- break;
- case ExprType::Loop:
- delete loop;
- break;
- case ExprType::Rethrow:
- rethrow_.var.~Var();
- break;
- case ExprType::SetGlobal:
- set_global.var.~Var();
- break;
- case ExprType::SetLocal:
- set_local.var.~Var();
- break;
- case ExprType::TeeLocal:
- tee_local.var.~Var();
- break;
- case ExprType::Throw:
- throw_.var.~Var();
- break;
- case ExprType::TryBlock:
- delete try_block.block;
- destroy_catches(try_block.catches);
- break;
- case ExprType::Binary:
- case ExprType::Compare:
- case ExprType::Const:
- case ExprType::Convert:
- case ExprType::Drop:
- case ExprType::CurrentMemory:
- case ExprType::GrowMemory:
- case ExprType::Load:
- case ExprType::Nop:
- case ExprType::Return:
- case ExprType::Select:
- case ExprType::Store:
- case ExprType::Unary:
- case ExprType::Unreachable:
- break;
- }
-}
-
-// static
-Expr* Expr::CreateBinary(Opcode opcode) {
- Expr* expr = new Expr(ExprType::Binary);
- expr->binary.opcode = opcode;
- return expr;
-}
-
-// static
-Expr* Expr::CreateBlock(Block* block) {
- Expr* expr = new Expr(ExprType::Block);
- expr->block = block;
- return expr;
-}
-
-// static
-Expr* Expr::CreateBr(Var var) {
- Expr* expr = new Expr(ExprType::Br);
- expr->br.var = var;
- return expr;
-}
-
-// static
-Expr* Expr::CreateBrIf(Var var) {
- Expr* expr = new Expr(ExprType::BrIf);
- expr->br_if.var = var;
- return expr;
-}
-
-// static
-Expr* Expr::CreateBrTable(VarVector* targets, Var default_target) {
- Expr* expr = new Expr(ExprType::BrTable);
- expr->br_table.targets = targets;
- expr->br_table.default_target = default_target;
- return expr;
-}
-
-// static
-Expr* Expr::CreateCall(Var var) {
- Expr* expr = new Expr(ExprType::Call);
- expr->call.var = var;
- return expr;
-}
-
-// static
-Expr* Expr::CreateCallIndirect(Var var) {
- Expr* expr = new Expr(ExprType::CallIndirect);
- expr->call_indirect.var = var;
- return expr;
-}
-
-// static
-Expr* Expr::CreateCompare(Opcode opcode) {
- Expr* expr = new Expr(ExprType::Compare);
- expr->compare.opcode = opcode;
- return expr;
-}
-
-// static
-Expr* Expr::CreateConst(const Const& const_) {
- Expr* expr = new Expr(ExprType::Const);
- expr->const_ = const_;
- return expr;
-}
-
-// static
-Expr* Expr::CreateConvert(Opcode opcode) {
- Expr* expr = new Expr(ExprType::Convert);
- expr->convert.opcode = opcode;
- return expr;
-}
-
-// static
-Expr* Expr::CreateCurrentMemory() {
- return new Expr(ExprType::CurrentMemory);
-}
-
-// static
-Expr* Expr::CreateDrop() {
- return new Expr(ExprType::Drop);
-}
-
-// static
-Expr* Expr::CreateGetGlobal(Var var) {
- Expr* expr = new Expr(ExprType::GetGlobal);
- expr->get_global.var = var;
- return expr;
-}
-
-// static
-Expr* Expr::CreateGetLocal(Var var) {
- Expr* expr = new Expr(ExprType::GetLocal);
- expr->get_local.var = var;
- return expr;
-}
-
-// static
-Expr* Expr::CreateGrowMemory() {
- return new Expr(ExprType::GrowMemory);
-}
-
-// static
-Expr* Expr::CreateIf(Block* true_, Expr* false_) {
- Expr* expr = new Expr(ExprType::If);
- expr->if_.true_ = true_;
- expr->if_.false_ = false_;
- return expr;
-}
-
-// static
-Expr* Expr::CreateLoad(Opcode opcode, Address align, uint32_t offset) {
- Expr* expr = new Expr(ExprType::Load);
- expr->load.opcode = opcode;
- expr->load.align = align;
- expr->load.offset = offset;
- return expr;
-}
-
-// static
-Expr* Expr::CreateLoop(Block* block) {
- Expr* expr = new Expr(ExprType::Loop);
- expr->loop = block;
- return expr;
-}
-
-// static
-Expr* Expr::CreateNop() {
- return new Expr(ExprType::Nop);
-}
-
-// static
-Expr* Expr::CreateRethrow(Var var) {
- Expr* expr = new Expr(ExprType::Rethrow);
- expr->rethrow_.var = var;
- return expr;
-}
-
-// static
-Expr* Expr::CreateReturn() {
- return new Expr(ExprType::Return);
-}
-
-// static
-Expr* Expr::CreateSelect() {
- return new Expr(ExprType::Select);
-}
-
-// static
-Expr* Expr::CreateSetGlobal(Var var) {
- Expr* expr = new Expr(ExprType::SetGlobal);
- expr->set_global.var = var;
- return expr;
-}
-
-// static
-Expr* Expr::CreateSetLocal(Var var) {
- Expr* expr = new Expr(ExprType::SetLocal);
- expr->set_local.var = var;
- return expr;
-}
-
-// static
-Expr* Expr::CreateStore(Opcode opcode, Address align, uint32_t offset) {
- Expr* expr = new Expr(ExprType::Store);
- expr->store.opcode = opcode;
- expr->store.align = align;
- expr->store.offset = offset;
- return expr;
-}
-
-// static
-Expr* Expr::CreateTeeLocal(Var var) {
- Expr* expr = new Expr(ExprType::TeeLocal);
- expr->tee_local.var = var;
- return expr;
-}
-
-// static
-Expr* Expr::CreateThrow(Var var) {
- Expr* expr = new Expr(ExprType::Throw);
- expr->throw_.var = var;
- return expr;
-}
-
-// static
-Expr* Expr::CreateTry() {
- Expr* expr = new Expr(ExprType::TryBlock);
- expr->try_block.block = nullptr;
- expr->try_block.catches = new CatchVector();
- return expr;
-}
-
-// static
-Expr* Expr::CreateUnary(Opcode opcode) {
- Expr* expr = new Expr(ExprType::Unary);
- expr->unary.opcode = opcode;
- return expr;
-}
-
-// static
-Expr* Expr::CreateUnreachable() {
- return new Expr(ExprType::Unreachable);
-}
-
FuncType::FuncType() {
WABT_ZERO_MEMORY(name);
}
diff --git a/src/ir.h b/src/ir.h
index 09cc1c7c..058da8e9 100644
--- a/src/ir.h
+++ b/src/ir.h
@@ -23,6 +23,7 @@
#include <memory>
#include <string>
#include <vector>
+#include <type_traits>
#include "binding-hash.h"
#include "common.h"
@@ -123,7 +124,7 @@ enum class ExprType {
typedef TypeVector BlockSignature;
-struct Expr;
+class Expr;
struct Block {
WABT_DISALLOW_COPY_AND_ASSIGN(Block);
@@ -144,7 +145,7 @@ struct Catch {
~Catch();
Location loc;
Var var;
- struct Expr* first;
+ Expr* first;
bool IsCatchAll() const {
return var.type == VarType::Index && var.index == kInvalidIndex;
}
@@ -152,62 +153,148 @@ struct Catch {
typedef std::vector<Catch*> CatchVector;
-struct Expr {
+class Expr {
+ public:
WABT_DISALLOW_COPY_AND_ASSIGN(Expr);
- Expr();
- explicit Expr(ExprType);
- ~Expr();
-
- static Expr* CreateBinary(Opcode);
- static Expr* CreateBlock(Block*);
- static Expr* CreateBr(Var);
- static Expr* CreateBrIf(Var);
- static Expr* CreateBrTable(VarVector* targets, Var default_target);
- static Expr* CreateCall(Var);
- static Expr* CreateCallIndirect(Var);
- static Expr* CreateCompare(Opcode);
- static Expr* CreateConst(const Const&);
- static Expr* CreateConvert(Opcode);
- static Expr* CreateCurrentMemory();
- static Expr* CreateDrop();
- static Expr* CreateGetGlobal(Var);
- static Expr* CreateGetLocal(Var);
- static Expr* CreateGrowMemory();
- static Expr* CreateIf(Block* true_, Expr* false_ = nullptr);
- static Expr* CreateLoad(Opcode, Address align, uint32_t offset);
- static Expr* CreateLoop(Block*);
- static Expr* CreateNop();
- static Expr* CreateRethrow(Var);
- static Expr* CreateReturn();
- static Expr* CreateSelect();
- static Expr* CreateSetGlobal(Var);
- static Expr* CreateSetLocal(Var);
- static Expr* CreateStore(Opcode, Address align, uint32_t offset);
- static Expr* CreateTeeLocal(Var);
- static Expr* CreateThrow(Var);
- static Expr* CreateTry();
- static Expr* CreateUnary(Opcode);
- static Expr* CreateUnreachable();
+ Expr() = delete;
+ virtual ~Expr() {}
+
+ template <typename T>
+ bool Is() const {
+ WABT_STATIC_ASSERT((std::is_base_of<Expr, T>::value));
+ return type == T::kStaticType;
+ };
+
+ template <typename T>
+ const T* As() const {
+ assert(Is<T>());
+ return static_cast<const T*>(this);
+ }
+
+ template <typename T>
+ T* As() {
+ assert(Is<T>());
+ return static_cast<T*>(this);
+ }
Location loc;
ExprType type;
Expr* next;
- union {
- struct { Opcode opcode; } binary, compare, convert, unary;
- struct Block *block, *loop;
- struct { Block* block; CatchVector* catches; } try_block;
- struct { Var var; } throw_, rethrow_;
- struct { Var var; } br, br_if;
- struct { VarVector* targets; Var default_target; } br_table;
- struct { Var var; } call, call_indirect;
- struct Const const_;
- struct { Var var; } get_global, set_global;
- struct { Var var; } get_local, set_local, tee_local;
- struct { Block* true_; Expr* false_; } if_;
- struct { Opcode opcode; Address align; uint32_t offset; } load, store;
- };
+
+ protected:
+ explicit Expr(ExprType);
+};
+
+template <ExprType T>
+class ExprMixin : public Expr {
+ public:
+ static const ExprType kStaticType = T;
+ ExprMixin() : Expr(T) {}
+};
+
+typedef ExprMixin<ExprType::CurrentMemory> CurrentMemoryExpr;
+typedef ExprMixin<ExprType::Drop> DropExpr;
+typedef ExprMixin<ExprType::GrowMemory> GrowMemoryExpr;
+typedef ExprMixin<ExprType::Nop> NopExpr;
+typedef ExprMixin<ExprType::Return> ReturnExpr;
+typedef ExprMixin<ExprType::Select> SelectExpr;
+typedef ExprMixin<ExprType::Unreachable> UnreachableExpr;
+
+template <ExprType T>
+class OpcodeExpr : public ExprMixin<T> {
+ public:
+ OpcodeExpr(Opcode opcode) : opcode(opcode) {}
+
+ Opcode opcode;
+};
+
+typedef OpcodeExpr<ExprType::Binary> BinaryExpr;
+typedef OpcodeExpr<ExprType::Compare> CompareExpr;
+typedef OpcodeExpr<ExprType::Convert> ConvertExpr;
+typedef OpcodeExpr<ExprType::Unary> UnaryExpr;
+
+template <ExprType T>
+class VarExpr : public ExprMixin<T> {
+ public:
+ VarExpr(const Var& var) : var(var) {}
+
+ Var var;
+};
+
+typedef VarExpr<ExprType::Br> BrExpr;
+typedef VarExpr<ExprType::BrIf> BrIfExpr;
+typedef VarExpr<ExprType::Call> CallExpr;
+typedef VarExpr<ExprType::CallIndirect> CallIndirectExpr;
+typedef VarExpr<ExprType::GetGlobal> GetGlobalExpr;
+typedef VarExpr<ExprType::GetLocal> GetLocalExpr;
+typedef VarExpr<ExprType::Rethrow> RethrowExpr;
+typedef VarExpr<ExprType::SetGlobal> SetGlobalExpr;
+typedef VarExpr<ExprType::SetLocal> SetLocalExpr;
+typedef VarExpr<ExprType::TeeLocal> TeeLocalExpr;
+typedef VarExpr<ExprType::Throw> ThrowExpr;
+
+template <ExprType type>
+class BlockExprBase : public ExprMixin<type> {
+ public:
+ explicit BlockExprBase(Block* block) : block(block) {}
+ ~BlockExprBase() { delete block; }
+
+ Block* block;
+};
+
+typedef BlockExprBase<ExprType::Block> BlockExpr;
+typedef BlockExprBase<ExprType::Loop> LoopExpr;
+
+class IfExpr : public ExprMixin<ExprType::If> {
+ public:
+ explicit IfExpr(Block* true_block, Expr* false_expr = nullptr)
+ : true_(true_block), false_(false_expr) {}
+ ~IfExpr();
+
+ Block* true_;
+ Expr* false_;
+};
+
+class TryExpr : public ExprMixin<ExprType::TryBlock> {
+ public:
+ TryExpr() : block(nullptr) {}
+ ~TryExpr();
+
+ Block* block;
+ CatchVector catches;
};
+class BrTableExpr : public ExprMixin<ExprType::BrTable> {
+ public:
+ BrTableExpr(VarVector* targets, Var default_target)
+ : targets(targets), default_target(default_target) {}
+ ~BrTableExpr() { delete targets; }
+
+ VarVector* targets;
+ Var default_target;
+};
+
+class ConstExpr : public ExprMixin<ExprType::Const> {
+ public:
+ ConstExpr(const Const& c) : const_(c) {}
+
+ Const const_;
+};
+
+template <ExprType T>
+class LoadStoreExpr : public ExprMixin<T> {
+ public:
+ LoadStoreExpr(Opcode opcode, Address align, uint32_t offset)
+ : opcode(opcode), align(align), offset(offset) {}
+
+ Opcode opcode;
+ Address align;
+ uint32_t offset;
+};
+
+typedef LoadStoreExpr<ExprType::Load> LoadExpr;
+typedef LoadStoreExpr<ExprType::Store> StoreExpr;
+
struct Exception {
StringSlice name;
TypeVector sig;
diff --git a/src/prebuilt/wast-parser-gen.cc b/src/prebuilt/wast-parser-gen.cc
index b40c8bc1..b072208a 100644
--- a/src/prebuilt/wast-parser-gen.cc
+++ b/src/prebuilt/wast-parser-gen.cc
@@ -672,28 +672,28 @@ static const yytype_uint8 yytranslate[] =
/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
static const yytype_uint16 yyrline[] =
{
- 0, 264, 264, 270, 280, 281, 285, 303, 304, 310,
- 313, 318, 326, 330, 331, 336, 345, 346, 354, 360,
- 366, 371, 378, 384, 395, 399, 403, 410, 414, 422,
- 423, 430, 431, 434, 438, 439, 443, 444, 460, 461,
- 476, 477, 478, 482, 485, 488, 491, 494, 498, 502,
- 506, 509, 513, 517, 521, 525, 529, 533, 537, 540,
- 543, 556, 559, 562, 565, 568, 571, 574, 578, 585,
- 590, 595, 600, 606, 615, 618, 623, 630, 637, 644,
- 645, 649, 653, 660, 664, 667, 672, 677, 683, 691,
- 697, 706, 709, 715, 719, 727, 735, 738, 742, 746,
- 750, 754, 758, 765, 770, 776, 782, 783, 791, 792,
- 800, 805, 813, 822, 836, 844, 849, 860, 868, 879,
- 886, 887, 893, 903, 904, 913, 920, 921, 927, 937,
- 938, 947, 954, 958, 963, 975, 978, 982, 992, 1006,
- 1020, 1026, 1034, 1042, 1062, 1072, 1086, 1100, 1105, 1113,
- 1121, 1145, 1159, 1165, 1173, 1186, 1195, 1203, 1209, 1215,
- 1221, 1229, 1239, 1247, 1253, 1259, 1265, 1271, 1279, 1288,
- 1298, 1305, 1316, 1325, 1326, 1327, 1328, 1329, 1330, 1331,
- 1332, 1333, 1334, 1335, 1339, 1340, 1344, 1349, 1357, 1378,
- 1385, 1388, 1396, 1414, 1422, 1433, 1444, 1455, 1461, 1467,
- 1473, 1479, 1485, 1490, 1495, 1501, 1510, 1515, 1516, 1521,
- 1531, 1535, 1542, 1554, 1555, 1562, 1565, 1625, 1637
+ 0, 263, 263, 269, 279, 280, 284, 302, 303, 309,
+ 312, 317, 325, 329, 330, 335, 344, 345, 353, 359,
+ 365, 370, 377, 383, 394, 398, 402, 409, 413, 421,
+ 422, 429, 430, 433, 437, 438, 442, 443, 459, 460,
+ 475, 476, 477, 481, 484, 487, 490, 493, 497, 501,
+ 505, 508, 512, 516, 520, 524, 528, 532, 536, 539,
+ 542, 555, 558, 561, 564, 567, 570, 573, 577, 584,
+ 590, 596, 602, 609, 618, 621, 626, 633, 640, 647,
+ 648, 652, 657, 664, 668, 671, 676, 681, 686, 694,
+ 700, 709, 712, 718, 723, 731, 738, 741, 745, 749,
+ 753, 757, 761, 768, 773, 779, 785, 786, 794, 795,
+ 803, 808, 816, 825, 839, 847, 852, 863, 871, 882,
+ 889, 890, 896, 906, 907, 916, 923, 924, 930, 940,
+ 941, 950, 957, 961, 966, 978, 981, 985, 995, 1009,
+ 1023, 1029, 1037, 1045, 1065, 1075, 1089, 1103, 1108, 1116,
+ 1124, 1148, 1162, 1168, 1176, 1189, 1198, 1206, 1212, 1218,
+ 1224, 1232, 1242, 1250, 1256, 1262, 1268, 1274, 1282, 1291,
+ 1301, 1308, 1319, 1328, 1329, 1330, 1331, 1332, 1333, 1334,
+ 1335, 1336, 1337, 1338, 1342, 1343, 1347, 1352, 1360, 1381,
+ 1388, 1391, 1399, 1417, 1425, 1436, 1447, 1458, 1464, 1470,
+ 1476, 1482, 1488, 1493, 1498, 1504, 1513, 1518, 1519, 1524,
+ 1534, 1538, 1545, 1557, 1558, 1565, 1568, 1628, 1640
};
#endif
@@ -1724,435 +1724,417 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio
switch (yytype)
{
case 5: /* NAT */
-#line 228 "src/wast-parser.y" /* yacc.c:1257 */
+#line 227 "src/wast-parser.y" /* yacc.c:1257 */
{}
#line 1730 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 6: /* INT */
-#line 228 "src/wast-parser.y" /* yacc.c:1257 */
+#line 227 "src/wast-parser.y" /* yacc.c:1257 */
{}
#line 1736 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 7: /* FLOAT */
-#line 228 "src/wast-parser.y" /* yacc.c:1257 */
+#line 227 "src/wast-parser.y" /* yacc.c:1257 */
{}
#line 1742 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 8: /* TEXT */
-#line 228 "src/wast-parser.y" /* yacc.c:1257 */
+#line 227 "src/wast-parser.y" /* yacc.c:1257 */
{}
#line 1748 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 9: /* VAR */
-#line 228 "src/wast-parser.y" /* yacc.c:1257 */
+#line 227 "src/wast-parser.y" /* yacc.c:1257 */
{}
#line 1754 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 41: /* OFFSET_EQ_NAT */
-#line 228 "src/wast-parser.y" /* yacc.c:1257 */
+#line 227 "src/wast-parser.y" /* yacc.c:1257 */
{}
#line 1760 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 42: /* ALIGN_EQ_NAT */
-#line 228 "src/wast-parser.y" /* yacc.c:1257 */
+#line 227 "src/wast-parser.y" /* yacc.c:1257 */
{}
#line 1766 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 83: /* text_list */
-#line 248 "src/wast-parser.y" /* yacc.c:1257 */
+#line 247 "src/wast-parser.y" /* yacc.c:1257 */
{ destroy_text_list(&((*yyvaluep).text_list)); }
#line 1772 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 84: /* text_list_opt */
-#line 248 "src/wast-parser.y" /* yacc.c:1257 */
+#line 247 "src/wast-parser.y" /* yacc.c:1257 */
{ destroy_text_list(&((*yyvaluep).text_list)); }
#line 1778 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 85: /* quoted_text */
-#line 229 "src/wast-parser.y" /* yacc.c:1257 */
+#line 228 "src/wast-parser.y" /* yacc.c:1257 */
{ destroy_string_slice(&((*yyvaluep).text)); }
#line 1784 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 86: /* value_type_list */
-#line 249 "src/wast-parser.y" /* yacc.c:1257 */
+#line 248 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).types); }
#line 1790 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 88: /* global_type */
-#line 242 "src/wast-parser.y" /* yacc.c:1257 */
+#line 241 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).global); }
#line 1796 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 89: /* func_type */
-#line 241 "src/wast-parser.y" /* yacc.c:1257 */
+#line 240 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).func_sig); }
#line 1802 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 90: /* func_sig */
-#line 241 "src/wast-parser.y" /* yacc.c:1257 */
+#line 240 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).func_sig); }
#line 1808 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 91: /* func_sig_result */
-#line 241 "src/wast-parser.y" /* yacc.c:1257 */
+#line 240 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).func_sig); }
#line 1814 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 93: /* memory_sig */
-#line 244 "src/wast-parser.y" /* yacc.c:1257 */
+#line 243 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).memory); }
#line 1820 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 95: /* type_use */
-#line 250 "src/wast-parser.y" /* yacc.c:1257 */
+#line 249 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).var); }
#line 1826 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 97: /* literal */
-#line 230 "src/wast-parser.y" /* yacc.c:1257 */
+#line 229 "src/wast-parser.y" /* yacc.c:1257 */
{ destroy_string_slice(&((*yyvaluep).literal).text); }
#line 1832 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 98: /* var */
-#line 250 "src/wast-parser.y" /* yacc.c:1257 */
+#line 249 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).var); }
#line 1838 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 99: /* var_list */
-#line 251 "src/wast-parser.y" /* yacc.c:1257 */
+#line 250 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).vars); }
#line 1844 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 100: /* bind_var_opt */
-#line 229 "src/wast-parser.y" /* yacc.c:1257 */
+#line 228 "src/wast-parser.y" /* yacc.c:1257 */
{ destroy_string_slice(&((*yyvaluep).text)); }
#line 1850 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 101: /* bind_var */
-#line 229 "src/wast-parser.y" /* yacc.c:1257 */
+#line 228 "src/wast-parser.y" /* yacc.c:1257 */
{ destroy_string_slice(&((*yyvaluep).text)); }
#line 1856 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 102: /* labeling_opt */
-#line 229 "src/wast-parser.y" /* yacc.c:1257 */
+#line 228 "src/wast-parser.y" /* yacc.c:1257 */
{ destroy_string_slice(&((*yyvaluep).text)); }
#line 1862 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 105: /* instr */
-#line 238 "src/wast-parser.y" /* yacc.c:1257 */
+#line 237 "src/wast-parser.y" /* yacc.c:1257 */
{ DestroyExprList(((*yyvaluep).expr_list).first); }
#line 1868 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 106: /* plain_instr */
-#line 237 "src/wast-parser.y" /* yacc.c:1257 */
+#line 236 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).expr); }
#line 1874 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 107: /* block_instr */
-#line 237 "src/wast-parser.y" /* yacc.c:1257 */
+#line 236 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).expr); }
#line 1880 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 108: /* block_sig */
-#line 249 "src/wast-parser.y" /* yacc.c:1257 */
+#line 248 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).types); }
#line 1886 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 109: /* block */
-#line 232 "src/wast-parser.y" /* yacc.c:1257 */
+#line 231 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).block); }
#line 1892 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
- case 113: /* catch_instr_list */
-#line 237 "src/wast-parser.y" /* yacc.c:1257 */
- { delete ((*yyvaluep).expr); }
-#line 1898 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
- break;
-
case 114: /* expr */
-#line 238 "src/wast-parser.y" /* yacc.c:1257 */
+#line 237 "src/wast-parser.y" /* yacc.c:1257 */
{ DestroyExprList(((*yyvaluep).expr_list).first); }
-#line 1904 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 1898 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 115: /* expr1 */
-#line 238 "src/wast-parser.y" /* yacc.c:1257 */
- { DestroyExprList(((*yyvaluep).expr_list).first); }
-#line 1910 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
- break;
-
- case 116: /* try_ */
-#line 237 "src/wast-parser.y" /* yacc.c:1257 */
- { delete ((*yyvaluep).expr); }
-#line 1916 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
- break;
-
- case 118: /* catch_sexp_list */
#line 237 "src/wast-parser.y" /* yacc.c:1257 */
- { delete ((*yyvaluep).expr); }
-#line 1922 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+ { DestroyExprList(((*yyvaluep).expr_list).first); }
+#line 1904 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 119: /* if_block */
-#line 238 "src/wast-parser.y" /* yacc.c:1257 */
+#line 237 "src/wast-parser.y" /* yacc.c:1257 */
{ DestroyExprList(((*yyvaluep).expr_list).first); }
-#line 1928 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 1910 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 120: /* if_ */
-#line 238 "src/wast-parser.y" /* yacc.c:1257 */
+#line 237 "src/wast-parser.y" /* yacc.c:1257 */
{ DestroyExprList(((*yyvaluep).expr_list).first); }
-#line 1934 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 1916 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 124: /* instr_list */
-#line 238 "src/wast-parser.y" /* yacc.c:1257 */
+#line 237 "src/wast-parser.y" /* yacc.c:1257 */
{ DestroyExprList(((*yyvaluep).expr_list).first); }
-#line 1940 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 1922 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 125: /* expr_list */
-#line 238 "src/wast-parser.y" /* yacc.c:1257 */
+#line 237 "src/wast-parser.y" /* yacc.c:1257 */
{ DestroyExprList(((*yyvaluep).expr_list).first); }
-#line 1946 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 1928 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 126: /* const_expr */
-#line 238 "src/wast-parser.y" /* yacc.c:1257 */
+#line 237 "src/wast-parser.y" /* yacc.c:1257 */
{ DestroyExprList(((*yyvaluep).expr_list).first); }
-#line 1952 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 1934 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 129: /* func */
-#line 239 "src/wast-parser.y" /* yacc.c:1257 */
+#line 238 "src/wast-parser.y" /* yacc.c:1257 */
{ destroy_module_field_list(&((*yyvaluep).module_fields)); }
-#line 1958 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 1940 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 130: /* func_fields */
-#line 239 "src/wast-parser.y" /* yacc.c:1257 */
+#line 238 "src/wast-parser.y" /* yacc.c:1257 */
{ destroy_module_field_list(&((*yyvaluep).module_fields)); }
-#line 1964 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 1946 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 131: /* func_fields_import */
-#line 240 "src/wast-parser.y" /* yacc.c:1257 */
+#line 239 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).func); }
-#line 1970 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 1952 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 132: /* func_fields_import1 */
-#line 240 "src/wast-parser.y" /* yacc.c:1257 */
+#line 239 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).func); }
-#line 1976 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 1958 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 133: /* func_fields_import_result */
-#line 240 "src/wast-parser.y" /* yacc.c:1257 */
+#line 239 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).func); }
-#line 1982 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 1964 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 134: /* func_fields_body */
-#line 240 "src/wast-parser.y" /* yacc.c:1257 */
+#line 239 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).func); }
-#line 1988 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 1970 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 135: /* func_fields_body1 */
-#line 240 "src/wast-parser.y" /* yacc.c:1257 */
+#line 239 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).func); }
-#line 1994 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 1976 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 136: /* func_result_body */
-#line 240 "src/wast-parser.y" /* yacc.c:1257 */
+#line 239 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).func); }
-#line 2000 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 1982 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 137: /* func_body */
-#line 240 "src/wast-parser.y" /* yacc.c:1257 */
+#line 239 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).func); }
-#line 2006 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 1988 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 138: /* func_body1 */
-#line 240 "src/wast-parser.y" /* yacc.c:1257 */
+#line 239 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).func); }
-#line 2012 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 1994 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 139: /* offset */
-#line 238 "src/wast-parser.y" /* yacc.c:1257 */
+#line 237 "src/wast-parser.y" /* yacc.c:1257 */
{ DestroyExprList(((*yyvaluep).expr_list).first); }
-#line 2018 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 2000 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 141: /* table */
-#line 239 "src/wast-parser.y" /* yacc.c:1257 */
+#line 238 "src/wast-parser.y" /* yacc.c:1257 */
{ destroy_module_field_list(&((*yyvaluep).module_fields)); }
-#line 2024 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 2006 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 142: /* table_fields */
-#line 239 "src/wast-parser.y" /* yacc.c:1257 */
+#line 238 "src/wast-parser.y" /* yacc.c:1257 */
{ destroy_module_field_list(&((*yyvaluep).module_fields)); }
-#line 2030 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 2012 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 144: /* memory */
-#line 239 "src/wast-parser.y" /* yacc.c:1257 */
+#line 238 "src/wast-parser.y" /* yacc.c:1257 */
{ destroy_module_field_list(&((*yyvaluep).module_fields)); }
-#line 2036 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 2018 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 145: /* memory_fields */
-#line 239 "src/wast-parser.y" /* yacc.c:1257 */
+#line 238 "src/wast-parser.y" /* yacc.c:1257 */
{ destroy_module_field_list(&((*yyvaluep).module_fields)); }
-#line 2042 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 2024 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 146: /* global */
-#line 239 "src/wast-parser.y" /* yacc.c:1257 */
+#line 238 "src/wast-parser.y" /* yacc.c:1257 */
{ destroy_module_field_list(&((*yyvaluep).module_fields)); }
-#line 2048 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 2030 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 147: /* global_fields */
-#line 239 "src/wast-parser.y" /* yacc.c:1257 */
+#line 238 "src/wast-parser.y" /* yacc.c:1257 */
{ destroy_module_field_list(&((*yyvaluep).module_fields)); }
-#line 2054 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 2036 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 148: /* import_desc */
-#line 243 "src/wast-parser.y" /* yacc.c:1257 */
+#line 242 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).import); }
-#line 2060 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 2042 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 150: /* inline_import */
-#line 243 "src/wast-parser.y" /* yacc.c:1257 */
+#line 242 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).import); }
-#line 2066 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 2048 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 151: /* export_desc */
-#line 236 "src/wast-parser.y" /* yacc.c:1257 */
+#line 235 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).export_); }
-#line 2072 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 2054 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 153: /* inline_export */
-#line 236 "src/wast-parser.y" /* yacc.c:1257 */
+#line 235 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).export_); }
-#line 2078 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 2060 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 156: /* module_field */
-#line 239 "src/wast-parser.y" /* yacc.c:1257 */
+#line 238 "src/wast-parser.y" /* yacc.c:1257 */
{ destroy_module_field_list(&((*yyvaluep).module_fields)); }
-#line 2084 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 2066 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 157: /* module_fields_opt */
-#line 245 "src/wast-parser.y" /* yacc.c:1257 */
+#line 244 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).module); }
-#line 2090 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 2072 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 158: /* module_fields */
-#line 245 "src/wast-parser.y" /* yacc.c:1257 */
+#line 244 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).module); }
-#line 2096 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 2078 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 159: /* module */
-#line 245 "src/wast-parser.y" /* yacc.c:1257 */
+#line 244 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).module); }
-#line 2102 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 2084 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 160: /* inline_module */
-#line 245 "src/wast-parser.y" /* yacc.c:1257 */
+#line 244 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).module); }
-#line 2108 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 2090 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 161: /* script_var_opt */
-#line 250 "src/wast-parser.y" /* yacc.c:1257 */
+#line 249 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).var); }
-#line 2114 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 2096 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 162: /* script_module */
-#line 246 "src/wast-parser.y" /* yacc.c:1257 */
+#line 245 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).script_module); }
-#line 2120 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 2102 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 163: /* action */
-#line 231 "src/wast-parser.y" /* yacc.c:1257 */
+#line 230 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).action); }
-#line 2126 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 2108 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 164: /* assertion */
-#line 233 "src/wast-parser.y" /* yacc.c:1257 */
+#line 232 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).command); }
-#line 2132 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 2114 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 165: /* cmd */
-#line 233 "src/wast-parser.y" /* yacc.c:1257 */
+#line 232 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).command); }
-#line 2138 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 2120 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 166: /* cmd_list */
-#line 234 "src/wast-parser.y" /* yacc.c:1257 */
+#line 233 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).commands); }
-#line 2144 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 2126 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 168: /* const_list */
-#line 235 "src/wast-parser.y" /* yacc.c:1257 */
+#line 234 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).consts); }
-#line 2150 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 2132 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
case 169: /* script */
-#line 247 "src/wast-parser.y" /* yacc.c:1257 */
+#line 246 "src/wast-parser.y" /* yacc.c:1257 */
{ delete ((*yyvaluep).script); }
-#line 2156 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
+#line 2138 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */
break;
@@ -2444,18 +2426,18 @@ yyreduce:
switch (yyn)
{
case 2:
-#line 264 "src/wast-parser.y" /* yacc.c:1646 */
+#line 263 "src/wast-parser.y" /* yacc.c:1646 */
{
TextListNode* node = new TextListNode();
DUPTEXT(node->text, (yyvsp[0].text));
node->next = nullptr;
(yyval.text_list).first = (yyval.text_list).last = node;
}
-#line 2455 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2437 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 3:
-#line 270 "src/wast-parser.y" /* yacc.c:1646 */
+#line 269 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.text_list) = (yyvsp[-1].text_list);
TextListNode* node = new TextListNode();
@@ -2464,17 +2446,17 @@ yyreduce:
(yyval.text_list).last->next = node;
(yyval.text_list).last = node;
}
-#line 2468 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2450 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 4:
-#line 280 "src/wast-parser.y" /* yacc.c:1646 */
+#line 279 "src/wast-parser.y" /* yacc.c:1646 */
{ (yyval.text_list).first = (yyval.text_list).last = nullptr; }
-#line 2474 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2456 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 6:
-#line 285 "src/wast-parser.y" /* yacc.c:1646 */
+#line 284 "src/wast-parser.y" /* yacc.c:1646 */
{
TextListNode node;
node.text = (yyvsp[0].text);
@@ -2488,139 +2470,139 @@ yyreduce:
(yyval.text).start = data;
(yyval.text).length = size;
}
-#line 2492 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2474 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 7:
-#line 303 "src/wast-parser.y" /* yacc.c:1646 */
+#line 302 "src/wast-parser.y" /* yacc.c:1646 */
{ (yyval.types) = new TypeVector(); }
-#line 2498 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2480 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 8:
-#line 304 "src/wast-parser.y" /* yacc.c:1646 */
+#line 303 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.types) = (yyvsp[-1].types);
(yyval.types)->push_back((yyvsp[0].type));
}
-#line 2507 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2489 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 9:
-#line 310 "src/wast-parser.y" /* yacc.c:1646 */
+#line 309 "src/wast-parser.y" /* yacc.c:1646 */
{}
-#line 2513 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2495 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 10:
-#line 313 "src/wast-parser.y" /* yacc.c:1646 */
+#line 312 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.global) = new Global();
(yyval.global)->type = (yyvsp[0].type);
(yyval.global)->mutable_ = false;
}
-#line 2523 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2505 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 11:
-#line 318 "src/wast-parser.y" /* yacc.c:1646 */
+#line 317 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.global) = new Global();
(yyval.global)->type = (yyvsp[-1].type);
(yyval.global)->mutable_ = true;
}
-#line 2533 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2515 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 12:
-#line 326 "src/wast-parser.y" /* yacc.c:1646 */
+#line 325 "src/wast-parser.y" /* yacc.c:1646 */
{ (yyval.func_sig) = (yyvsp[-1].func_sig); }
-#line 2539 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2521 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 14:
-#line 331 "src/wast-parser.y" /* yacc.c:1646 */
+#line 330 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.func_sig) = (yyvsp[0].func_sig);
(yyval.func_sig)->param_types.insert((yyval.func_sig)->param_types.begin(), (yyvsp[-2].types)->begin(), (yyvsp[-2].types)->end());
delete (yyvsp[-2].types);
}
-#line 2549 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2531 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 15:
-#line 336 "src/wast-parser.y" /* yacc.c:1646 */
+#line 335 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.func_sig) = (yyvsp[0].func_sig);
(yyval.func_sig)->param_types.insert((yyval.func_sig)->param_types.begin(), (yyvsp[-2].type));
// Ignore bind_var.
destroy_string_slice(&(yyvsp[-3].text));
}
-#line 2560 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2542 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 16:
-#line 345 "src/wast-parser.y" /* yacc.c:1646 */
+#line 344 "src/wast-parser.y" /* yacc.c:1646 */
{ (yyval.func_sig) = new FuncSignature(); }
-#line 2566 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2548 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 17:
-#line 346 "src/wast-parser.y" /* yacc.c:1646 */
+#line 345 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.func_sig) = (yyvsp[0].func_sig);
(yyval.func_sig)->result_types.insert((yyval.func_sig)->result_types.begin(), (yyvsp[-2].types)->begin(), (yyvsp[-2].types)->end());
delete (yyvsp[-2].types);
}
-#line 2576 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2558 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 18:
-#line 354 "src/wast-parser.y" /* yacc.c:1646 */
+#line 353 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.table) = new Table();
(yyval.table)->elem_limits = (yyvsp[-1].limits);
}
-#line 2585 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2567 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 19:
-#line 360 "src/wast-parser.y" /* yacc.c:1646 */
+#line 359 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.memory) = new Memory();
(yyval.memory)->page_limits = (yyvsp[0].limits);
}
-#line 2594 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2576 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 20:
-#line 366 "src/wast-parser.y" /* yacc.c:1646 */
+#line 365 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.limits).has_max = false;
(yyval.limits).initial = (yyvsp[0].u64);
(yyval.limits).max = 0;
}
-#line 2604 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2586 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 21:
-#line 371 "src/wast-parser.y" /* yacc.c:1646 */
+#line 370 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.limits).has_max = true;
(yyval.limits).initial = (yyvsp[-1].u64);
(yyval.limits).max = (yyvsp[0].u64);
}
-#line 2614 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2596 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 22:
-#line 378 "src/wast-parser.y" /* yacc.c:1646 */
+#line 377 "src/wast-parser.y" /* yacc.c:1646 */
{ (yyval.var) = (yyvsp[-1].var); }
-#line 2620 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2602 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 23:
-#line 384 "src/wast-parser.y" /* yacc.c:1646 */
+#line 383 "src/wast-parser.y" /* yacc.c:1646 */
{
if (WABT_FAILED(parse_uint64((yyvsp[0].literal).text.start,
(yyvsp[0].literal).text.start + (yyvsp[0].literal).text.length, &(yyval.u64)))) {
@@ -2629,98 +2611,98 @@ yyreduce:
WABT_PRINTF_STRING_SLICE_ARG((yyvsp[0].literal).text));
}
}
-#line 2633 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2615 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 24:
-#line 395 "src/wast-parser.y" /* yacc.c:1646 */
+#line 394 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.literal).type = (yyvsp[0].literal).type;
DUPTEXT((yyval.literal).text, (yyvsp[0].literal).text);
}
-#line 2642 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2624 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 25:
-#line 399 "src/wast-parser.y" /* yacc.c:1646 */
+#line 398 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.literal).type = (yyvsp[0].literal).type;
DUPTEXT((yyval.literal).text, (yyvsp[0].literal).text);
}
-#line 2651 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2633 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 26:
-#line 403 "src/wast-parser.y" /* yacc.c:1646 */
+#line 402 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.literal).type = (yyvsp[0].literal).type;
DUPTEXT((yyval.literal).text, (yyvsp[0].literal).text);
}
-#line 2660 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2642 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 27:
-#line 410 "src/wast-parser.y" /* yacc.c:1646 */
+#line 409 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.var) = new Var((yyvsp[0].u64));
(yyval.var)->loc = (yylsp[0]);
}
-#line 2669 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2651 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 28:
-#line 414 "src/wast-parser.y" /* yacc.c:1646 */
+#line 413 "src/wast-parser.y" /* yacc.c:1646 */
{
StringSlice name;
DUPTEXT(name, (yyvsp[0].text));
(yyval.var) = new Var(name);
(yyval.var)->loc = (yylsp[0]);
}
-#line 2680 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2662 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 29:
-#line 422 "src/wast-parser.y" /* yacc.c:1646 */
+#line 421 "src/wast-parser.y" /* yacc.c:1646 */
{ (yyval.vars) = new VarVector(); }
-#line 2686 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2668 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 30:
-#line 423 "src/wast-parser.y" /* yacc.c:1646 */
+#line 422 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.vars) = (yyvsp[-1].vars);
(yyval.vars)->emplace_back(std::move(*(yyvsp[0].var)));
delete (yyvsp[0].var);
}
-#line 2696 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2678 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 31:
-#line 430 "src/wast-parser.y" /* yacc.c:1646 */
+#line 429 "src/wast-parser.y" /* yacc.c:1646 */
{ WABT_ZERO_MEMORY((yyval.text)); }
-#line 2702 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2684 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 33:
-#line 434 "src/wast-parser.y" /* yacc.c:1646 */
+#line 433 "src/wast-parser.y" /* yacc.c:1646 */
{ DUPTEXT((yyval.text), (yyvsp[0].text)); }
-#line 2708 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2690 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 34:
-#line 438 "src/wast-parser.y" /* yacc.c:1646 */
+#line 437 "src/wast-parser.y" /* yacc.c:1646 */
{ WABT_ZERO_MEMORY((yyval.text)); }
-#line 2714 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2696 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 36:
-#line 443 "src/wast-parser.y" /* yacc.c:1646 */
+#line 442 "src/wast-parser.y" /* yacc.c:1646 */
{ (yyval.u64) = 0; }
-#line 2720 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2702 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 37:
-#line 444 "src/wast-parser.y" /* yacc.c:1646 */
+#line 443 "src/wast-parser.y" /* yacc.c:1646 */
{
uint64_t offset64;
if (WABT_FAILED(parse_int64((yyvsp[0].text).start, (yyvsp[0].text).start + (yyvsp[0].text).length, &offset64,
@@ -2735,17 +2717,17 @@ yyreduce:
}
(yyval.u64) = static_cast<uint32_t>(offset64);
}
-#line 2739 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2721 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 38:
-#line 460 "src/wast-parser.y" /* yacc.c:1646 */
+#line 459 "src/wast-parser.y" /* yacc.c:1646 */
{ (yyval.u32) = USE_NATURAL_ALIGNMENT; }
-#line 2745 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2727 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 39:
-#line 461 "src/wast-parser.y" /* yacc.c:1646 */
+#line 460 "src/wast-parser.y" /* yacc.c:1646 */
{
if (WABT_FAILED(parse_int32((yyvsp[0].text).start, (yyvsp[0].text).start + (yyvsp[0].text).length, &(yyval.u32),
ParseIntType::UnsignedOnly))) {
@@ -2758,169 +2740,169 @@ yyreduce:
wast_parser_error(&(yylsp[0]), lexer, parser, "alignment must be power-of-two");
}
}
-#line 2762 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2744 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 40:
-#line 476 "src/wast-parser.y" /* yacc.c:1646 */
+#line 475 "src/wast-parser.y" /* yacc.c:1646 */
{ (yyval.expr_list) = join_exprs1(&(yylsp[0]), (yyvsp[0].expr)); }
-#line 2768 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2750 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 41:
-#line 477 "src/wast-parser.y" /* yacc.c:1646 */
+#line 476 "src/wast-parser.y" /* yacc.c:1646 */
{ (yyval.expr_list) = join_exprs1(&(yylsp[0]), (yyvsp[0].expr)); }
-#line 2774 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2756 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 43:
-#line 482 "src/wast-parser.y" /* yacc.c:1646 */
+#line 481 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateUnreachable();
+ (yyval.expr) = new UnreachableExpr();
}
-#line 2782 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2764 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 44:
-#line 485 "src/wast-parser.y" /* yacc.c:1646 */
+#line 484 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateNop();
+ (yyval.expr) = new NopExpr();
}
-#line 2790 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2772 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 45:
-#line 488 "src/wast-parser.y" /* yacc.c:1646 */
+#line 487 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateDrop();
+ (yyval.expr) = new DropExpr();
}
-#line 2798 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2780 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 46:
-#line 491 "src/wast-parser.y" /* yacc.c:1646 */
+#line 490 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateSelect();
+ (yyval.expr) = new SelectExpr();
}
-#line 2806 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2788 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 47:
-#line 494 "src/wast-parser.y" /* yacc.c:1646 */
+#line 493 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateBr(std::move(*(yyvsp[0].var)));
+ (yyval.expr) = new BrExpr(std::move(*(yyvsp[0].var)));
delete (yyvsp[0].var);
}
-#line 2815 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2797 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 48:
-#line 498 "src/wast-parser.y" /* yacc.c:1646 */
+#line 497 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateBrIf(std::move(*(yyvsp[0].var)));
+ (yyval.expr) = new BrIfExpr(std::move(*(yyvsp[0].var)));
delete (yyvsp[0].var);
}
-#line 2824 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2806 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 49:
-#line 502 "src/wast-parser.y" /* yacc.c:1646 */
+#line 501 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateBrTable((yyvsp[-1].vars), std::move(*(yyvsp[0].var)));
+ (yyval.expr) = new BrTableExpr((yyvsp[-1].vars), std::move(*(yyvsp[0].var)));
delete (yyvsp[0].var);
}
-#line 2833 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2815 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 50:
-#line 506 "src/wast-parser.y" /* yacc.c:1646 */
+#line 505 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateReturn();
+ (yyval.expr) = new ReturnExpr();
}
-#line 2841 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2823 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 51:
-#line 509 "src/wast-parser.y" /* yacc.c:1646 */
+#line 508 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateCall(std::move(*(yyvsp[0].var)));
+ (yyval.expr) = new CallExpr(std::move(*(yyvsp[0].var)));
delete (yyvsp[0].var);
}
-#line 2850 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2832 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 52:
-#line 513 "src/wast-parser.y" /* yacc.c:1646 */
+#line 512 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateCallIndirect(std::move(*(yyvsp[0].var)));
+ (yyval.expr) = new CallIndirectExpr(std::move(*(yyvsp[0].var)));
delete (yyvsp[0].var);
}
-#line 2859 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2841 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 53:
-#line 517 "src/wast-parser.y" /* yacc.c:1646 */
+#line 516 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateGetLocal(std::move(*(yyvsp[0].var)));
+ (yyval.expr) = new GetLocalExpr(std::move(*(yyvsp[0].var)));
delete (yyvsp[0].var);
}
-#line 2868 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2850 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 54:
-#line 521 "src/wast-parser.y" /* yacc.c:1646 */
+#line 520 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateSetLocal(std::move(*(yyvsp[0].var)));
+ (yyval.expr) = new SetLocalExpr(std::move(*(yyvsp[0].var)));
delete (yyvsp[0].var);
}
-#line 2877 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2859 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 55:
-#line 525 "src/wast-parser.y" /* yacc.c:1646 */
+#line 524 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateTeeLocal(std::move(*(yyvsp[0].var)));
+ (yyval.expr) = new TeeLocalExpr(std::move(*(yyvsp[0].var)));
delete (yyvsp[0].var);
}
-#line 2886 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2868 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 56:
-#line 529 "src/wast-parser.y" /* yacc.c:1646 */
+#line 528 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateGetGlobal(std::move(*(yyvsp[0].var)));
+ (yyval.expr) = new GetGlobalExpr(std::move(*(yyvsp[0].var)));
delete (yyvsp[0].var);
}
-#line 2895 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2877 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 57:
-#line 533 "src/wast-parser.y" /* yacc.c:1646 */
+#line 532 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateSetGlobal(std::move(*(yyvsp[0].var)));
+ (yyval.expr) = new SetGlobalExpr(std::move(*(yyvsp[0].var)));
delete (yyvsp[0].var);
}
-#line 2904 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2886 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 58:
-#line 537 "src/wast-parser.y" /* yacc.c:1646 */
+#line 536 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateLoad((yyvsp[-2].opcode), (yyvsp[0].u32), (yyvsp[-1].u64));
+ (yyval.expr) = new LoadExpr((yyvsp[-2].opcode), (yyvsp[0].u32), (yyvsp[-1].u64));
}
-#line 2912 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2894 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 59:
-#line 540 "src/wast-parser.y" /* yacc.c:1646 */
+#line 539 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateStore((yyvsp[-2].opcode), (yyvsp[0].u32), (yyvsp[-1].u64));
+ (yyval.expr) = new StoreExpr((yyvsp[-2].opcode), (yyvsp[0].u32), (yyvsp[-1].u64));
}
-#line 2920 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2902 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 60:
-#line 543 "src/wast-parser.y" /* yacc.c:1646 */
+#line 542 "src/wast-parser.y" /* yacc.c:1646 */
{
Const const_;
WABT_ZERO_MEMORY(const_);
@@ -2932,450 +2914,454 @@ yyreduce:
WABT_PRINTF_STRING_SLICE_ARG((yyvsp[0].literal).text));
}
delete [] (yyvsp[0].literal).text.start;
- (yyval.expr) = Expr::CreateConst(const_);
+ (yyval.expr) = new ConstExpr(const_);
}
-#line 2938 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2920 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 61:
-#line 556 "src/wast-parser.y" /* yacc.c:1646 */
+#line 555 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateUnary((yyvsp[0].opcode));
+ (yyval.expr) = new UnaryExpr((yyvsp[0].opcode));
}
-#line 2946 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2928 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 62:
-#line 559 "src/wast-parser.y" /* yacc.c:1646 */
+#line 558 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateBinary((yyvsp[0].opcode));
+ (yyval.expr) = new BinaryExpr((yyvsp[0].opcode));
}
-#line 2954 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2936 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 63:
-#line 562 "src/wast-parser.y" /* yacc.c:1646 */
+#line 561 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateCompare((yyvsp[0].opcode));
+ (yyval.expr) = new CompareExpr((yyvsp[0].opcode));
}
-#line 2962 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2944 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 64:
-#line 565 "src/wast-parser.y" /* yacc.c:1646 */
+#line 564 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateConvert((yyvsp[0].opcode));
+ (yyval.expr) = new ConvertExpr((yyvsp[0].opcode));
}
-#line 2970 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2952 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 65:
-#line 568 "src/wast-parser.y" /* yacc.c:1646 */
+#line 567 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateCurrentMemory();
+ (yyval.expr) = new CurrentMemoryExpr();
}
-#line 2978 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2960 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 66:
-#line 571 "src/wast-parser.y" /* yacc.c:1646 */
+#line 570 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateGrowMemory();
+ (yyval.expr) = new GrowMemoryExpr();
}
-#line 2986 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2968 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 67:
-#line 574 "src/wast-parser.y" /* yacc.c:1646 */
+#line 573 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateThrow(std::move(*(yyvsp[0].var)));
+ (yyval.expr) = new ThrowExpr(std::move(*(yyvsp[0].var)));
delete (yyvsp[0].var);
}
-#line 2995 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2977 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 68:
-#line 578 "src/wast-parser.y" /* yacc.c:1646 */
+#line 577 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateRethrow(std::move(*(yyvsp[0].var)));
+ (yyval.expr) = new RethrowExpr(std::move(*(yyvsp[0].var)));
delete (yyvsp[0].var);
}
-#line 3004 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2986 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 69:
-#line 585 "src/wast-parser.y" /* yacc.c:1646 */
+#line 584 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateBlock((yyvsp[-2].block));
- (yyval.expr)->block->label = (yyvsp[-3].text);
- CHECK_END_LABEL((yylsp[0]), (yyval.expr)->block->label, (yyvsp[0].text));
+ auto expr = new BlockExpr((yyvsp[-2].block));
+ expr->block->label = (yyvsp[-3].text);
+ CHECK_END_LABEL((yylsp[0]), expr->block->label, (yyvsp[0].text));
+ (yyval.expr) = expr;
}
-#line 3014 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 2997 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 70:
#line 590 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateLoop((yyvsp[-2].block));
- (yyval.expr)->loop->label = (yyvsp[-3].text);
- CHECK_END_LABEL((yylsp[0]), (yyval.expr)->loop->label, (yyvsp[0].text));
+ auto expr = new LoopExpr((yyvsp[-2].block));
+ expr->block->label = (yyvsp[-3].text);
+ CHECK_END_LABEL((yylsp[0]), expr->block->label, (yyvsp[0].text));
+ (yyval.expr) = expr;
}
-#line 3024 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3008 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 71:
-#line 595 "src/wast-parser.y" /* yacc.c:1646 */
+#line 596 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateIf((yyvsp[-2].block), nullptr);
- (yyval.expr)->if_.true_->label = (yyvsp[-3].text);
- CHECK_END_LABEL((yylsp[0]), (yyval.expr)->if_.true_->label, (yyvsp[0].text));
+ auto expr = new IfExpr((yyvsp[-2].block), nullptr);
+ expr->true_->label = (yyvsp[-3].text);
+ CHECK_END_LABEL((yylsp[0]), expr->true_->label, (yyvsp[0].text));
+ (yyval.expr) = expr;
}
-#line 3034 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3019 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 72:
-#line 600 "src/wast-parser.y" /* yacc.c:1646 */
+#line 602 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateIf((yyvsp[-5].block), (yyvsp[-2].expr_list).first);
- (yyval.expr)->if_.true_->label = (yyvsp[-6].text);
- CHECK_END_LABEL((yylsp[-3]), (yyval.expr)->if_.true_->label, (yyvsp[-3].text));
- CHECK_END_LABEL((yylsp[0]), (yyval.expr)->if_.true_->label, (yyvsp[0].text));
+ auto expr = new IfExpr((yyvsp[-5].block), (yyvsp[-2].expr_list).first);
+ expr->true_->label = (yyvsp[-6].text);
+ CHECK_END_LABEL((yylsp[-3]), expr->true_->label, (yyvsp[-3].text));
+ CHECK_END_LABEL((yylsp[0]), expr->true_->label, (yyvsp[0].text));
+ (yyval.expr) = expr;
}
-#line 3045 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3031 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 73:
-#line 606 "src/wast-parser.y" /* yacc.c:1646 */
+#line 609 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyvsp[-3].block)->label = (yyvsp[-4].text);
- (yyval.expr) = (yyvsp[-2].expr);
- (yyval.expr)->try_block.block = (yyvsp[-3].block);
+ (yyval.expr) = (yyvsp[-2].try_expr);
+ (yyval.expr)->As<TryExpr>()->block = (yyvsp[-3].block);
CHECK_END_LABEL((yylsp[0]), (yyvsp[-3].block)->label, (yyvsp[0].text));
}
-#line 3056 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3042 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 74:
-#line 615 "src/wast-parser.y" /* yacc.c:1646 */
+#line 618 "src/wast-parser.y" /* yacc.c:1646 */
{ (yyval.types) = (yyvsp[-1].types); }
-#line 3062 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3048 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 75:
-#line 618 "src/wast-parser.y" /* yacc.c:1646 */
+#line 621 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.block) = (yyvsp[0].block);
(yyval.block)->sig.insert((yyval.block)->sig.end(), (yyvsp[-1].types)->begin(), (yyvsp[-1].types)->end());
delete (yyvsp[-1].types);
}
-#line 3072 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3058 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 76:
-#line 623 "src/wast-parser.y" /* yacc.c:1646 */
+#line 626 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.block) = new Block();
(yyval.block)->first = (yyvsp[0].expr_list).first;
}
-#line 3081 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3067 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 77:
-#line 630 "src/wast-parser.y" /* yacc.c:1646 */
+#line 633 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.catch_) = new Catch(std::move(*(yyvsp[-1].var)), (yyvsp[0].expr_list).first);
(yyval.catch_)->loc = (yylsp[-2]);
delete (yyvsp[-1].var);
}
-#line 3091 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3077 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 78:
-#line 637 "src/wast-parser.y" /* yacc.c:1646 */
+#line 640 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.catch_) = new Catch((yyvsp[0].expr_list).first);
(yyval.catch_)->loc = (yylsp[-1]);
}
-#line 3100 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3086 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 81:
-#line 649 "src/wast-parser.y" /* yacc.c:1646 */
+#line 652 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateTry();
- (yyval.expr)->try_block.catches->push_back((yyvsp[0].catch_));
+ auto expr = new TryExpr();
+ expr->catches.push_back((yyvsp[0].catch_));
+ (yyval.try_expr) = expr;
}
-#line 3109 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3096 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 82:
-#line 653 "src/wast-parser.y" /* yacc.c:1646 */
+#line 657 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = (yyvsp[-1].expr);
- (yyval.expr)->try_block.catches->push_back((yyvsp[0].catch_));
+ (yyval.try_expr) = (yyvsp[-1].try_expr);
+ (yyval.try_expr)->As<TryExpr>()->catches.push_back((yyvsp[0].catch_));
}
-#line 3118 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3105 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 83:
-#line 660 "src/wast-parser.y" /* yacc.c:1646 */
+#line 664 "src/wast-parser.y" /* yacc.c:1646 */
{ (yyval.expr_list) = (yyvsp[-1].expr_list); }
-#line 3124 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3111 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 84:
-#line 664 "src/wast-parser.y" /* yacc.c:1646 */
+#line 668 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.expr_list) = join_exprs2(&(yylsp[-1]), &(yyvsp[0].expr_list), (yyvsp[-1].expr));
}
-#line 3132 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3119 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 85:
-#line 667 "src/wast-parser.y" /* yacc.c:1646 */
+#line 671 "src/wast-parser.y" /* yacc.c:1646 */
{
- Expr* expr = Expr::CreateBlock((yyvsp[0].block));
+ auto expr = new BlockExpr((yyvsp[0].block));
expr->block->label = (yyvsp[-1].text);
(yyval.expr_list) = join_exprs1(&(yylsp[-2]), expr);
}
-#line 3142 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3129 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 86:
-#line 672 "src/wast-parser.y" /* yacc.c:1646 */
+#line 676 "src/wast-parser.y" /* yacc.c:1646 */
{
- Expr* expr = Expr::CreateLoop((yyvsp[0].block));
- expr->loop->label = (yyvsp[-1].text);
+ auto expr = new LoopExpr((yyvsp[0].block));
+ expr->block->label = (yyvsp[-1].text);
(yyval.expr_list) = join_exprs1(&(yylsp[-2]), expr);
}
-#line 3152 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3139 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 87:
-#line 677 "src/wast-parser.y" /* yacc.c:1646 */
+#line 681 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.expr_list) = (yyvsp[0].expr_list);
- Expr* if_ = (yyvsp[0].expr_list).last;
- assert(if_->type == ExprType::If);
- if_->if_.true_->label = (yyvsp[-1].text);
+ IfExpr* if_ = (yyvsp[0].expr_list).last->As<IfExpr>();
+ if_->true_->label = (yyvsp[-1].text);
}
-#line 3163 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3149 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 88:
-#line 683 "src/wast-parser.y" /* yacc.c:1646 */
+#line 686 "src/wast-parser.y" /* yacc.c:1646 */
{
- Block* block = (yyvsp[0].expr)->try_block.block;
+ Block* block = (yyvsp[0].try_expr)->block;
block->label = (yyvsp[-1].text);
- (yyval.expr_list) = join_exprs1(&(yylsp[-2]), (yyvsp[0].expr));
+ (yyval.expr_list) = join_exprs1(&(yylsp[-2]), (yyvsp[0].try_expr));
}
-#line 3173 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3159 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 89:
-#line 691 "src/wast-parser.y" /* yacc.c:1646 */
+#line 694 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = (yyvsp[0].expr);
- Block* block = (yyval.expr)->try_block.block;
+ (yyval.try_expr) = (yyvsp[0].try_expr);
+ Block* block = (yyval.try_expr)->block;
block->sig.insert(block->sig.end(), (yyvsp[-1].types)->begin(), (yyvsp[-1].types)->end());
delete (yyvsp[-1].types);
}
-#line 3184 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3170 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 90:
-#line 697 "src/wast-parser.y" /* yacc.c:1646 */
+#line 700 "src/wast-parser.y" /* yacc.c:1646 */
{
Block* block = new Block();
block->first = (yyvsp[-1].expr_list).first;
- (yyval.expr) = (yyvsp[0].expr);
- (yyval.expr)->try_block.block = block;
+ (yyval.try_expr) = (yyvsp[0].try_expr);
+ (yyval.try_expr)->block = block;
}
-#line 3195 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3181 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 91:
-#line 706 "src/wast-parser.y" /* yacc.c:1646 */
+#line 709 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.catch_) = (yyvsp[-1].catch_);
}
-#line 3203 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3189 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 92:
-#line 709 "src/wast-parser.y" /* yacc.c:1646 */
+#line 712 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.catch_) = (yyvsp[-1].catch_);
}
-#line 3211 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3197 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 93:
-#line 715 "src/wast-parser.y" /* yacc.c:1646 */
+#line 718 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = Expr::CreateTry();
- (yyval.expr)->try_block.catches->push_back((yyvsp[0].catch_));
+ auto expr = new TryExpr();
+ expr->catches.push_back((yyvsp[0].catch_));
+ (yyval.try_expr) = expr;
}
-#line 3220 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3207 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 94:
-#line 719 "src/wast-parser.y" /* yacc.c:1646 */
+#line 723 "src/wast-parser.y" /* yacc.c:1646 */
{
- (yyval.expr) = (yyvsp[-1].expr);
- (yyval.expr)->try_block.catches->push_back((yyvsp[0].catch_));
+ (yyval.try_expr) = (yyvsp[-1].try_expr);
+ (yyval.try_expr)->As<TryExpr>()->catches.push_back((yyvsp[0].catch_));
}
-#line 3229 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3216 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 95:
-#line 727 "src/wast-parser.y" /* yacc.c:1646 */
+#line 731 "src/wast-parser.y" /* yacc.c:1646 */
{
- Expr* if_ = (yyvsp[0].expr_list).last;
- assert(if_->type == ExprType::If);
+ IfExpr* if_ = (yyvsp[0].expr_list).last->As<IfExpr>();
(yyval.expr_list) = (yyvsp[0].expr_list);
- Block* true_ = if_->if_.true_;
+ Block* true_ = if_->true_;
true_->sig.insert(true_->sig.end(), (yyvsp[-1].types)->begin(), (yyvsp[-1].types)->end());
delete (yyvsp[-1].types);
}
-#line 3242 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3228 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 97:
-#line 738 "src/wast-parser.y" /* yacc.c:1646 */
+#line 741 "src/wast-parser.y" /* yacc.c:1646 */
{
- Expr* expr = Expr::CreateIf(new Block((yyvsp[-5].expr_list).first), (yyvsp[-1].expr_list).first);
+ Expr* expr = new IfExpr(new Block((yyvsp[-5].expr_list).first), (yyvsp[-1].expr_list).first);
(yyval.expr_list) = join_exprs1(&(yylsp[-7]), expr);
}
-#line 3251 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3237 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 98:
-#line 742 "src/wast-parser.y" /* yacc.c:1646 */
+#line 745 "src/wast-parser.y" /* yacc.c:1646 */
{
- Expr* expr = Expr::CreateIf(new Block((yyvsp[-1].expr_list).first), nullptr);
+ Expr* expr = new IfExpr(new Block((yyvsp[-1].expr_list).first), nullptr);
(yyval.expr_list) = join_exprs1(&(yylsp[-3]), expr);
}
-#line 3260 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3246 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 99:
-#line 746 "src/wast-parser.y" /* yacc.c:1646 */
+#line 749 "src/wast-parser.y" /* yacc.c:1646 */
{
- Expr* expr = Expr::CreateIf(new Block((yyvsp[-5].expr_list).first), (yyvsp[-1].expr_list).first);
+ Expr* expr = new IfExpr(new Block((yyvsp[-5].expr_list).first), (yyvsp[-1].expr_list).first);
(yyval.expr_list) = join_exprs2(&(yylsp[-8]), &(yyvsp[-8].expr_list), expr);
}
-#line 3269 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3255 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 100:
-#line 750 "src/wast-parser.y" /* yacc.c:1646 */
+#line 753 "src/wast-parser.y" /* yacc.c:1646 */
{
- Expr* expr = Expr::CreateIf(new Block((yyvsp[-1].expr_list).first), nullptr);
+ Expr* expr = new IfExpr(new Block((yyvsp[-1].expr_list).first), nullptr);
(yyval.expr_list) = join_exprs2(&(yylsp[-4]), &(yyvsp[-4].expr_list), expr);
}
-#line 3278 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3264 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 101:
-#line 754 "src/wast-parser.y" /* yacc.c:1646 */
+#line 757 "src/wast-parser.y" /* yacc.c:1646 */
{
- Expr* expr = Expr::CreateIf(new Block((yyvsp[-1].expr_list).first), (yyvsp[0].expr_list).first);
+ Expr* expr = new IfExpr(new Block((yyvsp[-1].expr_list).first), (yyvsp[0].expr_list).first);
(yyval.expr_list) = join_exprs2(&(yylsp[-2]), &(yyvsp[-2].expr_list), expr);
}
-#line 3287 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3273 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 102:
-#line 758 "src/wast-parser.y" /* yacc.c:1646 */
+#line 761 "src/wast-parser.y" /* yacc.c:1646 */
{
- Expr* expr = Expr::CreateIf(new Block((yyvsp[0].expr_list).first), nullptr);
+ Expr* expr = new IfExpr(new Block((yyvsp[0].expr_list).first), nullptr);
(yyval.expr_list) = join_exprs2(&(yylsp[-1]), &(yyvsp[-1].expr_list), expr);
}
-#line 3296 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3282 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 103:
-#line 765 "src/wast-parser.y" /* yacc.c:1646 */
+#line 768 "src/wast-parser.y" /* yacc.c:1646 */
{
CHECK_ALLOW_EXCEPTIONS(&(yylsp[0]), "rethrow");
}
-#line 3304 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3290 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 104:
-#line 770 "src/wast-parser.y" /* yacc.c:1646 */
+#line 773 "src/wast-parser.y" /* yacc.c:1646 */
{
CHECK_ALLOW_EXCEPTIONS(&(yylsp[0]), "throw");
}
-#line 3312 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3298 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 105:
-#line 776 "src/wast-parser.y" /* yacc.c:1646 */
+#line 779 "src/wast-parser.y" /* yacc.c:1646 */
{
- CHECK_ALLOW_EXCEPTIONS(&(yylsp[0]), "try");
+ CHECK_ALLOW_EXCEPTIONS(&(yylsp[0]), "try");
}
-#line 3320 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3306 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 106:
-#line 782 "src/wast-parser.y" /* yacc.c:1646 */
+#line 785 "src/wast-parser.y" /* yacc.c:1646 */
{ WABT_ZERO_MEMORY((yyval.expr_list)); }
-#line 3326 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3312 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 107:
-#line 783 "src/wast-parser.y" /* yacc.c:1646 */
+#line 786 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.expr_list).first = (yyvsp[-1].expr_list).first;
(yyvsp[-1].expr_list).last->next = (yyvsp[0].expr_list).first;
(yyval.expr_list).last = (yyvsp[0].expr_list).last ? (yyvsp[0].expr_list).last : (yyvsp[-1].expr_list).last;
(yyval.expr_list).size = (yyvsp[-1].expr_list).size + (yyvsp[0].expr_list).size;
}
-#line 3337 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3323 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 108:
-#line 791 "src/wast-parser.y" /* yacc.c:1646 */
+#line 794 "src/wast-parser.y" /* yacc.c:1646 */
{ WABT_ZERO_MEMORY((yyval.expr_list)); }
-#line 3343 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3329 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 109:
-#line 792 "src/wast-parser.y" /* yacc.c:1646 */
+#line 795 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.expr_list).first = (yyvsp[-1].expr_list).first;
(yyvsp[-1].expr_list).last->next = (yyvsp[0].expr_list).first;
(yyval.expr_list).last = (yyvsp[0].expr_list).last ? (yyvsp[0].expr_list).last : (yyvsp[-1].expr_list).last;
(yyval.expr_list).size = (yyvsp[-1].expr_list).size + (yyvsp[0].expr_list).size;
}
-#line 3354 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3340 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 111:
-#line 805 "src/wast-parser.y" /* yacc.c:1646 */
+#line 808 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.exception) = new Exception();
(yyval.exception)->name = (yyvsp[-2].text);
(yyval.exception)->sig = std::move(*(yyvsp[-1].types));
delete (yyvsp[-1].types);
}
-#line 3365 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3351 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 112:
-#line 813 "src/wast-parser.y" /* yacc.c:1646 */
+#line 816 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.module_field) = new ModuleField(ModuleFieldType::Except);
(yyval.module_field)->loc = (yylsp[0]);
(yyval.module_field)->except = (yyvsp[0].exception);
}
-#line 3375 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3361 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 113:
-#line 822 "src/wast-parser.y" /* yacc.c:1646 */
+#line 825 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.module_fields) = (yyvsp[-1].module_fields);
ModuleField* main = (yyval.module_fields).first;
@@ -3387,11 +3373,11 @@ yyreduce:
main->import->func->name = (yyvsp[-2].text);
}
}
-#line 3391 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3377 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 114:
-#line 836 "src/wast-parser.y" /* yacc.c:1646 */
+#line 839 "src/wast-parser.y" /* yacc.c:1646 */
{
ModuleField* field = new ModuleField(ModuleFieldType::Func);
field->func = (yyvsp[0].func);
@@ -3400,21 +3386,21 @@ yyreduce:
delete (yyvsp[-1].var);
(yyval.module_fields).first = (yyval.module_fields).last = field;
}
-#line 3404 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3390 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 115:
-#line 844 "src/wast-parser.y" /* yacc.c:1646 */
+#line 847 "src/wast-parser.y" /* yacc.c:1646 */
{
ModuleField* field = new ModuleField(ModuleFieldType::Func);
field->func = (yyvsp[0].func);
(yyval.module_fields).first = (yyval.module_fields).last = field;
}
-#line 3414 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3400 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 116:
-#line 849 "src/wast-parser.y" /* yacc.c:1646 */
+#line 852 "src/wast-parser.y" /* yacc.c:1646 */
{
ModuleField* field = new ModuleField(ModuleFieldType::Import);
field->loc = (yylsp[-2]);
@@ -3426,11 +3412,11 @@ yyreduce:
delete (yyvsp[-1].var);
(yyval.module_fields).first = (yyval.module_fields).last = field;
}
-#line 3430 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3416 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 117:
-#line 860 "src/wast-parser.y" /* yacc.c:1646 */
+#line 863 "src/wast-parser.y" /* yacc.c:1646 */
{
ModuleField* field = new ModuleField(ModuleFieldType::Import);
field->loc = (yylsp[-1]);
@@ -3439,11 +3425,11 @@ yyreduce:
field->import->func = (yyvsp[0].func);
(yyval.module_fields).first = (yyval.module_fields).last = field;
}
-#line 3443 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3429 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 118:
-#line 868 "src/wast-parser.y" /* yacc.c:1646 */
+#line 871 "src/wast-parser.y" /* yacc.c:1646 */
{
ModuleField* field = new ModuleField(ModuleFieldType::Export);
field->loc = (yylsp[-1]);
@@ -3452,31 +3438,31 @@ yyreduce:
(yyval.module_fields).first = (yyvsp[0].module_fields).first;
(yyval.module_fields).last = (yyvsp[0].module_fields).last->next = field;
}
-#line 3456 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3442 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 119:
-#line 879 "src/wast-parser.y" /* yacc.c:1646 */
+#line 882 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.func) = (yyvsp[0].func);
reverse_bindings(&(yyval.func)->decl.sig.param_types, &(yyval.func)->param_bindings);
}
-#line 3465 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3451 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 121:
-#line 887 "src/wast-parser.y" /* yacc.c:1646 */
+#line 890 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.func) = (yyvsp[0].func);
(yyval.func)->decl.sig.param_types.insert((yyval.func)->decl.sig.param_types.begin(),
(yyvsp[-2].types)->begin(), (yyvsp[-2].types)->end());
delete (yyvsp[-2].types);
}
-#line 3476 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3462 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 122:
-#line 893 "src/wast-parser.y" /* yacc.c:1646 */
+#line 896 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.func) = (yyvsp[0].func);
(yyval.func)->param_bindings.emplace(string_slice_to_string((yyvsp[-3].text)),
@@ -3484,48 +3470,48 @@ yyreduce:
destroy_string_slice(&(yyvsp[-3].text));
(yyval.func)->decl.sig.param_types.insert((yyval.func)->decl.sig.param_types.begin(), (yyvsp[-2].type));
}
-#line 3488 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3474 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 123:
-#line 903 "src/wast-parser.y" /* yacc.c:1646 */
+#line 906 "src/wast-parser.y" /* yacc.c:1646 */
{ (yyval.func) = new Func(); }
-#line 3494 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3480 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 124:
-#line 904 "src/wast-parser.y" /* yacc.c:1646 */
+#line 907 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.func) = (yyvsp[0].func);
(yyval.func)->decl.sig.result_types.insert((yyval.func)->decl.sig.result_types.begin(),
(yyvsp[-2].types)->begin(), (yyvsp[-2].types)->end());
delete (yyvsp[-2].types);
}
-#line 3505 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3491 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 125:
-#line 913 "src/wast-parser.y" /* yacc.c:1646 */
+#line 916 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.func) = (yyvsp[0].func);
reverse_bindings(&(yyval.func)->decl.sig.param_types, &(yyval.func)->param_bindings);
}
-#line 3514 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3500 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 127:
-#line 921 "src/wast-parser.y" /* yacc.c:1646 */
+#line 924 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.func) = (yyvsp[0].func);
(yyval.func)->decl.sig.param_types.insert((yyval.func)->decl.sig.param_types.begin(),
(yyvsp[-2].types)->begin(), (yyvsp[-2].types)->end());
delete (yyvsp[-2].types);
}
-#line 3525 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3511 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 128:
-#line 927 "src/wast-parser.y" /* yacc.c:1646 */
+#line 930 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.func) = (yyvsp[0].func);
(yyval.func)->param_bindings.emplace(string_slice_to_string((yyvsp[-3].text)),
@@ -3533,50 +3519,50 @@ yyreduce:
destroy_string_slice(&(yyvsp[-3].text));
(yyval.func)->decl.sig.param_types.insert((yyval.func)->decl.sig.param_types.begin(), (yyvsp[-2].type));
}
-#line 3537 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3523 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 130:
-#line 938 "src/wast-parser.y" /* yacc.c:1646 */
+#line 941 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.func) = (yyvsp[0].func);
(yyval.func)->decl.sig.result_types.insert((yyval.func)->decl.sig.result_types.begin(),
(yyvsp[-2].types)->begin(), (yyvsp[-2].types)->end());
delete (yyvsp[-2].types);
}
-#line 3548 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3534 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 131:
-#line 947 "src/wast-parser.y" /* yacc.c:1646 */
+#line 950 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.func) = (yyvsp[0].func);
reverse_bindings(&(yyval.func)->local_types, &(yyval.func)->local_bindings);
}
-#line 3557 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3543 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 132:
-#line 954 "src/wast-parser.y" /* yacc.c:1646 */
+#line 957 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.func) = new Func();
(yyval.func)->first_expr = (yyvsp[0].expr_list).first;
}
-#line 3566 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3552 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 133:
-#line 958 "src/wast-parser.y" /* yacc.c:1646 */
+#line 961 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.func) = (yyvsp[0].func);
(yyval.func)->local_types.insert((yyval.func)->local_types.begin(), (yyvsp[-2].types)->begin(), (yyvsp[-2].types)->end());
delete (yyvsp[-2].types);
}
-#line 3576 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3562 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 134:
-#line 963 "src/wast-parser.y" /* yacc.c:1646 */
+#line 966 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.func) = (yyvsp[0].func);
(yyval.func)->local_bindings.emplace(string_slice_to_string((yyvsp[-3].text)),
@@ -3584,19 +3570,19 @@ yyreduce:
destroy_string_slice(&(yyvsp[-3].text));
(yyval.func)->local_types.insert((yyval.func)->local_types.begin(), (yyvsp[-2].type));
}
-#line 3588 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3574 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 135:
-#line 975 "src/wast-parser.y" /* yacc.c:1646 */
+#line 978 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.expr_list) = (yyvsp[-1].expr_list);
}
-#line 3596 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3582 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 137:
-#line 982 "src/wast-parser.y" /* yacc.c:1646 */
+#line 985 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.module_field) = new ModuleField(ModuleFieldType::ElemSegment);
(yyval.module_field)->loc = (yylsp[-4]);
@@ -3607,11 +3593,11 @@ yyreduce:
(yyval.module_field)->elem_segment->vars = std::move(*(yyvsp[-1].vars));
delete (yyvsp[-1].vars);
}
-#line 3611 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3597 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 138:
-#line 992 "src/wast-parser.y" /* yacc.c:1646 */
+#line 995 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.module_field) = new ModuleField(ModuleFieldType::ElemSegment);
(yyval.module_field)->loc = (yylsp[-3]);
@@ -3623,11 +3609,11 @@ yyreduce:
(yyval.module_field)->elem_segment->vars = std::move(*(yyvsp[-1].vars));
delete (yyvsp[-1].vars);
}
-#line 3627 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3613 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 139:
-#line 1006 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1009 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.module_fields) = (yyvsp[-1].module_fields);
ModuleField* main = (yyval.module_fields).first;
@@ -3639,22 +3625,22 @@ yyreduce:
main->import->table->name = (yyvsp[-2].text);
}
}
-#line 3643 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3629 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 140:
-#line 1020 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1023 "src/wast-parser.y" /* yacc.c:1646 */
{
ModuleField* field = new ModuleField(ModuleFieldType::Table);
field->loc = (yylsp[0]);
field->table = (yyvsp[0].table);
(yyval.module_fields).first = (yyval.module_fields).last = field;
}
-#line 3654 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3640 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 141:
-#line 1026 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1029 "src/wast-parser.y" /* yacc.c:1646 */
{
ModuleField* field = new ModuleField(ModuleFieldType::Import);
field->loc = (yylsp[-1]);
@@ -3663,11 +3649,11 @@ yyreduce:
field->import->table = (yyvsp[0].table);
(yyval.module_fields).first = (yyval.module_fields).last = field;
}
-#line 3667 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3653 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 142:
-#line 1034 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1037 "src/wast-parser.y" /* yacc.c:1646 */
{
ModuleField* field = new ModuleField(ModuleFieldType::Export);
field->loc = (yylsp[-1]);
@@ -3676,11 +3662,11 @@ yyreduce:
(yyval.module_fields).first = (yyvsp[0].module_fields).first;
(yyval.module_fields).last = (yyvsp[0].module_fields).last->next = field;
}
-#line 3680 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3666 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 143:
-#line 1042 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1045 "src/wast-parser.y" /* yacc.c:1646 */
{
ModuleField* table_field = new ModuleField(ModuleFieldType::Table);
Table* table = table_field->table = new Table();
@@ -3691,18 +3677,18 @@ yyreduce:
elem_field->loc = (yylsp[-2]);
ElemSegment* elem_segment = elem_field->elem_segment = new ElemSegment();
elem_segment->table_var = Var(kInvalidIndex);
- elem_segment->offset = Expr::CreateConst(Const(Const::I32(), 0));
+ elem_segment->offset = new ConstExpr(Const(Const::I32(), 0));
elem_segment->offset->loc = (yylsp[-2]);
elem_segment->vars = std::move(*(yyvsp[-1].vars));
delete (yyvsp[-1].vars);
(yyval.module_fields).first = table_field;
(yyval.module_fields).last = table_field->next = elem_field;
}
-#line 3702 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3688 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 144:
-#line 1062 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1065 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.module_field) = new ModuleField(ModuleFieldType::DataSegment);
(yyval.module_field)->loc = (yylsp[-4]);
@@ -3713,11 +3699,11 @@ yyreduce:
dup_text_list(&(yyvsp[-1].text_list), &(yyval.module_field)->data_segment->data, &(yyval.module_field)->data_segment->size);
destroy_text_list(&(yyvsp[-1].text_list));
}
-#line 3717 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3703 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 145:
-#line 1072 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1075 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.module_field) = new ModuleField(ModuleFieldType::DataSegment);
(yyval.module_field)->loc = (yylsp[-3]);
@@ -3729,11 +3715,11 @@ yyreduce:
dup_text_list(&(yyvsp[-1].text_list), &(yyval.module_field)->data_segment->data, &(yyval.module_field)->data_segment->size);
destroy_text_list(&(yyvsp[-1].text_list));
}
-#line 3733 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3719 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 146:
-#line 1086 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1089 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.module_fields) = (yyvsp[-1].module_fields);
ModuleField* main = (yyval.module_fields).first;
@@ -3745,21 +3731,21 @@ yyreduce:
main->import->memory->name = (yyvsp[-2].text);
}
}
-#line 3749 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3735 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 147:
-#line 1100 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1103 "src/wast-parser.y" /* yacc.c:1646 */
{
ModuleField* field = new ModuleField(ModuleFieldType::Memory);
field->memory = (yyvsp[0].memory);
(yyval.module_fields).first = (yyval.module_fields).last = field;
}
-#line 3759 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3745 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 148:
-#line 1105 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1108 "src/wast-parser.y" /* yacc.c:1646 */
{
ModuleField* field = new ModuleField(ModuleFieldType::Import);
field->loc = (yylsp[-1]);
@@ -3768,11 +3754,11 @@ yyreduce:
field->import->memory = (yyvsp[0].memory);
(yyval.module_fields).first = (yyval.module_fields).last = field;
}
-#line 3772 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3758 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 149:
-#line 1113 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1116 "src/wast-parser.y" /* yacc.c:1646 */
{
ModuleField* field = new ModuleField(ModuleFieldType::Export);
field->loc = (yylsp[-1]);
@@ -3781,17 +3767,17 @@ yyreduce:
(yyval.module_fields).first = (yyvsp[0].module_fields).first;
(yyval.module_fields).last = (yyvsp[0].module_fields).last->next = field;
}
-#line 3785 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3771 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 150:
-#line 1121 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1124 "src/wast-parser.y" /* yacc.c:1646 */
{
ModuleField* data_field = new ModuleField(ModuleFieldType::DataSegment);
data_field->loc = (yylsp[-2]);
DataSegment* data_segment = data_field->data_segment = new DataSegment();
data_segment->memory_var = Var(kInvalidIndex);
- data_segment->offset = Expr::CreateConst(Const(Const::I32(), 0));
+ data_segment->offset = new ConstExpr(Const(Const::I32(), 0));
data_segment->offset->loc = (yylsp[-2]);
dup_text_list(&(yyvsp[-1].text_list), &data_segment->data, &data_segment->size);
destroy_text_list(&(yyvsp[-1].text_list));
@@ -3807,11 +3793,11 @@ yyreduce:
(yyval.module_fields).first = memory_field;
(yyval.module_fields).last = memory_field->next = data_field;
}
-#line 3811 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3797 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 151:
-#line 1145 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1148 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.module_fields) = (yyvsp[-1].module_fields);
ModuleField* main = (yyval.module_fields).first;
@@ -3823,22 +3809,22 @@ yyreduce:
main->import->global->name = (yyvsp[-2].text);
}
}
-#line 3827 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3813 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 152:
-#line 1159 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1162 "src/wast-parser.y" /* yacc.c:1646 */
{
ModuleField* field = new ModuleField(ModuleFieldType::Global);
field->global = (yyvsp[-1].global);
field->global->init_expr = (yyvsp[0].expr_list).first;
(yyval.module_fields).first = (yyval.module_fields).last = field;
}
-#line 3838 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3824 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 153:
-#line 1165 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1168 "src/wast-parser.y" /* yacc.c:1646 */
{
ModuleField* field = new ModuleField(ModuleFieldType::Import);
field->loc = (yylsp[-1]);
@@ -3847,11 +3833,11 @@ yyreduce:
field->import->global = (yyvsp[0].global);
(yyval.module_fields).first = (yyval.module_fields).last = field;
}
-#line 3851 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3837 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 154:
-#line 1173 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1176 "src/wast-parser.y" /* yacc.c:1646 */
{
ModuleField* field = new ModuleField(ModuleFieldType::Export);
field->loc = (yylsp[-1]);
@@ -3860,11 +3846,11 @@ yyreduce:
(yyval.module_fields).first = (yyvsp[0].module_fields).first;
(yyval.module_fields).last = (yyvsp[0].module_fields).last->next = field;
}
-#line 3864 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3850 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 155:
-#line 1186 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1189 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.import) = new Import();
(yyval.import)->kind = ExternalKind::Func;
@@ -3874,11 +3860,11 @@ yyreduce:
(yyval.import)->func->decl.type_var = std::move(*(yyvsp[-1].var));
delete (yyvsp[-1].var);
}
-#line 3878 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3864 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 156:
-#line 1195 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1198 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.import) = new Import();
(yyval.import)->kind = ExternalKind::Func;
@@ -3887,54 +3873,54 @@ yyreduce:
(yyval.import)->func->decl.sig = std::move(*(yyvsp[-1].func_sig));
delete (yyvsp[-1].func_sig);
}
-#line 3891 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3877 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 157:
-#line 1203 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1206 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.import) = new Import();
(yyval.import)->kind = ExternalKind::Table;
(yyval.import)->table = (yyvsp[-1].table);
(yyval.import)->table->name = (yyvsp[-2].text);
}
-#line 3902 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3888 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 158:
-#line 1209 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1212 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.import) = new Import();
(yyval.import)->kind = ExternalKind::Memory;
(yyval.import)->memory = (yyvsp[-1].memory);
(yyval.import)->memory->name = (yyvsp[-2].text);
}
-#line 3913 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3899 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 159:
-#line 1215 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1218 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.import) = new Import();
(yyval.import)->kind = ExternalKind::Global;
(yyval.import)->global = (yyvsp[-1].global);
(yyval.import)->global->name = (yyvsp[-2].text);
}
-#line 3924 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3910 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 160:
-#line 1221 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1224 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.import) = new Import();
(yyval.import)->kind = ExternalKind::Except;
(yyval.import)->except = (yyvsp[0].exception);
}
-#line 3934 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3920 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 161:
-#line 1229 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1232 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.module_field) = new ModuleField(ModuleFieldType::Import);
(yyval.module_field)->loc = (yylsp[-4]);
@@ -3942,96 +3928,96 @@ yyreduce:
(yyval.module_field)->import->module_name = (yyvsp[-3].text);
(yyval.module_field)->import->field_name = (yyvsp[-2].text);
}
-#line 3946 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3932 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 162:
-#line 1239 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1242 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.import) = new Import();
(yyval.import)->module_name = (yyvsp[-2].text);
(yyval.import)->field_name = (yyvsp[-1].text);
}
-#line 3956 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3942 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 163:
-#line 1247 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1250 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.export_) = new Export();
(yyval.export_)->kind = ExternalKind::Func;
(yyval.export_)->var = std::move(*(yyvsp[-1].var));
delete (yyvsp[-1].var);
}
-#line 3967 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3953 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 164:
-#line 1253 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1256 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.export_) = new Export();
(yyval.export_)->kind = ExternalKind::Table;
(yyval.export_)->var = std::move(*(yyvsp[-1].var));
delete (yyvsp[-1].var);
}
-#line 3978 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3964 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 165:
-#line 1259 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1262 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.export_) = new Export();
(yyval.export_)->kind = ExternalKind::Memory;
(yyval.export_)->var = std::move(*(yyvsp[-1].var));
delete (yyvsp[-1].var);
}
-#line 3989 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3975 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 166:
-#line 1265 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1268 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.export_) = new Export();
(yyval.export_)->kind = ExternalKind::Global;
(yyval.export_)->var = std::move(*(yyvsp[-1].var));
delete (yyvsp[-1].var);
}
-#line 4000 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3986 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 167:
-#line 1271 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1274 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.export_) = new Export();
(yyval.export_)->kind = ExternalKind::Except;
(yyval.export_)->var = std::move(*(yyvsp[-1].var));
delete (yyvsp[-1].var);
}
-#line 4011 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 3997 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 168:
-#line 1279 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1282 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.module_field) = new ModuleField(ModuleFieldType::Export);
(yyval.module_field)->loc = (yylsp[-3]);
(yyval.module_field)->export_ = (yyvsp[-1].export_);
(yyval.module_field)->export_->name = (yyvsp[-2].text);
}
-#line 4022 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4008 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 169:
-#line 1288 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1291 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.export_) = new Export();
(yyval.export_)->name = (yyvsp[-1].text);
}
-#line 4031 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4017 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 170:
-#line 1298 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1301 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.module_field) = new ModuleField(ModuleFieldType::FuncType);
(yyval.module_field)->loc = (yylsp[-2]);
@@ -4039,11 +4025,11 @@ yyreduce:
(yyval.module_field)->func_type->sig = std::move(*(yyvsp[-1].func_sig));
delete (yyvsp[-1].func_sig);
}
-#line 4043 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4029 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 171:
-#line 1305 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1308 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.module_field) = new ModuleField(ModuleFieldType::FuncType);
(yyval.module_field)->loc = (yylsp[-3]);
@@ -4052,90 +4038,90 @@ yyreduce:
(yyval.module_field)->func_type->sig = std::move(*(yyvsp[-1].func_sig));
delete (yyvsp[-1].func_sig);
}
-#line 4056 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4042 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 172:
-#line 1316 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1319 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.module_field) = new ModuleField(ModuleFieldType::Start);
(yyval.module_field)->loc = (yylsp[-2]);
(yyval.module_field)->start = std::move(*(yyvsp[-1].var));
delete (yyvsp[-1].var);
}
-#line 4067 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4053 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 173:
-#line 1325 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1328 "src/wast-parser.y" /* yacc.c:1646 */
{ (yyval.module_fields).first = (yyval.module_fields).last = (yyvsp[0].module_field); }
-#line 4073 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4059 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 178:
-#line 1330 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1333 "src/wast-parser.y" /* yacc.c:1646 */
{ (yyval.module_fields).first = (yyval.module_fields).last = (yyvsp[0].module_field); }
-#line 4079 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4065 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 179:
-#line 1331 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1334 "src/wast-parser.y" /* yacc.c:1646 */
{ (yyval.module_fields).first = (yyval.module_fields).last = (yyvsp[0].module_field); }
-#line 4085 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4071 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 180:
-#line 1332 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1335 "src/wast-parser.y" /* yacc.c:1646 */
{ (yyval.module_fields).first = (yyval.module_fields).last = (yyvsp[0].module_field); }
-#line 4091 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4077 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 181:
-#line 1333 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1336 "src/wast-parser.y" /* yacc.c:1646 */
{ (yyval.module_fields).first = (yyval.module_fields).last = (yyvsp[0].module_field); }
-#line 4097 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4083 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 182:
-#line 1334 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1337 "src/wast-parser.y" /* yacc.c:1646 */
{ (yyval.module_fields).first = (yyval.module_fields).last = (yyvsp[0].module_field); }
-#line 4103 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4089 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 183:
-#line 1335 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1338 "src/wast-parser.y" /* yacc.c:1646 */
{ (yyval.module_fields).first = (yyval.module_fields).last = (yyvsp[0].module_field); }
-#line 4109 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4095 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 184:
-#line 1339 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1342 "src/wast-parser.y" /* yacc.c:1646 */
{ (yyval.module) = new Module(); }
-#line 4115 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4101 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 186:
-#line 1344 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1347 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.module) = new Module();
check_import_ordering(&(yylsp[0]), lexer, parser, (yyval.module), (yyvsp[0].module_fields).first);
append_module_fields((yyval.module), (yyvsp[0].module_fields).first);
}
-#line 4125 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4111 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 187:
-#line 1349 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1352 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.module) = (yyvsp[-1].module);
check_import_ordering(&(yylsp[0]), lexer, parser, (yyval.module), (yyvsp[0].module_fields).first);
append_module_fields((yyval.module), (yyvsp[0].module_fields).first);
}
-#line 4135 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4121 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 188:
-#line 1357 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1360 "src/wast-parser.y" /* yacc.c:1646 */
{
if ((yyvsp[0].script_module)->type == ScriptModule::Type::Text) {
(yyval.module) = (yyvsp[0].script_module)->text;
@@ -4154,29 +4140,29 @@ yyreduce:
}
delete (yyvsp[0].script_module);
}
-#line 4158 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4144 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 190:
-#line 1385 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1388 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.var) = new Var(kInvalidIndex);
}
-#line 4166 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4152 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 191:
-#line 1388 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1391 "src/wast-parser.y" /* yacc.c:1646 */
{
StringSlice name;
DUPTEXT(name, (yyvsp[0].text));
(yyval.var) = new Var(name);
}
-#line 4176 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4162 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 192:
-#line 1396 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1399 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.script_module) = new ScriptModule();
(yyval.script_module)->type = ScriptModule::Type::Text;
@@ -4195,11 +4181,11 @@ yyreduce:
}
}
}
-#line 4199 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4185 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 193:
-#line 1414 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1417 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.script_module) = new ScriptModule();
(yyval.script_module)->type = ScriptModule::Type::Binary;
@@ -4208,11 +4194,11 @@ yyreduce:
dup_text_list(&(yyvsp[-1].text_list), &(yyval.script_module)->binary.data, &(yyval.script_module)->binary.size);
destroy_text_list(&(yyvsp[-1].text_list));
}
-#line 4212 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4198 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 194:
-#line 1422 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1425 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.script_module) = new ScriptModule();
(yyval.script_module)->type = ScriptModule::Type::Quoted;
@@ -4221,11 +4207,11 @@ yyreduce:
dup_text_list(&(yyvsp[-1].text_list), &(yyval.script_module)->quoted.data, &(yyval.script_module)->quoted.size);
destroy_text_list(&(yyvsp[-1].text_list));
}
-#line 4225 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4211 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 195:
-#line 1433 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1436 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.action) = new Action();
(yyval.action)->loc = (yylsp[-4]);
@@ -4237,11 +4223,11 @@ yyreduce:
(yyval.action)->invoke->args = std::move(*(yyvsp[-1].consts));
delete (yyvsp[-1].consts);
}
-#line 4241 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4227 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 196:
-#line 1444 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1447 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.action) = new Action();
(yyval.action)->loc = (yylsp[-3]);
@@ -4250,128 +4236,128 @@ yyreduce:
(yyval.action)->type = ActionType::Get;
(yyval.action)->name = (yyvsp[-1].text);
}
-#line 4254 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4240 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 197:
-#line 1455 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1458 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.command) = new Command();
(yyval.command)->type = CommandType::AssertMalformed;
(yyval.command)->assert_malformed.module = (yyvsp[-2].script_module);
(yyval.command)->assert_malformed.text = (yyvsp[-1].text);
}
-#line 4265 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4251 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 198:
-#line 1461 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1464 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.command) = new Command();
(yyval.command)->type = CommandType::AssertInvalid;
(yyval.command)->assert_invalid.module = (yyvsp[-2].script_module);
(yyval.command)->assert_invalid.text = (yyvsp[-1].text);
}
-#line 4276 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4262 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 199:
-#line 1467 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1470 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.command) = new Command();
(yyval.command)->type = CommandType::AssertUnlinkable;
(yyval.command)->assert_unlinkable.module = (yyvsp[-2].script_module);
(yyval.command)->assert_unlinkable.text = (yyvsp[-1].text);
}
-#line 4287 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4273 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 200:
-#line 1473 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1476 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.command) = new Command();
(yyval.command)->type = CommandType::AssertUninstantiable;
(yyval.command)->assert_uninstantiable.module = (yyvsp[-2].script_module);
(yyval.command)->assert_uninstantiable.text = (yyvsp[-1].text);
}
-#line 4298 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4284 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 201:
-#line 1479 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1482 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.command) = new Command();
(yyval.command)->type = CommandType::AssertReturn;
(yyval.command)->assert_return.action = (yyvsp[-2].action);
(yyval.command)->assert_return.expected = (yyvsp[-1].consts);
}
-#line 4309 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4295 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 202:
-#line 1485 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1488 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.command) = new Command();
(yyval.command)->type = CommandType::AssertReturnCanonicalNan;
(yyval.command)->assert_return_canonical_nan.action = (yyvsp[-1].action);
}
-#line 4319 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4305 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 203:
-#line 1490 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1493 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.command) = new Command();
(yyval.command)->type = CommandType::AssertReturnArithmeticNan;
(yyval.command)->assert_return_arithmetic_nan.action = (yyvsp[-1].action);
}
-#line 4329 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4315 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 204:
-#line 1495 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1498 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.command) = new Command();
(yyval.command)->type = CommandType::AssertTrap;
(yyval.command)->assert_trap.action = (yyvsp[-2].action);
(yyval.command)->assert_trap.text = (yyvsp[-1].text);
}
-#line 4340 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4326 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 205:
-#line 1501 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1504 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.command) = new Command();
(yyval.command)->type = CommandType::AssertExhaustion;
(yyval.command)->assert_trap.action = (yyvsp[-2].action);
(yyval.command)->assert_trap.text = (yyvsp[-1].text);
}
-#line 4351 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4337 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 206:
-#line 1510 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1513 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.command) = new Command();
(yyval.command)->type = CommandType::Action;
(yyval.command)->action = (yyvsp[0].action);
}
-#line 4361 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4347 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 208:
-#line 1516 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1519 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.command) = new Command();
(yyval.command)->type = CommandType::Module;
(yyval.command)->module = (yyvsp[0].module);
}
-#line 4371 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4357 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 209:
-#line 1521 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1524 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.command) = new Command();
(yyval.command)->type = CommandType::Register;
@@ -4380,29 +4366,29 @@ yyreduce:
delete (yyvsp[-1].var);
(yyval.command)->register_.var.loc = (yylsp[-1]);
}
-#line 4384 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4370 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 210:
-#line 1531 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1534 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.commands) = new CommandPtrVector();
(yyval.commands)->emplace_back((yyvsp[0].command));
}
-#line 4393 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4379 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 211:
-#line 1535 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1538 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.commands) = (yyvsp[-1].commands);
(yyval.commands)->emplace_back((yyvsp[0].command));
}
-#line 4402 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4388 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 212:
-#line 1542 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1545 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.const_).loc = (yylsp[-2]);
if (WABT_FAILED(parse_const((yyvsp[-2].type), (yyvsp[-1].literal).type, (yyvsp[-1].literal).text.start,
@@ -4413,34 +4399,34 @@ yyreduce:
}
delete [] (yyvsp[-1].literal).text.start;
}
-#line 4417 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4403 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 213:
-#line 1554 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1557 "src/wast-parser.y" /* yacc.c:1646 */
{ (yyval.consts) = new ConstVector(); }
-#line 4423 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4409 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 214:
-#line 1555 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1558 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.consts) = (yyvsp[-1].consts);
(yyval.consts)->push_back((yyvsp[0].const_));
}
-#line 4432 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4418 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 215:
-#line 1562 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1565 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.script) = new Script();
}
-#line 4440 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4426 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 216:
-#line 1565 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1568 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.script) = new Script();
(yyval.script)->commands = std::move(*(yyvsp[0].commands));
@@ -4501,11 +4487,11 @@ yyreduce:
}
}
}
-#line 4505 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4491 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 217:
-#line 1625 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1628 "src/wast-parser.y" /* yacc.c:1646 */
{
(yyval.script) = new Script();
Command* command = new Command();
@@ -4513,17 +4499,17 @@ yyreduce:
command->module = (yyvsp[0].module);
(yyval.script)->commands.emplace_back(command);
}
-#line 4517 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4503 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
case 218:
-#line 1637 "src/wast-parser.y" /* yacc.c:1646 */
+#line 1640 "src/wast-parser.y" /* yacc.c:1646 */
{ parser->script = (yyvsp[0].script); }
-#line 4523 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4509 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
break;
-#line 4527 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
+#line 4513 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */
default: break;
}
/* User semantic actions sometimes alter yychar, and that requires
@@ -4758,7 +4744,7 @@ yyreturn:
#endif
return yyresult;
}
-#line 1640 "src/wast-parser.y" /* yacc.c:1906 */
+#line 1643 "src/wast-parser.y" /* yacc.c:1906 */
void append_expr_list(ExprList* expr_list, ExprList* expr) {
@@ -5056,7 +5042,7 @@ void append_module_fields(Module* module, ModuleField* first) {
break;
case ModuleFieldType::Except:
- name = &field->except->name;
+ name = &field->except->name;
bindings = &module->except_bindings;
index = module->excepts.size();
module->excepts.push_back(field->except);
diff --git a/src/resolve-names.cc b/src/resolve-names.cc
index 9bb30676..e7090f59 100644
--- a/src/resolve-names.cc
+++ b/src/resolve-names.cc
@@ -39,27 +39,27 @@ class NameResolver : public ExprVisitor::DelegateNop {
Result VisitScript(Script* script);
// Implementation of ExprVisitor::DelegateNop.
- Result BeginBlockExpr(Expr*) override;
- Result EndBlockExpr(Expr*) override;
- Result OnBrExpr(Expr*) override;
- Result OnBrIfExpr(Expr*) override;
- Result OnBrTableExpr(Expr*) override;
- Result OnCallExpr(Expr*) override;
- Result OnCallIndirectExpr(Expr*) override;
- Result OnCatchExpr(Expr*, Catch*) override;
- Result OnGetGlobalExpr(Expr*) override;
- Result OnGetLocalExpr(Expr*) override;
- Result BeginIfExpr(Expr*) override;
- Result EndIfExpr(Expr*) override;
- Result BeginLoopExpr(Expr*) override;
- Result EndLoopExpr(Expr*) override;
- Result OnSetGlobalExpr(Expr*) override;
- Result OnSetLocalExpr(Expr*) override;
- Result OnTeeLocalExpr(Expr*) override;
- Result BeginTryExpr(Expr*) override;
- Result EndTryExpr(Expr*) override;
- Result OnThrowExpr(Expr*) override;
- Result OnRethrowExpr(Expr*) override;
+ Result BeginBlockExpr(BlockExpr*) override;
+ Result EndBlockExpr(BlockExpr*) override;
+ Result OnBrExpr(BrExpr*) override;
+ Result OnBrIfExpr(BrIfExpr*) override;
+ Result OnBrTableExpr(BrTableExpr*) override;
+ Result OnCallExpr(CallExpr*) override;
+ Result OnCallIndirectExpr(CallIndirectExpr*) override;
+ Result OnCatchExpr(TryExpr*, Catch*) override;
+ Result OnGetGlobalExpr(GetGlobalExpr*) override;
+ Result OnGetLocalExpr(GetLocalExpr*) override;
+ Result BeginIfExpr(IfExpr*) override;
+ Result EndIfExpr(IfExpr*) override;
+ Result BeginLoopExpr(LoopExpr*) override;
+ Result EndLoopExpr(LoopExpr*) override;
+ Result OnSetGlobalExpr(SetGlobalExpr*) override;
+ Result OnSetLocalExpr(SetLocalExpr*) override;
+ Result OnTeeLocalExpr(TeeLocalExpr*) override;
+ Result BeginTryExpr(TryExpr*) override;
+ Result EndTryExpr(TryExpr*) override;
+ Result OnThrowExpr(ThrowExpr*) override;
+ Result OnRethrowExpr(RethrowExpr*) override;
private:
void PrintError(const Location* loc, const char* fmt, ...);
@@ -209,113 +209,113 @@ void NameResolver::ResolveLocalVar(Var* var) {
}
}
-Result NameResolver::BeginBlockExpr(Expr* expr) {
+Result NameResolver::BeginBlockExpr(BlockExpr* expr) {
PushLabel(&expr->block->label);
return Result::Ok;
}
-Result NameResolver::EndBlockExpr(Expr* expr) {
+Result NameResolver::EndBlockExpr(BlockExpr* expr) {
PopLabel();
return Result::Ok;
}
-Result NameResolver::BeginLoopExpr(Expr* expr) {
- PushLabel(&expr->loop->label);
+Result NameResolver::BeginLoopExpr(LoopExpr* expr) {
+ PushLabel(&expr->block->label);
return Result::Ok;
}
-Result NameResolver::EndLoopExpr(Expr* expr) {
+Result NameResolver::EndLoopExpr(LoopExpr* expr) {
PopLabel();
return Result::Ok;
}
-Result NameResolver::OnBrExpr(Expr* expr) {
- ResolveLabelVar(&expr->br.var);
+Result NameResolver::OnBrExpr(BrExpr* expr) {
+ ResolveLabelVar(&expr->var);
return Result::Ok;
}
-Result NameResolver::OnBrIfExpr(Expr* expr) {
- ResolveLabelVar(&expr->br_if.var);
+Result NameResolver::OnBrIfExpr(BrIfExpr* expr) {
+ ResolveLabelVar(&expr->var);
return Result::Ok;
}
-Result NameResolver::OnBrTableExpr(Expr* expr) {
- for (Var& target : *expr->br_table.targets)
+Result NameResolver::OnBrTableExpr(BrTableExpr* expr) {
+ for (Var& target : *expr->targets)
ResolveLabelVar(&target);
- ResolveLabelVar(&expr->br_table.default_target);
+ ResolveLabelVar(&expr->default_target);
return Result::Ok;
}
-Result NameResolver::OnCallExpr(Expr* expr) {
- ResolveFuncVar(&expr->call.var);
+Result NameResolver::OnCallExpr(CallExpr* expr) {
+ ResolveFuncVar(&expr->var);
return Result::Ok;
}
-Result NameResolver::OnCallIndirectExpr(Expr* expr) {
- ResolveFuncTypeVar(&expr->call_indirect.var);
+Result NameResolver::OnCallIndirectExpr(CallIndirectExpr* expr) {
+ ResolveFuncTypeVar(&expr->var);
return Result::Ok;
}
-Result NameResolver::OnGetGlobalExpr(Expr* expr) {
- ResolveGlobalVar(&expr->get_global.var);
+Result NameResolver::OnGetGlobalExpr(GetGlobalExpr* expr) {
+ ResolveGlobalVar(&expr->var);
return Result::Ok;
}
-Result NameResolver::OnGetLocalExpr(Expr* expr) {
- ResolveLocalVar(&expr->get_local.var);
+Result NameResolver::OnGetLocalExpr(GetLocalExpr* expr) {
+ ResolveLocalVar(&expr->var);
return Result::Ok;
}
-Result NameResolver::BeginIfExpr(Expr* expr) {
- PushLabel(&expr->if_.true_->label);
+Result NameResolver::BeginIfExpr(IfExpr* expr) {
+ PushLabel(&expr->true_->label);
return Result::Ok;
}
-Result NameResolver::EndIfExpr(Expr* expr) {
+Result NameResolver::EndIfExpr(IfExpr* expr) {
PopLabel();
return Result::Ok;
}
-Result NameResolver::OnSetGlobalExpr(Expr* expr) {
- ResolveGlobalVar(&expr->set_global.var);
+Result NameResolver::OnSetGlobalExpr(SetGlobalExpr* expr) {
+ ResolveGlobalVar(&expr->var);
return Result::Ok;
}
-Result NameResolver::OnSetLocalExpr(Expr* expr) {
- ResolveLocalVar(&expr->set_local.var);
+Result NameResolver::OnSetLocalExpr(SetLocalExpr* expr) {
+ ResolveLocalVar(&expr->var);
return Result::Ok;
}
-Result NameResolver::OnTeeLocalExpr(Expr* expr) {
- ResolveLocalVar(&expr->tee_local.var);
+Result NameResolver::OnTeeLocalExpr(TeeLocalExpr* expr) {
+ ResolveLocalVar(&expr->var);
return Result::Ok;
}
-Result NameResolver::BeginTryExpr(Expr* expr) {
- PushLabel(&expr->try_block.block->label);
+Result NameResolver::BeginTryExpr(TryExpr* expr) {
+ PushLabel(&expr->block->label);
return Result::Ok;
}
-Result NameResolver::EndTryExpr(Expr*) {
+Result NameResolver::EndTryExpr(TryExpr*) {
PopLabel();
return Result::Ok;
}
-Result NameResolver::OnCatchExpr(Expr* expr, Catch* catch_) {
+Result NameResolver::OnCatchExpr(TryExpr* expr, Catch* catch_) {
if (!catch_->IsCatchAll())
ResolveExceptionVar(&catch_->var);
return Result::Ok;
}
-Result NameResolver::OnThrowExpr(Expr* expr) {
- ResolveExceptionVar(&expr->throw_.var);
+Result NameResolver::OnThrowExpr(ThrowExpr* expr) {
+ ResolveExceptionVar(&expr->var);
return Result::Ok;
}
-Result NameResolver::OnRethrowExpr(Expr* expr) {
+Result NameResolver::OnRethrowExpr(RethrowExpr* expr) {
// Note: the variable refers to corresponding (enclosing) catch, using the try
// block label for context.
- ResolveLabelVar(&expr->rethrow_.var);
+ ResolveLabelVar(&expr->var);
return Result::Ok;
}
diff --git a/src/validator.cc b/src/validator.cc
index 750cd5b7..2a984224 100644
--- a/src/validator.cc
+++ b/src/validator.cc
@@ -54,7 +54,7 @@ class Validator {
};
struct TryContext {
- const Expr* try_ = nullptr;
+ const TryExpr* try_ = nullptr;
const Catch* catch_ = nullptr;
};
@@ -424,37 +424,40 @@ void Validator::CheckExpr(const Expr* expr) {
switch (expr->type) {
case ExprType::Binary:
- typechecker_.OnBinary(expr->binary.opcode);
+ typechecker_.OnBinary(expr->As<BinaryExpr>()->opcode);
break;
- case ExprType::Block:
- CheckBlockSig(&expr->loc, Opcode::Block, &expr->block->sig);
- typechecker_.OnBlock(&expr->block->sig);
- CheckExprList(&expr->loc, expr->block->first);
+ case ExprType::Block: {
+ auto block_expr = expr->As<BlockExpr>();
+ CheckBlockSig(&block_expr->loc, Opcode::Block, &block_expr->block->sig);
+ typechecker_.OnBlock(&block_expr->block->sig);
+ CheckExprList(&block_expr->loc, block_expr->block->first);
typechecker_.OnEnd();
break;
+ }
case ExprType::Br:
- typechecker_.OnBr(expr->br.var.index);
+ typechecker_.OnBr(expr->As<BrExpr>()->var.index);
break;
case ExprType::BrIf:
- typechecker_.OnBrIf(expr->br_if.var.index);
+ typechecker_.OnBrIf(expr->As<BrIfExpr>()->var.index);
break;
case ExprType::BrTable: {
+ auto br_table_expr = expr->As<BrTableExpr>();
typechecker_.BeginBrTable();
- for (Var& var : *expr->br_table.targets) {
+ for (Var& var : *br_table_expr->targets) {
typechecker_.OnBrTableTarget(var.index);
}
- typechecker_.OnBrTableTarget(expr->br_table.default_target.index);
+ typechecker_.OnBrTableTarget(br_table_expr->default_target.index);
typechecker_.EndBrTable();
break;
}
case ExprType::Call: {
const Func* callee;
- if (WABT_SUCCEEDED(CheckFuncVar(&expr->call.var, &callee))) {
+ if (WABT_SUCCEEDED(CheckFuncVar(&expr->As<CallExpr>()->var, &callee))) {
typechecker_.OnCall(&callee->decl.sig.param_types,
&callee->decl.sig.result_types);
}
@@ -466,8 +469,8 @@ void Validator::CheckExpr(const Expr* expr) {
if (current_module_->tables.size() == 0) {
PrintError(&expr->loc, "found call_indirect operator, but no table");
}
- if (WABT_SUCCEEDED(
- CheckFuncTypeVar(&expr->call_indirect.var, &func_type))) {
+ if (WABT_SUCCEEDED(CheckFuncTypeVar(&expr->As<CallIndirectExpr>()->var,
+ &func_type))) {
typechecker_.OnCallIndirect(&func_type->sig.param_types,
&func_type->sig.result_types);
}
@@ -475,15 +478,15 @@ void Validator::CheckExpr(const Expr* expr) {
}
case ExprType::Compare:
- typechecker_.OnCompare(expr->compare.opcode);
+ typechecker_.OnCompare(expr->As<CompareExpr>()->opcode);
break;
case ExprType::Const:
- typechecker_.OnConst(expr->const_.type);
+ typechecker_.OnConst(expr->As<ConstExpr>()->const_.type);
break;
case ExprType::Convert:
- typechecker_.OnConvert(expr->convert.opcode);
+ typechecker_.OnConvert(expr->As<ConvertExpr>()->opcode);
break;
case ExprType::Drop:
@@ -491,11 +494,13 @@ void Validator::CheckExpr(const Expr* expr) {
break;
case ExprType::GetGlobal:
- typechecker_.OnGetGlobal(GetGlobalVarTypeOrAny(&expr->get_global.var));
+ typechecker_.OnGetGlobal(
+ GetGlobalVarTypeOrAny(&expr->As<GetGlobalExpr>()->var));
break;
case ExprType::GetLocal:
- typechecker_.OnGetLocal(GetLocalVarTypeOrAny(&expr->get_local.var));
+ typechecker_.OnGetLocal(
+ GetLocalVarTypeOrAny(&expr->As<GetLocalExpr>()->var));
break;
case ExprType::GrowMemory:
@@ -503,30 +508,36 @@ void Validator::CheckExpr(const Expr* expr) {
typechecker_.OnGrowMemory();
break;
- case ExprType::If:
- CheckBlockSig(&expr->loc, Opcode::If, &expr->if_.true_->sig);
- typechecker_.OnIf(&expr->if_.true_->sig);
- CheckExprList(&expr->loc, expr->if_.true_->first);
- if (expr->if_.false_) {
+ case ExprType::If: {
+ auto if_expr = expr->As<IfExpr>();
+ CheckBlockSig(&if_expr->loc, Opcode::If, &if_expr->true_->sig);
+ typechecker_.OnIf(&if_expr->true_->sig);
+ CheckExprList(&if_expr->loc, if_expr->true_->first);
+ if (if_expr->false_) {
typechecker_.OnElse();
- CheckExprList(&expr->loc, expr->if_.false_);
+ CheckExprList(&if_expr->loc, if_expr->false_);
}
typechecker_.OnEnd();
break;
+ }
- case ExprType::Load:
- CheckHasMemory(&expr->loc, expr->load.opcode);
- CheckAlign(&expr->loc, expr->load.align,
- get_opcode_natural_alignment(expr->load.opcode));
- typechecker_.OnLoad(expr->load.opcode);
+ case ExprType::Load: {
+ auto load_expr = expr->As<LoadExpr>();
+ CheckHasMemory(&load_expr->loc, load_expr->opcode);
+ CheckAlign(&load_expr->loc, load_expr->align,
+ get_opcode_natural_alignment(load_expr->opcode));
+ typechecker_.OnLoad(load_expr->opcode);
break;
+ }
- case ExprType::Loop:
- CheckBlockSig(&expr->loc, Opcode::Loop, &expr->loop->sig);
- typechecker_.OnLoop(&expr->loop->sig);
- CheckExprList(&expr->loc, expr->loop->first);
+ case ExprType::Loop: {
+ auto loop_expr = expr->As<LoopExpr>();
+ CheckBlockSig(&loop_expr->loc, Opcode::Loop, &loop_expr->block->sig);
+ typechecker_.OnLoop(&loop_expr->block->sig);
+ CheckExprList(&loop_expr->loc, loop_expr->block->first);
typechecker_.OnEnd();
break;
+ }
case ExprType::CurrentMemory:
CheckHasMemory(&expr->loc, Opcode::CurrentMemory);
@@ -539,7 +550,7 @@ void Validator::CheckExpr(const Expr* expr) {
case ExprType::Rethrow:
if (try_contexts_.empty() || try_contexts_.back().catch_ == nullptr)
PrintError(&expr->loc, "Rethrow not in try catch block");
- typechecker_.OnRethrow(expr->rethrow_.var.index);
+ typechecker_.OnRethrow(expr->As<RethrowExpr>()->var.index);
break;
case ExprType::Return:
@@ -551,46 +562,53 @@ void Validator::CheckExpr(const Expr* expr) {
break;
case ExprType::SetGlobal:
- typechecker_.OnSetGlobal(GetGlobalVarTypeOrAny(&expr->set_global.var));
+ typechecker_.OnSetGlobal(
+ GetGlobalVarTypeOrAny(&expr->As<SetGlobalExpr>()->var));
break;
case ExprType::SetLocal:
- typechecker_.OnSetLocal(GetLocalVarTypeOrAny(&expr->set_local.var));
+ typechecker_.OnSetLocal(
+ GetLocalVarTypeOrAny(&expr->As<SetLocalExpr>()->var));
break;
- case ExprType::Store:
- CheckHasMemory(&expr->loc, expr->store.opcode);
- CheckAlign(&expr->loc, expr->store.align,
- get_opcode_natural_alignment(expr->store.opcode));
- typechecker_.OnStore(expr->store.opcode);
+ case ExprType::Store: {
+ auto store_expr = expr->As<StoreExpr>();
+ CheckHasMemory(&store_expr->loc, store_expr->opcode);
+ CheckAlign(&store_expr->loc, store_expr->align,
+ get_opcode_natural_alignment(store_expr->opcode));
+ typechecker_.OnStore(store_expr->opcode);
break;
+ }
case ExprType::TeeLocal:
- typechecker_.OnTeeLocal(GetLocalVarTypeOrAny(&expr->tee_local.var));
+ typechecker_.OnTeeLocal(
+ GetLocalVarTypeOrAny(&expr->As<TeeLocalExpr>()->var));
break;
case ExprType::Throw:
const Exception* except;
- if (WABT_SUCCEEDED(CheckExceptVar(&expr->throw_.var, &except))) {
+ if (WABT_SUCCEEDED(
+ CheckExceptVar(&expr->As<ThrowExpr>()->var, &except))) {
typechecker_.OnThrow(&except->sig);
}
break;
case ExprType::TryBlock: {
+ auto try_expr = expr->As<TryExpr>();
TryContext context;
- context.try_ = expr;
+ context.try_ = try_expr;
try_contexts_.push_back(context);
- CheckBlockSig(&expr->loc, Opcode::Try, &expr->try_block.block->sig);
+ CheckBlockSig(&try_expr->loc, Opcode::Try, &try_expr->block->sig);
- typechecker_.OnTryBlock(&expr->try_block.block->sig);
- CheckExprList(&expr->loc, expr->try_block.block->first);
+ typechecker_.OnTryBlock(&try_expr->block->sig);
+ CheckExprList(&try_expr->loc, try_expr->block->first);
- if (expr->try_block.catches->empty())
- PrintError(&expr->loc, "TryBlock: doesn't have any catch clauses");
+ if (try_expr->catches.empty())
+ PrintError(&try_expr->loc, "TryBlock: doesn't have any catch clauses");
bool found_catch_all = false;
- for (const Catch* catch_ : *expr->try_block.catches) {
+ for (const Catch* catch_ : try_expr->catches) {
try_contexts_.back().catch_ = catch_;
- typechecker_.OnCatchBlock(&expr->try_block.block->sig);
+ typechecker_.OnCatchBlock(&try_expr->block->sig);
if (catch_->IsCatchAll()) {
found_catch_all = true;
} else {
@@ -609,7 +627,7 @@ void Validator::CheckExpr(const Expr* expr) {
}
case ExprType::Unary:
- typechecker_.OnUnary(expr->unary.opcode);
+ typechecker_.OnUnary(expr->As<UnaryExpr>()->opcode);
break;
case ExprType::Unreachable:
@@ -668,14 +686,14 @@ void Validator::CheckConstInitExpr(const Location* loc,
switch (expr->type) {
case ExprType::Const:
- type = expr->const_.type;
+ type = expr->As<ConstExpr>()->const_.type;
break;
case ExprType::GetGlobal: {
const Global* ref_global = nullptr;
Index ref_global_index;
- if (WABT_FAILED(CheckGlobalVar(&expr->get_global.var, &ref_global,
- &ref_global_index))) {
+ if (WABT_FAILED(CheckGlobalVar(&expr->As<GetGlobalExpr>()->var,
+ &ref_global, &ref_global_index))) {
return;
}
diff --git a/src/wast-parser-lexer-shared.h b/src/wast-parser-lexer-shared.h
index 7cd6288b..56367ab7 100644
--- a/src/wast-parser-lexer-shared.h
+++ b/src/wast-parser-lexer-shared.h
@@ -92,6 +92,7 @@ union Token {
Script* script;
Table* table;
TextList text_list;
+ TryExpr* try_expr;
TypeVector* types;
uint32_t u32;
uint64_t u64;
diff --git a/src/wast-parser.y b/src/wast-parser.y
index 24cafc2c..978bb15c 100644
--- a/src/wast-parser.y
+++ b/src/wast-parser.y
@@ -197,9 +197,7 @@ class BinaryErrorHandlerModule : public BinaryErrorHandler {
%type<exception> exception
%type<export_> export_desc inline_export
%type<expr> plain_instr block_instr
-%type<expr> try_
%type<catch_> plain_catch plain_catch_all catch_instr catch_sexp
-%type<expr> catch_sexp_list catch_instr_list
%type<expr_list> instr instr_list expr expr1 expr_list if_ if_block const_expr offset
%type<func> func_fields_body func_fields_body1 func_result_body func_body func_body1
%type<func> func_fields_import func_fields_import1 func_fields_import_result
@@ -217,6 +215,7 @@ class BinaryErrorHandlerModule : public BinaryErrorHandler {
%type<table> table_sig
%type<text> bind_var bind_var_opt labeling_opt quoted_text
%type<text_list> text_list text_list_opt
+%type<try_expr> try_ catch_sexp_list catch_instr_list
%type<types> block_sig value_type_list
%type<u32> align_opt
%type<u64> nat offset_opt
@@ -480,65 +479,65 @@ instr :
plain_instr :
UNREACHABLE {
- $$ = Expr::CreateUnreachable();
+ $$ = new UnreachableExpr();
}
| NOP {
- $$ = Expr::CreateNop();
+ $$ = new NopExpr();
}
| DROP {
- $$ = Expr::CreateDrop();
+ $$ = new DropExpr();
}
| SELECT {
- $$ = Expr::CreateSelect();
+ $$ = new SelectExpr();
}
| BR var {
- $$ = Expr::CreateBr(std::move(*$2));
+ $$ = new BrExpr(std::move(*$2));
delete $2;
}
| BR_IF var {
- $$ = Expr::CreateBrIf(std::move(*$2));
+ $$ = new BrIfExpr(std::move(*$2));
delete $2;
}
| BR_TABLE var_list var {
- $$ = Expr::CreateBrTable($2, std::move(*$3));
+ $$ = new BrTableExpr($2, std::move(*$3));
delete $3;
}
| RETURN {
- $$ = Expr::CreateReturn();
+ $$ = new ReturnExpr();
}
| CALL var {
- $$ = Expr::CreateCall(std::move(*$2));
+ $$ = new CallExpr(std::move(*$2));
delete $2;
}
| CALL_INDIRECT var {
- $$ = Expr::CreateCallIndirect(std::move(*$2));
+ $$ = new CallIndirectExpr(std::move(*$2));
delete $2;
}
| GET_LOCAL var {
- $$ = Expr::CreateGetLocal(std::move(*$2));
+ $$ = new GetLocalExpr(std::move(*$2));
delete $2;
}
| SET_LOCAL var {
- $$ = Expr::CreateSetLocal(std::move(*$2));
+ $$ = new SetLocalExpr(std::move(*$2));
delete $2;
}
| TEE_LOCAL var {
- $$ = Expr::CreateTeeLocal(std::move(*$2));
+ $$ = new TeeLocalExpr(std::move(*$2));
delete $2;
}
| GET_GLOBAL var {
- $$ = Expr::CreateGetGlobal(std::move(*$2));
+ $$ = new GetGlobalExpr(std::move(*$2));
delete $2;
}
| SET_GLOBAL var {
- $$ = Expr::CreateSetGlobal(std::move(*$2));
+ $$ = new SetGlobalExpr(std::move(*$2));
delete $2;
}
| LOAD offset_opt align_opt {
- $$ = Expr::CreateLoad($1, $3, $2);
+ $$ = new LoadExpr($1, $3, $2);
}
| STORE offset_opt align_opt {
- $$ = Expr::CreateStore($1, $3, $2);
+ $$ = new StoreExpr($1, $3, $2);
}
| CONST literal {
Const const_;
@@ -551,62 +550,66 @@ plain_instr :
WABT_PRINTF_STRING_SLICE_ARG($2.text));
}
delete [] $2.text.start;
- $$ = Expr::CreateConst(const_);
+ $$ = new ConstExpr(const_);
}
| UNARY {
- $$ = Expr::CreateUnary($1);
+ $$ = new UnaryExpr($1);
}
| BINARY {
- $$ = Expr::CreateBinary($1);
+ $$ = new BinaryExpr($1);
}
| COMPARE {
- $$ = Expr::CreateCompare($1);
+ $$ = new CompareExpr($1);
}
| CONVERT {
- $$ = Expr::CreateConvert($1);
+ $$ = new ConvertExpr($1);
}
| CURRENT_MEMORY {
- $$ = Expr::CreateCurrentMemory();
+ $$ = new CurrentMemoryExpr();
}
| GROW_MEMORY {
- $$ = Expr::CreateGrowMemory();
+ $$ = new GrowMemoryExpr();
}
| throw_check var {
- $$ = Expr::CreateThrow(std::move(*$2));
+ $$ = new ThrowExpr(std::move(*$2));
delete $2;
}
| rethrow_check var {
- $$ = Expr::CreateRethrow(std::move(*$2));
+ $$ = new RethrowExpr(std::move(*$2));
delete $2;
}
;
block_instr :
BLOCK labeling_opt block END labeling_opt {
- $$ = Expr::CreateBlock($3);
- $$->block->label = $2;
- CHECK_END_LABEL(@5, $$->block->label, $5);
+ auto expr = new BlockExpr($3);
+ expr->block->label = $2;
+ CHECK_END_LABEL(@5, expr->block->label, $5);
+ $$ = expr;
}
| LOOP labeling_opt block END labeling_opt {
- $$ = Expr::CreateLoop($3);
- $$->loop->label = $2;
- CHECK_END_LABEL(@5, $$->loop->label, $5);
+ auto expr = new LoopExpr($3);
+ expr->block->label = $2;
+ CHECK_END_LABEL(@5, expr->block->label, $5);
+ $$ = expr;
}
| IF labeling_opt block END labeling_opt {
- $$ = Expr::CreateIf($3, nullptr);
- $$->if_.true_->label = $2;
- CHECK_END_LABEL(@5, $$->if_.true_->label, $5);
+ auto expr = new IfExpr($3, nullptr);
+ expr->true_->label = $2;
+ CHECK_END_LABEL(@5, expr->true_->label, $5);
+ $$ = expr;
}
| IF labeling_opt block ELSE labeling_opt instr_list END labeling_opt {
- $$ = Expr::CreateIf($3, $6.first);
- $$->if_.true_->label = $2;
- CHECK_END_LABEL(@5, $$->if_.true_->label, $5);
- CHECK_END_LABEL(@8, $$->if_.true_->label, $8);
+ auto expr = new IfExpr($3, $6.first);
+ expr->true_->label = $2;
+ CHECK_END_LABEL(@5, expr->true_->label, $5);
+ CHECK_END_LABEL(@8, expr->true_->label, $8);
+ $$ = expr;
}
| try_check labeling_opt block catch_instr_list END labeling_opt {
$3->label = $2;
$$ = $4;
- $$->try_block.block = $3;
+ $$->As<TryExpr>()->block = $3;
CHECK_END_LABEL(@6, $3->label, $6);
}
;
@@ -647,12 +650,13 @@ catch_instr :
catch_instr_list :
catch_instr {
- $$ = Expr::CreateTry();
- $$->try_block.catches->push_back($1);
+ auto expr = new TryExpr();
+ expr->catches.push_back($1);
+ $$ = expr;
}
| catch_instr_list catch_instr {
$$ = $1;
- $$->try_block.catches->push_back($2);
+ $$->As<TryExpr>()->catches.push_back($2);
}
;
@@ -665,23 +669,22 @@ expr1 :
$$ = join_exprs2(&@1, &$2, $1);
}
| BLOCK labeling_opt block {
- Expr* expr = Expr::CreateBlock($3);
+ auto expr = new BlockExpr($3);
expr->block->label = $2;
$$ = join_exprs1(&@1, expr);
}
| LOOP labeling_opt block {
- Expr* expr = Expr::CreateLoop($3);
- expr->loop->label = $2;
+ auto expr = new LoopExpr($3);
+ expr->block->label = $2;
$$ = join_exprs1(&@1, expr);
}
| IF labeling_opt if_block {
$$ = $3;
- Expr* if_ = $3.last;
- assert(if_->type == ExprType::If);
- if_->if_.true_->label = $2;
+ IfExpr* if_ = $3.last->As<IfExpr>();
+ if_->true_->label = $2;
}
| try_check labeling_opt try_ {
- Block* block = $3->try_block.block;
+ Block* block = $3->block;
block->label = $2;
$$ = join_exprs1(&@1, $3);
}
@@ -690,7 +693,7 @@ expr1 :
try_ :
block_sig try_ {
$$ = $2;
- Block* block = $$->try_block.block;
+ Block* block = $$->block;
block->sig.insert(block->sig.end(), $1->begin(), $1->end());
delete $1;
}
@@ -698,7 +701,7 @@ try_ :
Block* block = new Block();
block->first = $1.first;
$$ = $2;
- $$->try_block.block = block;
+ $$->block = block;
}
;
@@ -713,22 +716,22 @@ catch_sexp :
catch_sexp_list :
catch_sexp {
- $$ = Expr::CreateTry();
- $$->try_block.catches->push_back($1);
+ auto expr = new TryExpr();
+ expr->catches.push_back($1);
+ $$ = expr;
}
| catch_sexp_list catch_sexp {
$$ = $1;
- $$->try_block.catches->push_back($2);
+ $$->As<TryExpr>()->catches.push_back($2);
}
;
-
+
if_block :
block_sig if_block {
- Expr* if_ = $2.last;
- assert(if_->type == ExprType::If);
+ IfExpr* if_ = $2.last->As<IfExpr>();
$$ = $2;
- Block* true_ = if_->if_.true_;
+ Block* true_ = if_->true_;
true_->sig.insert(true_->sig.end(), $1->begin(), $1->end());
delete $1;
}
@@ -736,27 +739,27 @@ if_block :
;
if_ :
LPAR THEN instr_list RPAR LPAR ELSE instr_list RPAR {
- Expr* expr = Expr::CreateIf(new Block($3.first), $7.first);
+ Expr* expr = new IfExpr(new Block($3.first), $7.first);
$$ = join_exprs1(&@1, expr);
}
| LPAR THEN instr_list RPAR {
- Expr* expr = Expr::CreateIf(new Block($3.first), nullptr);
+ Expr* expr = new IfExpr(new Block($3.first), nullptr);
$$ = join_exprs1(&@1, expr);
}
| expr LPAR THEN instr_list RPAR LPAR ELSE instr_list RPAR {
- Expr* expr = Expr::CreateIf(new Block($4.first), $8.first);
+ Expr* expr = new IfExpr(new Block($4.first), $8.first);
$$ = join_exprs2(&@1, &$1, expr);
}
| expr LPAR THEN instr_list RPAR {
- Expr* expr = Expr::CreateIf(new Block($4.first), nullptr);
+ Expr* expr = new IfExpr(new Block($4.first), nullptr);
$$ = join_exprs2(&@1, &$1, expr);
}
| expr expr expr {
- Expr* expr = Expr::CreateIf(new Block($2.first), $3.first);
+ Expr* expr = new IfExpr(new Block($2.first), $3.first);
$$ = join_exprs2(&@1, &$1, expr);
}
| expr expr {
- Expr* expr = Expr::CreateIf(new Block($2.first), nullptr);
+ Expr* expr = new IfExpr(new Block($2.first), nullptr);
$$ = join_exprs2(&@1, &$1, expr);
}
;
@@ -774,7 +777,7 @@ throw_check :
try_check :
TRY {
- CHECK_ALLOW_EXCEPTIONS(&@1, "try");
+ CHECK_ALLOW_EXCEPTIONS(&@1, "try");
}
;
@@ -816,7 +819,7 @@ exception_field :
$$->except = $1;
}
;
-
+
/* Functions */
func :
LPAR FUNC bind_var_opt func_fields RPAR {
@@ -1049,7 +1052,7 @@ table_fields :
elem_field->loc = @3;
ElemSegment* elem_segment = elem_field->elem_segment = new ElemSegment();
elem_segment->table_var = Var(kInvalidIndex);
- elem_segment->offset = Expr::CreateConst(Const(Const::I32(), 0));
+ elem_segment->offset = new ConstExpr(Const(Const::I32(), 0));
elem_segment->offset->loc = @3;
elem_segment->vars = std::move(*$4);
delete $4;
@@ -1123,7 +1126,7 @@ memory_fields :
data_field->loc = @2;
DataSegment* data_segment = data_field->data_segment = new DataSegment();
data_segment->memory_var = Var(kInvalidIndex);
- data_segment->offset = Expr::CreateConst(Const(Const::I32(), 0));
+ data_segment->offset = new ConstExpr(Const(Const::I32(), 0));
data_segment->offset->loc = @2;
dup_text_list(&$3, &data_segment->data, &data_segment->size);
destroy_text_list(&$3);
@@ -1934,7 +1937,7 @@ void append_module_fields(Module* module, ModuleField* first) {
break;
case ModuleFieldType::Except:
- name = &field->except->name;
+ name = &field->except->name;
bindings = &module->except_bindings;
index = module->excepts.size();
module->excepts.push_back(field->except);
diff --git a/src/wat-writer.cc b/src/wat-writer.cc
index 7df3a417..3a0e0610 100644
--- a/src/wat-writer.cc
+++ b/src/wat-writer.cc
@@ -464,51 +464,52 @@ void WatWriter::WriteConst(const Const* const_) {
void WatWriter::WriteExpr(const Expr* expr) {
switch (expr->type) {
case ExprType::Binary:
- WritePutsNewline(expr->binary.opcode.GetName());
+ WritePutsNewline(expr->As<BinaryExpr>()->opcode.GetName());
break;
case ExprType::Block:
- WriteBlock(LabelType::Block, expr->block, Opcode::Block_Opcode.GetName());
+ WriteBlock(LabelType::Block, expr->As<BlockExpr>()->block,
+ Opcode::Block_Opcode.GetName());
break;
case ExprType::Br:
WritePutsSpace(Opcode::Br_Opcode.GetName());
- WriteBrVar(&expr->br.var, NextChar::Newline);
+ WriteBrVar(&expr->As<BrExpr>()->var, NextChar::Newline);
break;
case ExprType::BrIf:
WritePutsSpace(Opcode::BrIf_Opcode.GetName());
- WriteBrVar(&expr->br_if.var, NextChar::Newline);
+ WriteBrVar(&expr->As<BrIfExpr>()->var, NextChar::Newline);
break;
case ExprType::BrTable: {
WritePutsSpace(Opcode::BrTable_Opcode.GetName());
- for (const Var& var : *expr->br_table.targets)
+ for (const Var& var : *expr->As<BrTableExpr>()->targets)
WriteBrVar(&var, NextChar::Space);
- WriteBrVar(&expr->br_table.default_target, NextChar::Newline);
+ WriteBrVar(&expr->As<BrTableExpr>()->default_target, NextChar::Newline);
break;
}
case ExprType::Call:
WritePutsSpace(Opcode::Call_Opcode.GetName());
- WriteVar(&expr->call.var, NextChar::Newline);
+ WriteVar(&expr->As<CallExpr>()->var, NextChar::Newline);
break;
case ExprType::CallIndirect:
WritePutsSpace(Opcode::CallIndirect_Opcode.GetName());
- WriteVar(&expr->call_indirect.var, NextChar::Newline);
+ WriteVar(&expr->As<CallIndirectExpr>()->var, NextChar::Newline);
break;
case ExprType::Compare:
- WritePutsNewline(expr->compare.opcode.GetName());
+ WritePutsNewline(expr->As<CompareExpr>()->opcode.GetName());
break;
case ExprType::Const:
- WriteConst(&expr->const_);
+ WriteConst(&expr->As<ConstExpr>()->const_);
break;
case ExprType::Convert:
- WritePutsNewline(expr->convert.opcode.GetName());
+ WritePutsNewline(expr->As<ConvertExpr>()->opcode.GetName());
break;
case ExprType::Drop:
@@ -517,43 +518,48 @@ void WatWriter::WriteExpr(const Expr* expr) {
case ExprType::GetGlobal:
WritePutsSpace(Opcode::GetGlobal_Opcode.GetName());
- WriteVar(&expr->get_global.var, NextChar::Newline);
+ WriteVar(&expr->As<GetGlobalExpr>()->var, NextChar::Newline);
break;
case ExprType::GetLocal:
WritePutsSpace(Opcode::GetLocal_Opcode.GetName());
- WriteVar(&expr->get_local.var, NextChar::Newline);
+ WriteVar(&expr->As<GetLocalExpr>()->var, NextChar::Newline);
break;
case ExprType::GrowMemory:
WritePutsNewline(Opcode::GrowMemory_Opcode.GetName());
break;
- case ExprType::If:
- WriteBeginBlock(LabelType::If, expr->if_.true_,
+ case ExprType::If: {
+ auto if_expr = expr->As<IfExpr>();
+ WriteBeginBlock(LabelType::If, if_expr->true_,
Opcode::If_Opcode.GetName());
- WriteExprList(expr->if_.true_->first);
- if (expr->if_.false_) {
+ WriteExprList(if_expr->true_->first);
+ if (if_expr->false_) {
Dedent();
WritePutsSpace(Opcode::Else_Opcode.GetName());
Indent();
WriteNewline(FORCE_NEWLINE);
- WriteExprList(expr->if_.false_);
+ WriteExprList(if_expr->false_);
}
WriteEndBlock();
break;
+ }
- case ExprType::Load:
- WritePutsSpace(expr->load.opcode.GetName());
- if (expr->load.offset)
- Writef("offset=%u", expr->load.offset);
- if (!expr->load.opcode.IsNaturallyAligned(expr->load.align))
- Writef("align=%u", expr->load.align);
+ case ExprType::Load: {
+ auto load_expr = expr->As<LoadExpr>();
+ WritePutsSpace(load_expr->opcode.GetName());
+ if (load_expr->offset)
+ Writef("offset=%u", load_expr->offset);
+ if (!load_expr->opcode.IsNaturallyAligned(load_expr->align))
+ Writef("align=%u", load_expr->align);
WriteNewline(NO_FORCE_NEWLINE);
break;
+ }
case ExprType::Loop:
- WriteBlock(LabelType::Loop, expr->loop, Opcode::Loop_Opcode.GetName());
+ WriteBlock(LabelType::Loop, expr->As<LoopExpr>()->block,
+ Opcode::Loop_Opcode.GetName());
break;
case ExprType::CurrentMemory:
@@ -574,30 +580,32 @@ void WatWriter::WriteExpr(const Expr* expr) {
case ExprType::SetGlobal:
WritePutsSpace(Opcode::SetGlobal_Opcode.GetName());
- WriteVar(&expr->set_global.var, NextChar::Newline);
+ WriteVar(&expr->As<SetGlobalExpr>()->var, NextChar::Newline);
break;
case ExprType::SetLocal:
WritePutsSpace(Opcode::SetLocal_Opcode.GetName());
- WriteVar(&expr->set_local.var, NextChar::Newline);
+ WriteVar(&expr->As<SetLocalExpr>()->var, NextChar::Newline);
break;
- case ExprType::Store:
- WritePutsSpace(expr->store.opcode.GetName());
- if (expr->store.offset)
- Writef("offset=%u", expr->store.offset);
- if (!expr->store.opcode.IsNaturallyAligned(expr->store.align))
- Writef("align=%u", expr->store.align);
+ case ExprType::Store: {
+ auto store_expr = expr->As<StoreExpr>();
+ WritePutsSpace(store_expr->opcode.GetName());
+ if (store_expr->offset)
+ Writef("offset=%u", store_expr->offset);
+ if (!store_expr->opcode.IsNaturallyAligned(store_expr->align))
+ Writef("align=%u", store_expr->align);
WriteNewline(NO_FORCE_NEWLINE);
break;
+ }
case ExprType::TeeLocal:
WritePutsSpace(Opcode::TeeLocal_Opcode.GetName());
- WriteVar(&expr->tee_local.var, NextChar::Newline);
+ WriteVar(&expr->As<TeeLocalExpr>()->var, NextChar::Newline);
break;
case ExprType::Unary:
- WritePutsNewline(expr->unary.opcode.GetName());
+ WritePutsNewline(expr->As<UnaryExpr>()->opcode.GetName());
break;
case ExprType::Unreachable:
@@ -665,32 +673,36 @@ void WatWriter::WriteFoldedExpr(const Expr* expr) {
break;
case ExprType::Block:
- PushExpr(expr, 0, expr->block->sig.size());
+ PushExpr(expr, 0, expr->As<BlockExpr>()->block->sig.size());
break;
case ExprType::Br:
- PushExpr(expr, GetLabelArity(&expr->br.var), 1);
+ PushExpr(expr, GetLabelArity(&expr->As<BrExpr>()->var), 1);
break;
case ExprType::BrIf: {
- Index arity = GetLabelArity(&expr->br_if.var);
+ Index arity = GetLabelArity(&expr->As<BrIfExpr>()->var);
PushExpr(expr, arity + 1, arity);
break;
}
case ExprType::BrTable:
- PushExpr(expr, GetLabelArity(&expr->br_table.default_target) + 1, 1);
+ PushExpr(expr,
+ GetLabelArity(&expr->As<BrTableExpr>()->default_target) + 1, 1);
break;
- case ExprType::Call:
- PushExpr(expr, GetFuncParamCount(&expr->call.var),
- GetFuncResultCount(&expr->call.var));
+ case ExprType::Call: {
+ const Var& var = expr->As<CallExpr>()->var;
+ PushExpr(expr, GetFuncParamCount(&var), GetFuncResultCount(&var));
break;
+ }
- case ExprType::CallIndirect:
- PushExpr(expr, GetFuncSigParamCount(&expr->call_indirect.var) + 1,
- GetFuncSigResultCount(&expr->call_indirect.var));
+ case ExprType::CallIndirect: {
+ const Var& var = expr->As<CallIndirectExpr>()->var;
+ PushExpr(expr, GetFuncSigParamCount(&var) + 1,
+ GetFuncSigResultCount(&var));
break;
+ }
case ExprType::Const:
case ExprType::CurrentMemory:
@@ -715,11 +727,11 @@ void WatWriter::WriteFoldedExpr(const Expr* expr) {
break;
case ExprType::If:
- PushExpr(expr, 1, expr->if_.true_->sig.size());
+ PushExpr(expr, 1, expr->As<IfExpr>()->true_->sig.size());
break;
case ExprType::Loop:
- PushExpr(expr, 0, expr->loop->sig.size());
+ PushExpr(expr, 0, expr->As<LoopExpr>()->block->sig.size());
break;
case ExprType::Nop:
@@ -768,39 +780,41 @@ void WatWriter::FlushExprTree(const ExprTree& expr_tree) {
switch (expr_tree.expr->type) {
case ExprType::Block:
WritePuts("(", NextChar::None);
- WriteBeginBlock(LabelType::Block, expr_tree.expr->block,
+ WriteBeginBlock(LabelType::Block, expr_tree.expr->As<BlockExpr>()->block,
Opcode::Block_Opcode.GetName());
- WriteFoldedExprList(expr_tree.expr->block->first);
+ WriteFoldedExprList(expr_tree.expr->As<BlockExpr>()->block->first);
FlushExprTreeStack();
WriteCloseNewline();
break;
case ExprType::Loop:
WritePuts("(", NextChar::None);
- WriteBeginBlock(LabelType::Loop, expr_tree.expr->loop,
+ WriteBeginBlock(LabelType::Loop, expr_tree.expr->As<LoopExpr>()->block,
Opcode::Loop_Opcode.GetName());
- WriteFoldedExprList(expr_tree.expr->loop->first);
+ WriteFoldedExprList(expr_tree.expr->As<LoopExpr>()->block->first);
FlushExprTreeStack();
WriteCloseNewline();
break;
- case ExprType::If:
+ case ExprType::If: {
+ auto if_expr = expr_tree.expr->As<IfExpr>();
WritePuts("(", NextChar::None);
- WriteBeginBlock(LabelType::If, expr_tree.expr->if_.true_,
+ WriteBeginBlock(LabelType::If, if_expr->true_,
Opcode::If_Opcode.GetName());
FlushExprTreeVector(expr_tree.children);
WriteOpenNewline("then");
- WriteFoldedExprList(expr_tree.expr->if_.true_->first);
+ WriteFoldedExprList(if_expr->true_->first);
FlushExprTreeStack();
WriteCloseNewline();
- if (expr_tree.expr->if_.false_) {
+ if (if_expr->false_) {
WriteOpenNewline("else");
- WriteFoldedExprList(expr_tree.expr->if_.false_);
+ WriteFoldedExprList(if_expr->false_);
FlushExprTreeStack();
WriteCloseNewline();
}
WriteCloseNewline();
break;
+ }
default: {
WritePuts("(", NextChar::None);