summaryrefslogtreecommitdiff
path: root/src/ir.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/ir.cc')
-rw-r--r--src/ir.cc51
1 files changed, 27 insertions, 24 deletions
diff --git a/src/ir.cc b/src/ir.cc
index 2e4d8b4a..715ea250 100644
--- a/src/ir.cc
+++ b/src/ir.cc
@@ -52,6 +52,10 @@ Index Module::GetFuncTypeIndex(const Var& var) const {
return func_type_bindings.FindIndex(var);
}
+Index Module::GetExceptIndex(const Var& var) const {
+ return except_bindings.FindIndex(var);
+}
+
Index Func::GetLocalIndex(const Var& var) const {
if (var.type == VarType::Index)
return var.index;
@@ -278,6 +282,25 @@ Block::~Block() {
DestroyExprList(first);
}
+Catch::Catch(Expr* first) : first(first) {
+ WABT_ZERO_MEMORY(loc);
+}
+
+Catch::Catch(Var var, Expr* first) : var(var), first(first) {
+ WABT_ZERO_MEMORY(loc);
+}
+
+Catch::~Catch() {
+ delete first;
+}
+
+void destroy_catches(CatchVector* catches) {
+ for (Catch* catch_ : *catches)
+ delete catch_;
+ delete catches;
+}
+
+
Expr::Expr() : type(ExprType::Binary), next(nullptr) {
WABT_ZERO_MEMORY(loc);
binary.opcode = Opcode::Nop;
@@ -308,11 +331,6 @@ Expr::~Expr() {
case ExprType::CallIndirect:
call_indirect.var.~Var();
break;
- case ExprType::Catch:
- case ExprType::CatchAll:
- catch_.var.~Var();
- DestroyExprList(catch_.first);
- break;
case ExprType::GetGlobal:
get_global.var.~Var();
break;
@@ -343,7 +361,7 @@ Expr::~Expr() {
break;
case ExprType::TryBlock:
delete try_block.block;
- DestroyExprList(try_block.first_catch);
+ destroy_catches(try_block.catches);
break;
case ExprType::Binary:
case ExprType::Compare:
@@ -414,21 +432,6 @@ Expr* Expr::CreateCallIndirect(Var var) {
}
// static
-Expr* Expr::CreateCatch(Var var, Expr* first) {
- Expr* expr = new Expr(ExprType::Catch);
- expr->catch_.var = var;
- expr->catch_.first = first;
- return expr;
-}
-
-// static
-Expr* Expr::CreateCatchAll(Expr* first) {
- Expr* expr = new Expr(ExprType::CatchAll);
- expr->catch_.first = first;
- return expr;
-}
-
-// static
Expr* Expr::CreateCompare(Opcode opcode) {
Expr* expr = new Expr(ExprType::Compare);
expr->compare.opcode = opcode;
@@ -562,10 +565,10 @@ Expr* Expr::CreateThrow(Var var) {
}
// static
-Expr* Expr::CreateTry(Block* block, Expr* first_catch) {
+Expr* Expr::CreateTry() {
Expr* expr = new Expr(ExprType::TryBlock);
- expr->try_block.block = block;
- expr->try_block.first_catch = first_catch;
+ expr->try_block.block = nullptr;
+ expr->try_block.catches = new CatchVector();
return expr;
}