diff options
author | KarlSchimpf <karlschimpf@gmail.com> | 2017-06-22 07:59:09 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-06-22 07:59:09 -0700 |
commit | 917d3bfa6593c9a85c81b674770aec2ca404a4a2 (patch) | |
tree | ff279590a68c00714889d1667da9739f7e7cbd9a /src | |
parent | c0ae2e69b53f12e57833270e1b48a01864fb5156 (diff) | |
download | wabt-917d3bfa6593c9a85c81b674770aec2ca404a4a2.tar.gz wabt-917d3bfa6593c9a85c81b674770aec2ca404a4a2.tar.bz2 wabt-917d3bfa6593c9a85c81b674770aec2ca404a4a2.zip |
Fix the validator to be able to validate exception handling constructs. (#514)
* Save state.
* Add exception declaration syntax.
* Extend validator to handle exception declarations.
* Fix binary writer to handle exception declarations.
* Fix code to handle external exception kind.
* Regenerate lexer.
* Fix bug with last merge.
* Add exception declarations, and add examples.
* Fix nits.
* Initial extensions for expr visitor.
* Save state.
* Fix issues with master merge.
* Reconcile issues with merge of tools wast2wasm and wast-desugar.
* Save state.
* Save work to move to mtv.
* Fix resolving names on try/throw constructs.
* Completed implementation of validation for exception handling.
* Fix nits.
* Combine Catch and CatchAll in IR.
* Remove tryblock visitors.
* Clean up to only use one visitor for each catch.
* Rework the structure of try blocks and catches.
* Remove the need for common CLI options.
* Fix issues raised by binji.
* Fix re2c generated file.
* Fix memory leak, and fix nits.
Diffstat (limited to 'src')
-rw-r--r-- | src/binary-writer.cc | 8 | ||||
-rw-r--r-- | src/common.h | 4 | ||||
-rw-r--r-- | src/expr-visitor.cc | 30 | ||||
-rw-r--r-- | src/expr-visitor.h | 11 | ||||
-rw-r--r-- | src/generate-names.cc | 9 | ||||
-rw-r--r-- | src/ir.cc | 51 | ||||
-rw-r--r-- | src/ir.h | 28 | ||||
-rw-r--r-- | src/opcode.def | 5 | ||||
-rw-r--r-- | src/prebuilt/wast-parser-gen.cc | 1266 | ||||
-rw-r--r-- | src/prebuilt/wast-parser-gen.output | 34 | ||||
-rw-r--r-- | src/resolve-names.cc | 41 | ||||
-rw-r--r-- | src/tools/wast-desugar.cc | 9 | ||||
-rw-r--r-- | src/tools/wast2wasm.cc | 2 | ||||
-rw-r--r-- | src/type-checker.cc | 48 | ||||
-rw-r--r-- | src/type-checker.h | 5 | ||||
-rw-r--r-- | src/validator.cc | 110 | ||||
-rw-r--r-- | src/wast-parser-lexer-shared.h | 1 | ||||
-rw-r--r-- | src/wast-parser.h | 2 | ||||
-rw-r--r-- | src/wast-parser.y | 48 |
19 files changed, 939 insertions, 773 deletions
diff --git a/src/binary-writer.cc b/src/binary-writer.cc index b54eea84..6748559d 100644 --- a/src/binary-writer.cc +++ b/src/binary-writer.cc @@ -457,14 +457,6 @@ void BinaryWriter::WriteExpr(const Module* module, write_u32_leb128(&stream_, 0, "call_indirect reserved"); break; } - case ExprType::Catch: - // TODO(karlschimpf): Define - WABT_FATAL("Catch: Don't know how to write\n"); - break; - case ExprType::CatchAll: - // TODO(karlschimpf): Define - WABT_FATAL("CatchAll: Don't know how to write\n"); - break; case ExprType::Compare: write_opcode(&stream_, expr->compare.opcode); break; diff --git a/src/common.h b/src/common.h index 3b4d5a54..63fde51b 100644 --- a/src/common.h +++ b/src/common.h @@ -125,9 +125,11 @@ enum class LabelType { Loop, If, Else, + Try, + Catch, First = Func, - Last = Else, + Last = Catch, }; static const int kLabelTypeCount = WABT_ENUM_COUNT(LabelType); diff --git a/src/expr-visitor.cc b/src/expr-visitor.cc index 961e91f9..db34a49b 100644 --- a/src/expr-visitor.cc +++ b/src/expr-visitor.cc @@ -60,16 +60,6 @@ Result ExprVisitor::VisitExpr(Expr* expr) { CHECK_RESULT(delegate_->OnCallIndirectExpr(expr)); break; - case ExprType::Catch: - // TODO(karlschimpf): Define - WABT_FATAL("Catch: don't know how to visit\n"); - return Result::Error; - - case ExprType::CatchAll: - // TODO(karlschimpf): Define - WABT_FATAL("CatchAll: don't know how to visit\n"); - return Result::Error; - case ExprType::Compare: CHECK_RESULT(delegate_->OnCompareExpr(expr)); break; @@ -125,9 +115,8 @@ Result ExprVisitor::VisitExpr(Expr* expr) { break; case ExprType::Rethrow: - // TODO(karlschimpf): Define - WABT_FATAL("Rethrow: don't know how to visit\n"); - return Result::Error; + CHECK_RESULT(delegate_->OnRethrowExpr(expr)); + break; case ExprType::Return: CHECK_RESULT(delegate_->OnReturnExpr(expr)); @@ -154,14 +143,17 @@ Result ExprVisitor::VisitExpr(Expr* expr) { break; case ExprType::Throw: - // TODO(karlschimpf): Define - WABT_FATAL("Throw: don't know how to visit\n"); - return Result::Error; + CHECK_RESULT(delegate_->OnThrowExpr(expr)); + break; case ExprType::TryBlock: - // TODO(karlschimpf): Define - WABT_FATAL("TryBlock: don't know how to visit\n"); - return Result::Error; + 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_)); + CHECK_RESULT(VisitExprList(catch_->first)); + } + CHECK_RESULT(delegate_->EndTryExpr(expr)); break; case ExprType::Unary: diff --git a/src/expr-visitor.h b/src/expr-visitor.h index 11103d5e..99a74ec1 100644 --- a/src/expr-visitor.h +++ b/src/expr-visitor.h @@ -21,6 +21,7 @@ namespace wabt { +struct Catch; struct Expr; struct Func; @@ -74,6 +75,11 @@ class ExprVisitor::Delegate { 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; }; class ExprVisitor::DelegateNop : public ExprVisitor::Delegate { @@ -109,6 +115,11 @@ class ExprVisitor::DelegateNop : public ExprVisitor::Delegate { 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; } }; } // namespace wabt diff --git a/src/generate-names.cc b/src/generate-names.cc index 258d9b05..0f1a39da 100644 --- a/src/generate-names.cc +++ b/src/generate-names.cc @@ -65,6 +65,7 @@ class NameGenerator : public ExprVisitor::DelegateNop { Result VisitFuncType(Index func_type_index, FuncType* func_type); Result VisitTable(Index table_index, Table* table); Result VisitMemory(Index memory_index, Memory* memory); + Result VisitExcept(Index except_index, Exception* except); Module* module_ = nullptr; ExprVisitor visitor_; @@ -191,6 +192,12 @@ Result NameGenerator::VisitMemory(Index memory_index, Memory* memory) { return Result::Ok; } +Result NameGenerator::VisitExcept(Index except_index, Exception* except) { + MaybeGenerateAndBindName(&module_->except_bindings, "$e", except_index, + &except->name); + return Result::Ok; +} + Result NameGenerator::VisitModule(Module* module) { module_ = module; for (Index i = 0; i < module->globals.size(); ++i) @@ -203,6 +210,8 @@ Result NameGenerator::VisitModule(Module* module) { CHECK_RESULT(VisitTable(i, module->tables[i])); for (Index i = 0; i < module->memories.size(); ++i) CHECK_RESULT(VisitMemory(i, module->memories[i])); + for (Index i = 0; i < module->excepts.size(); ++i) + CHECK_RESULT(VisitExcept(i, module->excepts[i])); module_ = nullptr; return Result::Ok; } @@ -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; } @@ -88,8 +88,6 @@ enum class ExprType { BrTable, Call, CallIndirect, - Catch, - CatchAll, Compare, Const, Convert, @@ -130,6 +128,22 @@ struct Block { Expr* first; }; +struct Catch { + WABT_DISALLOW_COPY_AND_ASSIGN(Catch); + Catch() = delete; + explicit Catch(Expr* first); + Catch(Var var, Expr* first); + ~Catch(); + Location loc; + Var var; + struct Expr* first; + bool IsCatchAll() const { + return var.type == VarType::Index && var.index == kInvalidIndex; + } +}; + +typedef std::vector<Catch*> CatchVector; + struct Expr { WABT_DISALLOW_COPY_AND_ASSIGN(Expr); Expr(); @@ -143,8 +157,6 @@ struct Expr { static Expr* CreateBrTable(VarVector* targets, Var default_target); static Expr* CreateCall(Var); static Expr* CreateCallIndirect(Var); - static Expr* CreateCatch(Var v, Expr* first); - static Expr* CreateCatchAll(Expr* first); static Expr* CreateCompare(Opcode); static Expr* CreateConst(const Const&); static Expr* CreateConvert(Opcode); @@ -165,7 +177,7 @@ struct Expr { static Expr* CreateStore(Opcode, Address align, uint32_t offset); static Expr* CreateTeeLocal(Var); static Expr* CreateThrow(Var); - static Expr* CreateTry(Block* block, Expr* first_catch); + static Expr* CreateTry(); static Expr* CreateUnary(Opcode); static Expr* CreateUnreachable(); @@ -175,9 +187,7 @@ struct Expr { union { struct { Opcode opcode; } binary, compare, convert, unary; struct Block *block, *loop; - struct { Block* block; Expr* first_catch; } try_block; - struct { Var var; Expr* first; } catch_; - struct { Expr* first; } catch_all; + 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; @@ -193,6 +203,7 @@ struct Expr { struct Exception { StringSlice name; TypeVector sig; + ~Exception() { destroy_string_slice(&name); } }; struct FuncSignature { @@ -401,6 +412,7 @@ struct Module { const Global* GetGlobal(const Var&) const; Global* GetGlobal(const Var&); const Export* GetExport(const StringSlice&) const; + Index GetExceptIndex(const Var&) const; Location loc; StringSlice name; diff --git a/src/opcode.def b/src/opcode.def index 384687b8..a683c13c 100644 --- a/src/opcode.def +++ b/src/opcode.def @@ -36,6 +36,11 @@ WABT_OPCODE(___, ___, ___, 0, 0x02, Block, "block") WABT_OPCODE(___, ___, ___, 0, 0x03, Loop, "loop") WABT_OPCODE(___, ___, ___, 0, 0x04, If, "if") WABT_OPCODE(___, ___, ___, 0, 0x05, Else, "else") +WABT_OPCODE(___, ___, ___, 0, 0x06, Try, "try") +WABT_OPCODE(___, ___, ___, 0, 0x07, Catch, "catch") +WABT_OPCODE(___, ___, ___, 0, 0x08, Throw, "throw") +WABT_OPCODE(___, ___, ___, 0, 0x09, Rethrow, "rethrow") +WABT_OPCODE(___, ___, ___, 0, 0x0a, CatchAll, "catch_all") WABT_OPCODE(___, ___, ___, 0, 0x0b, End, "end") WABT_OPCODE(___, ___, ___, 0, 0x0c, Br, "br") WABT_OPCODE(___, ___, ___, 0, 0x0d, BrIf, "br_if") diff --git a/src/prebuilt/wast-parser-gen.cc b/src/prebuilt/wast-parser-gen.cc index aa3055f1..5abfb8de 100644 --- a/src/prebuilt/wast-parser-gen.cc +++ b/src/prebuilt/wast-parser-gen.cc @@ -154,7 +154,7 @@ #define CHECK_ALLOW_EXCEPTIONS(loc, opcode_name) \ do { \ - if (!parser->options->allow_exceptions) { \ + if (!parser->options->allow_future_exceptions) { \ wast_parser_error(loc, lexer, parser, "opcode not allowed: %s", \ opcode_name); \ } \ @@ -173,7 +173,6 @@ static bool is_power_of_two(uint32_t x) { static ExprList join_exprs1(Location* loc, Expr* expr1); static ExprList join_exprs2(Location* loc, ExprList* expr1, Expr* expr2); -static ExprList join_expr_lists(ExprList* expr1, ExprList* expr2); static void append_expr_list(ExprList* expr_list, ExprList* expr); static Result parse_const(Type type, @@ -211,7 +210,7 @@ class BinaryErrorHandlerModule : public BinaryErrorHandler { #define wabt_wast_parser_error wast_parser_error -#line 215 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:339 */ +#line 214 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:339 */ # ifndef YY_NULLPTR # if defined __cplusplus && 201103L <= __cplusplus @@ -366,7 +365,7 @@ int wabt_wast_parser_parse (::wabt::WastLexer* lexer, ::wabt::WastParser* parser /* Copy the second part of user declarations. */ -#line 370 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:358 */ +#line 369 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:358 */ #ifdef short # undef short @@ -673,16 +672,16 @@ static const yytype_uint8 yytranslate[] = /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 265, 265, 271, 281, 282, 286, 304, 305, 311, - 314, 319, 327, 331, 332, 337, 346, 347, 355, 361, - 367, 372, 379, 385, 396, 400, 404, 411, 415, 423, - 424, 431, 432, 435, 439, 440, 444, 445, 461, 462, - 477, 478, 479, 483, 486, 489, 492, 495, 499, 503, - 507, 510, 514, 518, 522, 526, 530, 534, 538, 541, - 544, 557, 560, 563, 566, 569, 572, 575, 579, 586, - 591, 596, 601, 607, 615, 618, 623, 630, 637, 644, - 645, 649, 650, 656, 660, 663, 668, 673, 679, 687, - 693, 701, 704, 718, 719, 727, 735, 738, 742, 746, + 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, @@ -772,52 +771,52 @@ static const yytype_int16 yypact[] = { 20, 948, -400, -400, -400, -400, -400, -400, -400, -400, -400, -400, -400, -400, -400, 55, -400, -400, -400, -400, - -400, -400, 77, -400, 105, 106, 118, 164, 106, 106, - 129, 106, 129, 131, 131, 106, 106, 131, 147, 147, - 165, 165, 165, 183, 183, 183, 193, 183, 100, -400, - 240, -400, -400, -400, 463, -400, -400, -400, -400, 166, - 142, 204, 212, 34, 152, 412, 214, -400, -400, 50, - 214, 257, -400, 131, 219, -400, 51, 147, -400, 131, - 131, 177, 131, 131, 131, -40, -400, 242, 252, 157, - 131, 131, 131, 366, -400, -400, 106, 106, 106, 118, - 118, -400, -400, -400, -400, 118, 118, -400, 118, 118, - 118, 118, 118, 220, 220, 253, -400, -400, -400, -400, - -400, -400, -400, -400, 502, 541, -400, -400, -400, 118, - 118, 106, -400, 271, -400, -400, -400, -400, -400, 285, - 463, -400, 291, -400, 292, 49, -400, 541, 298, 121, - 34, 185, -400, 302, -400, 297, 323, 325, 323, 152, - 106, 106, 106, 541, 327, 328, 106, -400, 233, 170, - -400, -400, 329, 323, 50, 257, -400, 330, 331, 333, - 117, 335, 167, 257, 257, 336, 55, 339, -400, 340, - 344, 345, 346, 279, -400, -400, 347, 349, 353, 118, - 106, -400, 106, 131, 131, -400, 580, 580, 580, -400, - -400, 118, -400, -400, -400, -400, -400, -400, -400, -400, - 289, 289, -400, -400, -400, -400, 697, -400, 947, -400, - -400, -400, 580, -400, 231, 355, -400, -400, -400, -400, - 237, 359, -400, -400, 360, -400, -400, -400, 361, -400, - -400, 299, -400, -400, -400, -400, -400, 580, 368, 580, - 370, 327, -400, -400, 580, 236, -400, -400, 257, -400, - -400, -400, 378, -400, -400, 148, -400, 380, 118, 118, - 118, 118, 118, -400, -400, -400, 189, 223, -400, -400, - 295, -400, -400, -400, -400, 342, -400, -400, -400, -400, - -400, 387, 180, 362, 181, 191, 382, 131, 391, 868, - 580, 392, -400, 24, 402, 238, -400, -400, -400, 275, - 106, -400, 266, -400, 106, -400, -400, 403, -400, -400, - 828, 368, 393, -400, -400, -400, -400, -400, 580, -400, - 294, -400, 415, -400, 106, 106, 106, 106, -400, 420, - 424, 433, 434, 437, -400, -400, -400, 253, -400, 502, - 438, 619, 658, 449, 450, -400, -400, -400, 106, 106, - 106, 106, 118, 541, -400, -400, 275, 448, 200, 455, - 201, 208, 457, 215, -400, 248, 541, -400, 908, 327, - -400, 465, 466, -400, 294, -400, 467, 121, 323, 323, - -400, -400, -400, -400, -400, 468, -400, 502, 742, -400, - 787, -400, 658, -400, 216, -400, -400, 541, -400, 541, - -400, -400, 106, 355, 469, 471, 291, 475, 478, -400, - 484, 541, -400, 446, 456, -400, 235, 485, 488, 489, - 500, 514, -400, -400, -400, -400, 504, -400, -400, -400, - 355, 472, -400, -400, 291, 476, -400, 518, 523, 527, - 539, -400, -400, -400, -400, -400, 106, -400, -400, 538, - 556, -400, -400, -400, 541, 547, 563, 541, -400, 566, + -400, -400, 77, -400, 105, 106, 238, 129, 106, 106, + 168, 106, 168, 141, 141, 106, 106, 141, 147, 147, + 167, 167, 167, 193, 193, 193, 205, 193, 100, -400, + 240, -400, -400, -400, 463, -400, -400, -400, -400, 211, + 165, 220, 226, 34, 152, 412, 241, -400, -400, 50, + 241, 253, -400, 141, 246, -400, 51, 147, -400, 141, + 141, 198, 141, 141, 141, -40, -400, 271, 278, 160, + 141, 141, 141, 366, -400, -400, 106, 106, 106, 238, + 238, -400, -400, -400, -400, 238, 238, -400, 238, 238, + 238, 238, 238, 249, 249, 282, -400, -400, -400, -400, + -400, -400, -400, -400, 502, 541, -400, -400, -400, 238, + 238, 106, -400, 290, -400, -400, -400, -400, -400, 293, + 463, -400, 302, -400, 304, 49, -400, 541, 319, 121, + 34, 103, -400, 324, -400, 320, 325, 328, 325, 152, + 106, 106, 106, 541, 330, 331, 106, -400, 233, 221, + -400, -400, 332, 325, 50, 253, -400, 335, 334, 336, + 117, 340, 135, 253, 253, 344, 55, 345, -400, 346, + 347, 349, 353, 190, -400, -400, 354, 355, 359, 238, + 106, -400, 106, 141, 141, -400, 580, 580, 580, -400, + -400, 238, -400, -400, -400, -400, -400, -400, -400, -400, + 298, 298, -400, -400, -400, -400, 697, -400, 947, -400, + -400, -400, 580, -400, 237, 367, -400, -400, -400, -400, + 179, 368, -400, -400, 361, -400, -400, -400, 362, -400, + -400, 313, -400, -400, -400, -400, -400, 580, 379, 580, + 380, 330, -400, -400, 580, 236, -400, -400, 253, -400, + -400, -400, 381, -400, -400, 148, -400, 387, 238, 238, + 238, 238, 238, -400, -400, -400, 119, 242, -400, -400, + 255, -400, -400, -400, -400, 352, -400, -400, -400, -400, + -400, 388, 187, 386, 191, 200, 397, 141, 404, 868, + 580, 402, -400, 24, 403, 251, -400, -400, -400, 276, + 106, -400, 266, -400, 106, -400, -400, 420, -400, -400, + 828, 379, 425, -400, -400, -400, -400, -400, 580, -400, + 296, -400, 433, -400, 106, 106, 106, 106, -400, 434, + 437, 438, 449, 450, -400, -400, -400, 282, -400, 502, + 460, 619, 658, 461, 464, -400, -400, -400, 106, 106, + 106, 106, 238, 541, -400, -400, -400, 118, 201, 457, + 208, 215, 459, 216, -400, 248, 541, -400, 908, 330, + -400, 467, 468, -400, 296, -400, 469, 121, 325, 325, + -400, -400, -400, -400, -400, 470, -400, 502, 742, -400, + 787, -400, 658, -400, 218, -400, -400, 541, -400, 541, + -400, 106, -400, 367, 475, 478, 302, 484, 479, -400, + 485, 541, -400, 448, 466, -400, 244, 489, 500, 514, + 516, 517, -400, -400, -400, -400, 511, -400, -400, -400, + 367, 472, -400, -400, 302, 476, -400, 528, 539, 553, + 555, -400, -400, -400, -400, -400, 106, -400, -400, 547, + 557, -400, -400, -400, 541, 548, 566, 541, -400, 567, -400 }; @@ -868,7 +867,7 @@ static const yytype_uint8 yydefact[] = 89, 0, 0, 93, 90, 150, 16, 0, 0, 0, 163, 166, 164, 165, 167, 0, 127, 106, 0, 130, 0, 133, 106, 162, 0, 69, 71, 106, 70, 106, - 78, 82, 34, 123, 0, 123, 16, 0, 16, 143, + 78, 34, 82, 123, 0, 123, 16, 0, 16, 143, 0, 106, 101, 0, 0, 94, 0, 0, 0, 0, 0, 0, 212, 128, 134, 74, 0, 77, 73, 121, 123, 0, 124, 14, 16, 0, 17, 98, 0, 0, @@ -880,15 +879,15 @@ static const yytype_uint8 yydefact[] = /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -400, 143, -159, -1, -174, 405, -143, 509, -381, 154, - -150, -160, -62, -134, -52, 239, -12, -92, 31, 21, - -97, 491, 377, -400, -54, -400, -190, -131, 173, 175, - -400, 245, -28, -400, 261, 241, -400, 306, -400, -400, - -400, -46, -122, 383, 447, 459, -400, -400, 505, 413, - -399, 224, 536, -337, 313, -400, -341, 63, -400, -400, - 517, -400, -400, 503, -400, 533, -400, -400, -34, -400, - -400, 39, -400, -400, -5, -400, 608, -400, -400, 53, - 103, 234, -400, 665, -400, -400, 511, -400, -400 + -400, 145, -159, -1, -174, 427, -143, 534, -381, 170, + -150, -160, -62, -134, -52, 252, -12, -92, 31, 21, + -97, 491, 378, -400, -54, -400, -190, -131, 173, 176, + 258, -400, -28, -400, 283, 243, -400, 307, -400, -400, + -400, -46, -122, 383, 482, 481, -400, -400, 508, 414, + -399, 259, 550, -337, 315, -400, -341, 63, -400, -400, + 518, -400, -400, 509, -400, 537, -400, -400, -34, -400, + -400, 39, -400, -400, -5, -400, 612, -400, -400, 53, + 144, 234, -400, 677, -400, -400, 512, -400, -400 }; /* YYDEFGOTO[NTERM-NUM]. */ @@ -922,65 +921,65 @@ static const yytype_int16 yytable[] = 197, 198, 80, 212, 213, 71, 214, 215, 216, 217, 218, 319, 150, 159, 253, 52, 156, 156, 174, 342, 312, 171, 171, 203, 204, 53, 149, 230, 231, 183, - 184, 156, 156, 56, 248, 158, 329, 57, 335, 167, - 187, 146, 65, 175, 56, 312, 261, 312, 57, 72, - 173, 331, 340, 82, 83, 84, 378, 380, 338, 90, + 184, 156, 156, 354, 248, 158, 329, 273, 335, 167, + 187, 146, 60, 175, 421, 312, 261, 312, 53, 284, + 173, 331, 340, 372, 373, 285, 378, 380, 338, 72, 381, 383, 25, 26, 27, 151, 78, 56, 28, 29, - 30, 31, 32, 152, 33, 34, 35, 60, 81, 278, - 141, 284, 164, 53, 164, 279, 280, 285, 281, 367, - 166, 49, 166, 282, 359, 361, 85, 301, 312, 150, - 285, 285, 414, 354, 142, 362, 89, 273, 159, 315, - 344, 285, 307, 308, 423, 425, 345, 346, 143, 347, - 285, 285, 426, 174, 35, 60, 340, 65, 285, 428, - 445, 303, 180, 306, 36, 285, 285, 355, 38, 39, - 332, 273, 268, 261, 203, 204, 385, 266, 56, 441, - 341, 56, 57, -30, 36, 57, 194, -30, 440, 203, - 204, 420, 429, 56, 439, 164, 195, 57, 222, 223, - 224, 219, 438, 166, 430, 176, 349, 350, 351, 352, - 353, 415, 416, 417, 418, 233, 164, 86, 87, 88, - 91, 92, 295, 296, 166, 199, 320, 321, 234, 199, - 324, 325, 324, 325, 240, 446, 243, 447, 295, 356, - 372, 373, 247, 332, 389, 251, 364, 36, 152, 458, + 30, 31, 32, 152, 33, 34, 35, 203, 204, 278, + 81, 65, 164, 56, 164, 279, 280, 57, 281, 367, + 166, 49, 166, 282, 82, 83, 84, 301, 312, 150, + 90, 359, 414, 295, 296, 361, 85, 285, 159, 315, + 344, 285, 307, 308, 362, 423, 345, 346, 89, 347, + 285, 285, 425, 174, 35, 141, 340, 142, 285, 426, + 428, 303, 445, 306, 143, 285, 285, 36, 285, 60, + 332, 38, 39, 261, 324, 325, 385, 266, 56, 441, + 341, 56, 57, 56, 65, 57, 355, 57, 440, 180, + 273, 420, 429, 56, 439, 164, -30, 57, 295, 356, + -30, 176, 438, 166, 430, 36, 349, 350, 351, 352, + 353, 415, 416, 417, 418, 194, 164, 86, 87, 88, + 91, 92, 195, 268, 166, 203, 204, 222, 223, 224, + 219, 199, 320, 321, 233, 446, 234, 447, 199, 324, + 325, 372, 373, 332, 389, 240, 364, 36, 243, 458, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 320, 321, 391, 392, 448, 286, 287, 56, 254, - 228, 316, 263, 269, 164, 274, 275, 171, 273, 283, - 288, 379, 166, 289, 291, 382, 156, 156, 292, 293, - 294, 298, 476, 299, 164, 479, 164, 300, 322, 328, - 419, 432, 166, 326, 166, 55, 55, 55, 55, 473, - 327, 330, 360, 244, 336, 396, 397, 398, 399, 94, - 95, 160, 343, 161, 348, 357, 162, 99, 100, 101, - 102, 358, 363, 103, 104, 365, 388, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 384, 368, 115, - 116, 117, 118, 119, 120, 121, 122, 123, 371, 395, - 199, 200, 201, 202, 400, 94, 95, 160, 401, 161, - 203, 204, 162, 99, 100, 101, 102, 402, 403, 103, - 104, 404, 407, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 412, 413, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 422, 424, 93, 427, 433, 434, - 436, 372, 442, 450, 451, 163, 94, 95, 96, 454, - 97, 455, 373, 98, 99, 100, 101, 102, 457, 461, - 103, 104, 462, 463, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 464, 226, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 94, 95, 96, 465, 97, - 466, 469, 98, 99, 100, 101, 102, 470, 321, 103, - 104, 471, 325, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 472, 228, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 94, 95, 96, 474, 97, 475, - 252, 98, 99, 100, 101, 102, 477, 478, 103, 104, - 480, 144, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 456, 309, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 94, 95, 96, 405, 97, 318, 390, - 98, 99, 100, 101, 102, 221, 459, 103, 104, 460, - 260, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 421, 408, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 94, 95, 96, 435, 97, 387, 276, 98, - 99, 100, 101, 102, 337, 239, 103, 104, 323, 452, + 47, 320, 321, 247, 448, 391, 392, 251, 286, 287, + 56, 152, 254, 228, 164, 263, 269, 171, 274, 275, + 316, 379, 166, 273, 283, 382, 156, 156, 288, 289, + 291, 292, 476, 293, 164, 479, 164, 294, 298, 299, + 419, 432, 166, 300, 166, 55, 55, 55, 55, 473, + 322, 327, 326, 328, 244, 396, 397, 398, 399, 94, + 95, 160, 330, 161, 336, 343, 162, 99, 100, 101, + 102, 348, 358, 103, 104, 357, 360, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 363, 365, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 368, 371, + 199, 200, 201, 202, 384, 94, 95, 160, 388, 161, + 203, 204, 162, 99, 100, 101, 102, 395, 400, 103, + 104, 401, 402, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 403, 404, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 407, 412, 93, 424, 413, 427, + 433, 434, 436, 372, 442, 163, 94, 95, 96, 450, + 97, 451, 455, 98, 99, 100, 101, 102, 454, 457, + 103, 104, 373, 461, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 462, 226, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 94, 95, 96, 463, 97, + 464, 465, 98, 99, 100, 101, 102, 466, 321, 103, + 104, 469, 325, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 470, 228, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 94, 95, 96, 471, 97, 472, + 475, 98, 99, 100, 101, 102, 474, 477, 103, 104, + 478, 480, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 252, 309, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 94, 95, 96, 144, 97, 456, 318, + 98, 99, 100, 101, 102, 221, 459, 103, 104, 405, + 460, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 390, 408, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 94, 95, 96, 422, 97, 435, 387, 98, + 99, 100, 101, 102, 337, 260, 103, 104, 239, 323, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 227, 410, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 94, 95, 96, 409, 97, 256, 271, 98, 99, - 100, 101, 102, 250, 186, 103, 104, 51, 0, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 290, - 0, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 276, 410, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 94, 95, 96, 227, 97, 409, 256, 98, 99, + 100, 101, 102, 271, 452, 103, 104, 250, 186, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 51, + 290, 115, 116, 117, 118, 119, 120, 121, 122, 123, 94, 95, 160, 0, 161, 0, 0, 162, 99, 100, 101, 102, 0, 0, 103, 104, 0, 0, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 0, 0, @@ -1029,65 +1028,65 @@ static const yytype_int16 yycheck[] = 91, 92, 39, 105, 106, 32, 108, 109, 110, 111, 112, 232, 63, 64, 156, 0, 158, 159, 69, 268, 232, 173, 174, 64, 65, 9, 150, 129, 130, 68, - 69, 173, 174, 5, 3, 159, 257, 9, 259, 66, - 77, 10, 3, 70, 5, 257, 164, 259, 9, 8, - 174, 331, 264, 40, 41, 42, 320, 321, 338, 46, + 69, 173, 174, 4, 3, 159, 257, 8, 259, 66, + 77, 10, 3, 70, 16, 257, 164, 259, 9, 4, + 174, 331, 264, 25, 26, 10, 320, 321, 338, 8, 324, 325, 52, 53, 54, 3, 9, 5, 58, 59, - 60, 61, 62, 11, 64, 65, 66, 3, 3, 52, - 4, 4, 226, 9, 228, 58, 59, 10, 61, 310, - 226, 186, 228, 66, 4, 4, 3, 199, 310, 150, - 10, 10, 366, 4, 52, 4, 3, 8, 159, 211, - 52, 10, 203, 204, 4, 4, 58, 59, 4, 61, - 10, 10, 4, 174, 66, 3, 338, 3, 10, 4, - 4, 200, 3, 202, 67, 10, 10, 4, 71, 72, - 258, 8, 62, 261, 64, 65, 328, 4, 5, 399, - 4, 5, 9, 5, 67, 9, 4, 9, 398, 64, - 65, 373, 4, 5, 397, 309, 4, 9, 5, 6, - 7, 41, 396, 309, 386, 8, 278, 279, 280, 281, + 60, 61, 62, 11, 64, 65, 66, 64, 65, 52, + 3, 3, 226, 5, 228, 58, 59, 9, 61, 310, + 226, 186, 228, 66, 40, 41, 42, 199, 310, 150, + 46, 4, 366, 3, 4, 4, 3, 10, 159, 211, + 52, 10, 203, 204, 4, 4, 58, 59, 3, 61, + 10, 10, 4, 174, 66, 4, 338, 52, 10, 4, + 4, 200, 4, 202, 4, 10, 10, 67, 10, 3, + 258, 71, 72, 261, 55, 56, 328, 4, 5, 399, + 4, 5, 9, 5, 3, 9, 4, 9, 398, 3, + 8, 373, 4, 5, 397, 309, 5, 9, 3, 4, + 9, 8, 396, 309, 386, 67, 278, 279, 280, 281, 282, 368, 369, 370, 371, 4, 330, 43, 44, 45, - 46, 47, 3, 4, 330, 54, 55, 56, 3, 54, - 55, 56, 55, 56, 3, 417, 4, 419, 3, 4, - 25, 26, 4, 331, 332, 3, 307, 67, 11, 431, + 46, 47, 4, 62, 330, 64, 65, 5, 6, 7, + 41, 54, 55, 56, 4, 417, 3, 419, 54, 55, + 56, 25, 26, 331, 332, 3, 307, 67, 4, 431, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 55, 56, 29, 30, 422, 183, 184, 5, 4, - 3, 42, 4, 4, 388, 4, 3, 399, 8, 4, - 4, 320, 388, 4, 4, 324, 398, 399, 4, 4, - 4, 4, 474, 4, 408, 477, 410, 4, 3, 60, + 80, 55, 56, 4, 421, 29, 30, 3, 183, 184, + 5, 11, 4, 3, 388, 4, 4, 399, 4, 3, + 42, 320, 388, 8, 4, 324, 398, 399, 4, 4, + 4, 4, 474, 4, 408, 477, 410, 4, 4, 4, 372, 389, 408, 4, 410, 344, 345, 346, 347, 466, - 10, 3, 10, 12, 4, 344, 345, 346, 347, 13, - 14, 15, 4, 17, 4, 43, 20, 21, 22, 23, - 24, 4, 10, 27, 28, 4, 3, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 4, 16, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 16, 4, - 54, 55, 56, 57, 4, 13, 14, 15, 4, 17, + 3, 10, 4, 60, 12, 344, 345, 346, 347, 13, + 14, 15, 3, 17, 4, 4, 20, 21, 22, 23, + 24, 4, 4, 27, 28, 43, 10, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 10, 4, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 16, 16, + 54, 55, 56, 57, 4, 13, 14, 15, 3, 17, 64, 65, 20, 21, 22, 23, 24, 4, 4, 27, 28, 4, 4, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 4, 4, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 16, 10, 3, 10, 3, 3, - 3, 25, 4, 4, 3, 63, 13, 14, 15, 4, - 17, 3, 26, 20, 21, 22, 23, 24, 4, 4, - 27, 28, 4, 4, 31, 32, 33, 34, 35, 36, + 48, 49, 50, 51, 4, 4, 3, 10, 4, 10, + 3, 3, 3, 25, 4, 63, 13, 14, 15, 4, + 17, 3, 3, 20, 21, 22, 23, 24, 4, 4, + 27, 28, 26, 4, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 4, 3, 43, 44, 45, 46, 47, 48, 49, 50, 51, 13, 14, 15, 4, 17, - 16, 3, 20, 21, 22, 23, 24, 4, 56, 27, - 28, 4, 56, 31, 32, 33, 34, 35, 36, 37, + 4, 4, 20, 21, 22, 23, 24, 16, 56, 27, + 28, 3, 56, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 4, 3, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 13, 14, 15, 19, 17, 3, - 155, 20, 21, 22, 23, 24, 19, 4, 27, 28, - 4, 62, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 428, 3, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 13, 14, 15, 357, 17, 221, 338, - 20, 21, 22, 23, 24, 114, 433, 27, 28, 434, - 163, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 376, 3, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 13, 14, 15, 394, 17, 331, 179, 20, - 21, 22, 23, 24, 261, 140, 27, 28, 235, 425, + 48, 49, 50, 51, 13, 14, 15, 4, 17, 4, + 3, 20, 21, 22, 23, 24, 19, 19, 27, 28, + 4, 4, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 155, 3, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 13, 14, 15, 62, 17, 428, 221, + 20, 21, 22, 23, 24, 114, 433, 27, 28, 357, + 434, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 338, 3, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 13, 14, 15, 377, 17, 394, 331, 20, + 21, 22, 23, 24, 261, 163, 27, 28, 140, 235, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 124, 3, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 13, 14, 15, 361, 17, 159, 174, 20, 21, - 22, 23, 24, 150, 76, 27, 28, 22, -1, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 188, - -1, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 179, 3, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 13, 14, 15, 124, 17, 361, 159, 20, 21, + 22, 23, 24, 174, 425, 27, 28, 150, 76, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 22, + 188, 43, 44, 45, 46, 47, 48, 49, 50, 51, 13, 14, 15, -1, 17, -1, -1, 20, 21, 22, 23, 24, -1, -1, 27, 28, -1, -1, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, -1, -1, @@ -1168,7 +1167,7 @@ static const yytype_uint8 yystos[] = 116, 29, 30, 117, 118, 4, 100, 100, 100, 100, 4, 4, 4, 4, 4, 97, 135, 4, 3, 136, 3, 138, 4, 4, 86, 102, 102, 102, 102, 98, - 124, 113, 16, 4, 10, 4, 4, 10, 4, 4, + 124, 16, 112, 4, 10, 4, 4, 10, 4, 4, 124, 18, 114, 3, 3, 117, 3, 90, 95, 88, 92, 93, 4, 135, 138, 4, 124, 124, 102, 132, 4, 3, 133, 90, 4, 3, 91, 4, 124, 110, @@ -1725,459 +1724,435 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio switch (yytype) { case 5: /* NAT */ -#line 229 "src/wast-parser.y" /* yacc.c:1257 */ +#line 228 "src/wast-parser.y" /* yacc.c:1257 */ {} -#line 1731 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1730 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 6: /* INT */ -#line 229 "src/wast-parser.y" /* yacc.c:1257 */ +#line 228 "src/wast-parser.y" /* yacc.c:1257 */ {} -#line 1737 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1736 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 7: /* FLOAT */ -#line 229 "src/wast-parser.y" /* yacc.c:1257 */ +#line 228 "src/wast-parser.y" /* yacc.c:1257 */ {} -#line 1743 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1742 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 8: /* TEXT */ -#line 229 "src/wast-parser.y" /* yacc.c:1257 */ +#line 228 "src/wast-parser.y" /* yacc.c:1257 */ {} -#line 1749 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1748 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 9: /* VAR */ -#line 229 "src/wast-parser.y" /* yacc.c:1257 */ +#line 228 "src/wast-parser.y" /* yacc.c:1257 */ {} -#line 1755 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1754 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 41: /* OFFSET_EQ_NAT */ -#line 229 "src/wast-parser.y" /* yacc.c:1257 */ +#line 228 "src/wast-parser.y" /* yacc.c:1257 */ {} -#line 1761 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1760 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 42: /* ALIGN_EQ_NAT */ -#line 229 "src/wast-parser.y" /* yacc.c:1257 */ +#line 228 "src/wast-parser.y" /* yacc.c:1257 */ {} -#line 1767 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1766 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 83: /* text_list */ -#line 249 "src/wast-parser.y" /* yacc.c:1257 */ +#line 248 "src/wast-parser.y" /* yacc.c:1257 */ { destroy_text_list(&((*yyvaluep).text_list)); } -#line 1773 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1772 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 84: /* text_list_opt */ -#line 249 "src/wast-parser.y" /* yacc.c:1257 */ +#line 248 "src/wast-parser.y" /* yacc.c:1257 */ { destroy_text_list(&((*yyvaluep).text_list)); } -#line 1779 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1778 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 85: /* quoted_text */ -#line 230 "src/wast-parser.y" /* yacc.c:1257 */ +#line 229 "src/wast-parser.y" /* yacc.c:1257 */ { destroy_string_slice(&((*yyvaluep).text)); } -#line 1785 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1784 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 86: /* value_type_list */ -#line 250 "src/wast-parser.y" /* yacc.c:1257 */ +#line 249 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).types); } -#line 1791 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1790 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 88: /* global_type */ -#line 243 "src/wast-parser.y" /* yacc.c:1257 */ +#line 242 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).global); } -#line 1797 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1796 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 89: /* func_type */ -#line 242 "src/wast-parser.y" /* yacc.c:1257 */ +#line 241 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).func_sig); } -#line 1803 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1802 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 90: /* func_sig */ -#line 242 "src/wast-parser.y" /* yacc.c:1257 */ +#line 241 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).func_sig); } -#line 1809 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1808 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 91: /* func_sig_result */ -#line 242 "src/wast-parser.y" /* yacc.c:1257 */ +#line 241 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).func_sig); } -#line 1815 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1814 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 93: /* memory_sig */ -#line 245 "src/wast-parser.y" /* yacc.c:1257 */ +#line 244 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).memory); } -#line 1821 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1820 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 95: /* type_use */ -#line 251 "src/wast-parser.y" /* yacc.c:1257 */ +#line 250 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).var); } -#line 1827 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1826 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 97: /* literal */ -#line 231 "src/wast-parser.y" /* yacc.c:1257 */ +#line 230 "src/wast-parser.y" /* yacc.c:1257 */ { destroy_string_slice(&((*yyvaluep).literal).text); } -#line 1833 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1832 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 98: /* var */ -#line 251 "src/wast-parser.y" /* yacc.c:1257 */ +#line 250 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).var); } -#line 1839 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1838 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 99: /* var_list */ -#line 252 "src/wast-parser.y" /* yacc.c:1257 */ +#line 251 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).vars); } -#line 1845 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1844 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 100: /* bind_var_opt */ -#line 230 "src/wast-parser.y" /* yacc.c:1257 */ +#line 229 "src/wast-parser.y" /* yacc.c:1257 */ { destroy_string_slice(&((*yyvaluep).text)); } -#line 1851 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1850 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 101: /* bind_var */ -#line 230 "src/wast-parser.y" /* yacc.c:1257 */ +#line 229 "src/wast-parser.y" /* yacc.c:1257 */ { destroy_string_slice(&((*yyvaluep).text)); } -#line 1857 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1856 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 102: /* labeling_opt */ -#line 230 "src/wast-parser.y" /* yacc.c:1257 */ +#line 229 "src/wast-parser.y" /* yacc.c:1257 */ { destroy_string_slice(&((*yyvaluep).text)); } -#line 1863 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1862 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 105: /* instr */ -#line 239 "src/wast-parser.y" /* yacc.c:1257 */ +#line 238 "src/wast-parser.y" /* yacc.c:1257 */ { DestroyExprList(((*yyvaluep).expr_list).first); } -#line 1869 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1868 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 106: /* plain_instr */ -#line 238 "src/wast-parser.y" /* yacc.c:1257 */ +#line 237 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).expr); } -#line 1875 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1874 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 107: /* block_instr */ -#line 238 "src/wast-parser.y" /* yacc.c:1257 */ +#line 237 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).expr); } -#line 1881 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1880 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 108: /* block_sig */ -#line 250 "src/wast-parser.y" /* yacc.c:1257 */ +#line 249 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).types); } -#line 1887 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1886 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 109: /* block */ -#line 233 "src/wast-parser.y" /* yacc.c:1257 */ +#line 232 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).block); } -#line 1893 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ - break; - - case 110: /* plain_catch */ -#line 239 "src/wast-parser.y" /* yacc.c:1257 */ - { DestroyExprList(((*yyvaluep).expr_list).first); } -#line 1899 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ - break; - - case 111: /* plain_catch_all */ -#line 239 "src/wast-parser.y" /* yacc.c:1257 */ - { DestroyExprList(((*yyvaluep).expr_list).first); } -#line 1905 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ - break; - - case 112: /* catch_instr */ -#line 239 "src/wast-parser.y" /* yacc.c:1257 */ - { DestroyExprList(((*yyvaluep).expr_list).first); } -#line 1911 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1892 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 113: /* catch_instr_list */ -#line 239 "src/wast-parser.y" /* yacc.c:1257 */ - { DestroyExprList(((*yyvaluep).expr_list).first); } -#line 1917 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#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 239 "src/wast-parser.y" /* yacc.c:1257 */ +#line 238 "src/wast-parser.y" /* yacc.c:1257 */ { DestroyExprList(((*yyvaluep).expr_list).first); } -#line 1923 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1904 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 115: /* expr1 */ -#line 239 "src/wast-parser.y" /* yacc.c:1257 */ +#line 238 "src/wast-parser.y" /* yacc.c:1257 */ { DestroyExprList(((*yyvaluep).expr_list).first); } -#line 1929 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1910 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 116: /* try_ */ -#line 238 "src/wast-parser.y" /* yacc.c:1257 */ +#line 237 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).expr); } -#line 1935 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ - break; - - case 117: /* catch_sexp */ -#line 239 "src/wast-parser.y" /* yacc.c:1257 */ - { DestroyExprList(((*yyvaluep).expr_list).first); } -#line 1941 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1916 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 118: /* catch_sexp_list */ -#line 239 "src/wast-parser.y" /* yacc.c:1257 */ - { DestroyExprList(((*yyvaluep).expr_list).first); } -#line 1947 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 237 "src/wast-parser.y" /* yacc.c:1257 */ + { delete ((*yyvaluep).expr); } +#line 1922 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 119: /* if_block */ -#line 239 "src/wast-parser.y" /* yacc.c:1257 */ +#line 238 "src/wast-parser.y" /* yacc.c:1257 */ { DestroyExprList(((*yyvaluep).expr_list).first); } -#line 1953 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1928 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 120: /* if_ */ -#line 239 "src/wast-parser.y" /* yacc.c:1257 */ +#line 238 "src/wast-parser.y" /* yacc.c:1257 */ { DestroyExprList(((*yyvaluep).expr_list).first); } -#line 1959 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1934 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 124: /* instr_list */ -#line 239 "src/wast-parser.y" /* yacc.c:1257 */ +#line 238 "src/wast-parser.y" /* yacc.c:1257 */ { DestroyExprList(((*yyvaluep).expr_list).first); } -#line 1965 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1940 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 125: /* expr_list */ -#line 239 "src/wast-parser.y" /* yacc.c:1257 */ +#line 238 "src/wast-parser.y" /* yacc.c:1257 */ { DestroyExprList(((*yyvaluep).expr_list).first); } -#line 1971 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1946 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 126: /* const_expr */ -#line 239 "src/wast-parser.y" /* yacc.c:1257 */ +#line 238 "src/wast-parser.y" /* yacc.c:1257 */ { DestroyExprList(((*yyvaluep).expr_list).first); } -#line 1977 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1952 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 129: /* func */ -#line 240 "src/wast-parser.y" /* yacc.c:1257 */ +#line 239 "src/wast-parser.y" /* yacc.c:1257 */ { destroy_module_field_list(&((*yyvaluep).module_fields)); } -#line 1983 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1958 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 130: /* func_fields */ -#line 240 "src/wast-parser.y" /* yacc.c:1257 */ +#line 239 "src/wast-parser.y" /* yacc.c:1257 */ { destroy_module_field_list(&((*yyvaluep).module_fields)); } -#line 1989 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1964 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 131: /* func_fields_import */ -#line 241 "src/wast-parser.y" /* yacc.c:1257 */ +#line 240 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).func); } -#line 1995 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1970 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 132: /* func_fields_import1 */ -#line 241 "src/wast-parser.y" /* yacc.c:1257 */ +#line 240 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).func); } -#line 2001 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1976 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 133: /* func_fields_import_result */ -#line 241 "src/wast-parser.y" /* yacc.c:1257 */ +#line 240 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).func); } -#line 2007 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1982 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 134: /* func_fields_body */ -#line 241 "src/wast-parser.y" /* yacc.c:1257 */ +#line 240 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).func); } -#line 2013 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1988 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 135: /* func_fields_body1 */ -#line 241 "src/wast-parser.y" /* yacc.c:1257 */ +#line 240 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).func); } -#line 2019 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 1994 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 136: /* func_result_body */ -#line 241 "src/wast-parser.y" /* yacc.c:1257 */ +#line 240 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).func); } -#line 2025 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 2000 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 137: /* func_body */ -#line 241 "src/wast-parser.y" /* yacc.c:1257 */ +#line 240 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).func); } -#line 2031 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 2006 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 138: /* func_body1 */ -#line 241 "src/wast-parser.y" /* yacc.c:1257 */ +#line 240 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).func); } -#line 2037 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 2012 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 139: /* offset */ -#line 239 "src/wast-parser.y" /* yacc.c:1257 */ +#line 238 "src/wast-parser.y" /* yacc.c:1257 */ { DestroyExprList(((*yyvaluep).expr_list).first); } -#line 2043 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 2018 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 141: /* table */ -#line 240 "src/wast-parser.y" /* yacc.c:1257 */ +#line 239 "src/wast-parser.y" /* yacc.c:1257 */ { destroy_module_field_list(&((*yyvaluep).module_fields)); } -#line 2049 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 2024 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 142: /* table_fields */ -#line 240 "src/wast-parser.y" /* yacc.c:1257 */ +#line 239 "src/wast-parser.y" /* yacc.c:1257 */ { destroy_module_field_list(&((*yyvaluep).module_fields)); } -#line 2055 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 2030 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 144: /* memory */ -#line 240 "src/wast-parser.y" /* yacc.c:1257 */ +#line 239 "src/wast-parser.y" /* yacc.c:1257 */ { destroy_module_field_list(&((*yyvaluep).module_fields)); } -#line 2061 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 2036 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 145: /* memory_fields */ -#line 240 "src/wast-parser.y" /* yacc.c:1257 */ +#line 239 "src/wast-parser.y" /* yacc.c:1257 */ { destroy_module_field_list(&((*yyvaluep).module_fields)); } -#line 2067 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 2042 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 146: /* global */ -#line 240 "src/wast-parser.y" /* yacc.c:1257 */ +#line 239 "src/wast-parser.y" /* yacc.c:1257 */ { destroy_module_field_list(&((*yyvaluep).module_fields)); } -#line 2073 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 2048 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 147: /* global_fields */ -#line 240 "src/wast-parser.y" /* yacc.c:1257 */ +#line 239 "src/wast-parser.y" /* yacc.c:1257 */ { destroy_module_field_list(&((*yyvaluep).module_fields)); } -#line 2079 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 2054 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 148: /* import_desc */ -#line 244 "src/wast-parser.y" /* yacc.c:1257 */ +#line 243 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).import); } -#line 2085 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 2060 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 150: /* inline_import */ -#line 244 "src/wast-parser.y" /* yacc.c:1257 */ +#line 243 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).import); } -#line 2091 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 2066 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 151: /* export_desc */ -#line 237 "src/wast-parser.y" /* yacc.c:1257 */ +#line 236 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).export_); } -#line 2097 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 2072 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 153: /* inline_export */ -#line 237 "src/wast-parser.y" /* yacc.c:1257 */ +#line 236 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).export_); } -#line 2103 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 2078 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 156: /* module_field */ -#line 240 "src/wast-parser.y" /* yacc.c:1257 */ +#line 239 "src/wast-parser.y" /* yacc.c:1257 */ { destroy_module_field_list(&((*yyvaluep).module_fields)); } -#line 2109 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 2084 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 157: /* module_fields_opt */ -#line 246 "src/wast-parser.y" /* yacc.c:1257 */ +#line 245 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).module); } -#line 2115 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 2090 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 158: /* module_fields */ -#line 246 "src/wast-parser.y" /* yacc.c:1257 */ +#line 245 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).module); } -#line 2121 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 2096 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 159: /* module */ -#line 246 "src/wast-parser.y" /* yacc.c:1257 */ +#line 245 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).module); } -#line 2127 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 2102 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 160: /* inline_module */ -#line 246 "src/wast-parser.y" /* yacc.c:1257 */ +#line 245 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).module); } -#line 2133 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 2108 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 161: /* script_var_opt */ -#line 251 "src/wast-parser.y" /* yacc.c:1257 */ +#line 250 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).var); } -#line 2139 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 2114 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 162: /* script_module */ -#line 247 "src/wast-parser.y" /* yacc.c:1257 */ +#line 246 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).script_module); } -#line 2145 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 2120 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 163: /* action */ -#line 232 "src/wast-parser.y" /* yacc.c:1257 */ +#line 231 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).action); } -#line 2151 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 2126 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 164: /* assertion */ -#line 234 "src/wast-parser.y" /* yacc.c:1257 */ +#line 233 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).command); } -#line 2157 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 2132 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 165: /* cmd */ -#line 234 "src/wast-parser.y" /* yacc.c:1257 */ +#line 233 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).command); } -#line 2163 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 2138 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 166: /* cmd_list */ -#line 235 "src/wast-parser.y" /* yacc.c:1257 */ +#line 234 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).commands); } -#line 2169 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 2144 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 168: /* const_list */ -#line 236 "src/wast-parser.y" /* yacc.c:1257 */ +#line 235 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).consts); } -#line 2175 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 2150 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 169: /* script */ -#line 248 "src/wast-parser.y" /* yacc.c:1257 */ +#line 247 "src/wast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).script); } -#line 2181 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ +#line 2156 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; @@ -2469,18 +2444,18 @@ yyreduce: switch (yyn) { case 2: -#line 265 "src/wast-parser.y" /* yacc.c:1646 */ +#line 264 "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 2480 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2455 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 3: -#line 271 "src/wast-parser.y" /* yacc.c:1646 */ +#line 270 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.text_list) = (yyvsp[-1].text_list); TextListNode* node = new TextListNode(); @@ -2489,17 +2464,17 @@ yyreduce: (yyval.text_list).last->next = node; (yyval.text_list).last = node; } -#line 2493 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2468 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 4: -#line 281 "src/wast-parser.y" /* yacc.c:1646 */ +#line 280 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.text_list).first = (yyval.text_list).last = nullptr; } -#line 2499 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2474 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 6: -#line 286 "src/wast-parser.y" /* yacc.c:1646 */ +#line 285 "src/wast-parser.y" /* yacc.c:1646 */ { TextListNode node; node.text = (yyvsp[0].text); @@ -2513,139 +2488,139 @@ yyreduce: (yyval.text).start = data; (yyval.text).length = size; } -#line 2517 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2492 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 7: -#line 304 "src/wast-parser.y" /* yacc.c:1646 */ +#line 303 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.types) = new TypeVector(); } -#line 2523 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2498 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 8: -#line 305 "src/wast-parser.y" /* yacc.c:1646 */ +#line 304 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.types) = (yyvsp[-1].types); (yyval.types)->push_back((yyvsp[0].type)); } -#line 2532 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2507 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 9: -#line 311 "src/wast-parser.y" /* yacc.c:1646 */ +#line 310 "src/wast-parser.y" /* yacc.c:1646 */ {} -#line 2538 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2513 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 10: -#line 314 "src/wast-parser.y" /* yacc.c:1646 */ +#line 313 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.global) = new Global(); (yyval.global)->type = (yyvsp[0].type); (yyval.global)->mutable_ = false; } -#line 2548 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2523 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 11: -#line 319 "src/wast-parser.y" /* yacc.c:1646 */ +#line 318 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.global) = new Global(); (yyval.global)->type = (yyvsp[-1].type); (yyval.global)->mutable_ = true; } -#line 2558 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2533 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 12: -#line 327 "src/wast-parser.y" /* yacc.c:1646 */ +#line 326 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.func_sig) = (yyvsp[-1].func_sig); } -#line 2564 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2539 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 14: -#line 332 "src/wast-parser.y" /* yacc.c:1646 */ +#line 331 "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 2574 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2549 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 15: -#line 337 "src/wast-parser.y" /* yacc.c:1646 */ +#line 336 "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 2585 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2560 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 16: -#line 346 "src/wast-parser.y" /* yacc.c:1646 */ +#line 345 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.func_sig) = new FuncSignature(); } -#line 2591 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2566 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 17: -#line 347 "src/wast-parser.y" /* yacc.c:1646 */ +#line 346 "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 2601 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2576 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 18: -#line 355 "src/wast-parser.y" /* yacc.c:1646 */ +#line 354 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.table) = new Table(); (yyval.table)->elem_limits = (yyvsp[-1].limits); } -#line 2610 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2585 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 19: -#line 361 "src/wast-parser.y" /* yacc.c:1646 */ +#line 360 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.memory) = new Memory(); (yyval.memory)->page_limits = (yyvsp[0].limits); } -#line 2619 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2594 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 20: -#line 367 "src/wast-parser.y" /* yacc.c:1646 */ +#line 366 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.limits).has_max = false; (yyval.limits).initial = (yyvsp[0].u64); (yyval.limits).max = 0; } -#line 2629 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2604 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 21: -#line 372 "src/wast-parser.y" /* yacc.c:1646 */ +#line 371 "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 2639 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2614 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 22: -#line 379 "src/wast-parser.y" /* yacc.c:1646 */ +#line 378 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.var) = (yyvsp[-1].var); } -#line 2645 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2620 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 23: -#line 385 "src/wast-parser.y" /* yacc.c:1646 */ +#line 384 "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)))) { @@ -2654,98 +2629,98 @@ yyreduce: WABT_PRINTF_STRING_SLICE_ARG((yyvsp[0].literal).text)); } } -#line 2658 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2633 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 24: -#line 396 "src/wast-parser.y" /* yacc.c:1646 */ +#line 395 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.literal).type = (yyvsp[0].literal).type; DUPTEXT((yyval.literal).text, (yyvsp[0].literal).text); } -#line 2667 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2642 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 25: -#line 400 "src/wast-parser.y" /* yacc.c:1646 */ +#line 399 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.literal).type = (yyvsp[0].literal).type; DUPTEXT((yyval.literal).text, (yyvsp[0].literal).text); } -#line 2676 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2651 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 26: -#line 404 "src/wast-parser.y" /* yacc.c:1646 */ +#line 403 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.literal).type = (yyvsp[0].literal).type; DUPTEXT((yyval.literal).text, (yyvsp[0].literal).text); } -#line 2685 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2660 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 27: -#line 411 "src/wast-parser.y" /* yacc.c:1646 */ +#line 410 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.var) = new Var((yyvsp[0].u64)); (yyval.var)->loc = (yylsp[0]); } -#line 2694 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2669 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 28: -#line 415 "src/wast-parser.y" /* yacc.c:1646 */ +#line 414 "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 2705 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2680 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 29: -#line 423 "src/wast-parser.y" /* yacc.c:1646 */ +#line 422 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.vars) = new VarVector(); } -#line 2711 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2686 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 30: -#line 424 "src/wast-parser.y" /* yacc.c:1646 */ +#line 423 "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 2721 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2696 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 31: -#line 431 "src/wast-parser.y" /* yacc.c:1646 */ +#line 430 "src/wast-parser.y" /* yacc.c:1646 */ { WABT_ZERO_MEMORY((yyval.text)); } -#line 2727 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2702 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 33: -#line 435 "src/wast-parser.y" /* yacc.c:1646 */ +#line 434 "src/wast-parser.y" /* yacc.c:1646 */ { DUPTEXT((yyval.text), (yyvsp[0].text)); } -#line 2733 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2708 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 34: -#line 439 "src/wast-parser.y" /* yacc.c:1646 */ +#line 438 "src/wast-parser.y" /* yacc.c:1646 */ { WABT_ZERO_MEMORY((yyval.text)); } -#line 2739 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2714 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 36: -#line 444 "src/wast-parser.y" /* yacc.c:1646 */ +#line 443 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.u64) = 0; } -#line 2745 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2720 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 37: -#line 445 "src/wast-parser.y" /* yacc.c:1646 */ +#line 444 "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, @@ -2760,17 +2735,17 @@ yyreduce: } (yyval.u64) = static_cast<uint32_t>(offset64); } -#line 2764 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2739 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 38: -#line 461 "src/wast-parser.y" /* yacc.c:1646 */ +#line 460 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.u32) = USE_NATURAL_ALIGNMENT; } -#line 2770 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2745 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 39: -#line 462 "src/wast-parser.y" /* yacc.c:1646 */ +#line 461 "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))) { @@ -2783,169 +2758,169 @@ yyreduce: wast_parser_error(&(yylsp[0]), lexer, parser, "alignment must be power-of-two"); } } -#line 2787 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2762 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 40: -#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 2793 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2768 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 41: -#line 478 "src/wast-parser.y" /* yacc.c:1646 */ +#line 477 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr_list) = join_exprs1(&(yylsp[0]), (yyvsp[0].expr)); } -#line 2799 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2774 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 43: -#line 483 "src/wast-parser.y" /* yacc.c:1646 */ +#line 482 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateUnreachable(); } -#line 2807 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2782 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 44: -#line 486 "src/wast-parser.y" /* yacc.c:1646 */ +#line 485 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateNop(); } -#line 2815 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2790 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 45: -#line 489 "src/wast-parser.y" /* yacc.c:1646 */ +#line 488 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateDrop(); } -#line 2823 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2798 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 46: -#line 492 "src/wast-parser.y" /* yacc.c:1646 */ +#line 491 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateSelect(); } -#line 2831 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2806 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 47: -#line 495 "src/wast-parser.y" /* yacc.c:1646 */ +#line 494 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateBr(std::move(*(yyvsp[0].var))); delete (yyvsp[0].var); } -#line 2840 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2815 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 48: -#line 499 "src/wast-parser.y" /* yacc.c:1646 */ +#line 498 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateBrIf(std::move(*(yyvsp[0].var))); delete (yyvsp[0].var); } -#line 2849 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2824 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 49: -#line 503 "src/wast-parser.y" /* yacc.c:1646 */ +#line 502 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateBrTable((yyvsp[-1].vars), std::move(*(yyvsp[0].var))); delete (yyvsp[0].var); } -#line 2858 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2833 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 50: -#line 507 "src/wast-parser.y" /* yacc.c:1646 */ +#line 506 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateReturn(); } -#line 2866 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2841 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 51: -#line 510 "src/wast-parser.y" /* yacc.c:1646 */ +#line 509 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateCall(std::move(*(yyvsp[0].var))); delete (yyvsp[0].var); } -#line 2875 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2850 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 52: -#line 514 "src/wast-parser.y" /* yacc.c:1646 */ +#line 513 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateCallIndirect(std::move(*(yyvsp[0].var))); delete (yyvsp[0].var); } -#line 2884 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2859 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 53: -#line 518 "src/wast-parser.y" /* yacc.c:1646 */ +#line 517 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateGetLocal(std::move(*(yyvsp[0].var))); delete (yyvsp[0].var); } -#line 2893 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2868 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 54: -#line 522 "src/wast-parser.y" /* yacc.c:1646 */ +#line 521 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateSetLocal(std::move(*(yyvsp[0].var))); delete (yyvsp[0].var); } -#line 2902 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2877 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 55: -#line 526 "src/wast-parser.y" /* yacc.c:1646 */ +#line 525 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateTeeLocal(std::move(*(yyvsp[0].var))); delete (yyvsp[0].var); } -#line 2911 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2886 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 56: -#line 530 "src/wast-parser.y" /* yacc.c:1646 */ +#line 529 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateGetGlobal(std::move(*(yyvsp[0].var))); delete (yyvsp[0].var); } -#line 2920 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2895 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 57: -#line 534 "src/wast-parser.y" /* yacc.c:1646 */ +#line 533 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateSetGlobal(std::move(*(yyvsp[0].var))); delete (yyvsp[0].var); } -#line 2929 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2904 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 58: -#line 538 "src/wast-parser.y" /* yacc.c:1646 */ +#line 537 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateLoad((yyvsp[-2].opcode), (yyvsp[0].u32), (yyvsp[-1].u64)); } -#line 2937 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2912 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 59: -#line 541 "src/wast-parser.y" /* yacc.c:1646 */ +#line 540 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateStore((yyvsp[-2].opcode), (yyvsp[0].u32), (yyvsp[-1].u64)); } -#line 2945 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2920 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 60: -#line 544 "src/wast-parser.y" /* yacc.c:1646 */ +#line 543 "src/wast-parser.y" /* yacc.c:1646 */ { Const const_; WABT_ZERO_MEMORY(const_); @@ -2959,130 +2934,131 @@ yyreduce: delete [] (yyvsp[0].literal).text.start; (yyval.expr) = Expr::CreateConst(const_); } -#line 2963 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2938 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 61: -#line 557 "src/wast-parser.y" /* yacc.c:1646 */ +#line 556 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateUnary((yyvsp[0].opcode)); } -#line 2971 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2946 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 62: -#line 560 "src/wast-parser.y" /* yacc.c:1646 */ +#line 559 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateBinary((yyvsp[0].opcode)); } -#line 2979 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2954 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 63: -#line 563 "src/wast-parser.y" /* yacc.c:1646 */ +#line 562 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateCompare((yyvsp[0].opcode)); } -#line 2987 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2962 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 64: -#line 566 "src/wast-parser.y" /* yacc.c:1646 */ +#line 565 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateConvert((yyvsp[0].opcode)); } -#line 2995 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2970 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 65: -#line 569 "src/wast-parser.y" /* yacc.c:1646 */ +#line 568 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateCurrentMemory(); } -#line 3003 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2978 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 66: -#line 572 "src/wast-parser.y" /* yacc.c:1646 */ +#line 571 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateGrowMemory(); } -#line 3011 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2986 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 67: -#line 575 "src/wast-parser.y" /* yacc.c:1646 */ +#line 574 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateThrow(std::move(*(yyvsp[0].var))); delete (yyvsp[0].var); } -#line 3020 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2995 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 68: -#line 579 "src/wast-parser.y" /* yacc.c:1646 */ +#line 578 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateRethrow(std::move(*(yyvsp[0].var))); delete (yyvsp[0].var); } -#line 3029 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3004 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 69: -#line 586 "src/wast-parser.y" /* yacc.c:1646 */ +#line 585 "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)); } -#line 3039 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3014 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 70: -#line 591 "src/wast-parser.y" /* yacc.c:1646 */ +#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)); } -#line 3049 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3024 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 71: -#line 596 "src/wast-parser.y" /* yacc.c:1646 */ +#line 595 "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)); } -#line 3059 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3034 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 72: -#line 601 "src/wast-parser.y" /* yacc.c:1646 */ +#line 600 "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)); } -#line 3070 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3045 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 73: -#line 607 "src/wast-parser.y" /* yacc.c:1646 */ +#line 606 "src/wast-parser.y" /* yacc.c:1646 */ { (yyvsp[-3].block)->label = (yyvsp[-4].text); - (yyval.expr) = Expr::CreateTry((yyvsp[-3].block), (yyvsp[-2].expr_list).first); + (yyval.expr) = (yyvsp[-2].expr); + (yyval.expr)->try_block.block = (yyvsp[-3].block); CHECK_END_LABEL((yylsp[0]), (yyvsp[-3].block)->label, (yyvsp[0].text)); } -#line 3080 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3056 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 74: #line 615 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.types) = (yyvsp[-1].types); } -#line 3086 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3062 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 75: @@ -3092,7 +3068,7 @@ yyreduce: (yyval.block)->sig.insert((yyval.block)->sig.end(), (yyvsp[-1].types)->begin(), (yyvsp[-1].types)->end()); delete (yyvsp[-1].types); } -#line 3096 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3072 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 76: @@ -3101,135 +3077,155 @@ yyreduce: (yyval.block) = new Block(); (yyval.block)->first = (yyvsp[0].expr_list).first; } -#line 3105 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3081 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 77: #line 630 "src/wast-parser.y" /* yacc.c:1646 */ { - Expr* expr = Expr::CreateCatch(std::move(*(yyvsp[-1].var)), (yyvsp[0].expr_list).first); + (yyval.catch_) = new Catch(std::move(*(yyvsp[-1].var)), (yyvsp[0].expr_list).first); + (yyval.catch_)->loc = (yylsp[-2]); delete (yyvsp[-1].var); - (yyval.expr_list) = join_exprs1(&(yylsp[-2]), expr); } -#line 3115 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3091 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 78: #line 637 "src/wast-parser.y" /* yacc.c:1646 */ { - Expr* expr = Expr::CreateCatchAll((yyvsp[0].expr_list).first); - (yyval.expr_list) = join_exprs1(&(yylsp[-1]), expr); + (yyval.catch_) = new Catch((yyvsp[0].expr_list).first); + (yyval.catch_)->loc = (yylsp[-1]); } -#line 3124 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3100 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 81: +#line 649 "src/wast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr) = Expr::CreateTry(); + (yyval.expr)->try_block.catches->push_back((yyvsp[0].catch_)); + } +#line 3109 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 82: -#line 650 "src/wast-parser.y" /* yacc.c:1646 */ +#line 653 "src/wast-parser.y" /* yacc.c:1646 */ { - (yyval.expr_list) = join_expr_lists(&(yyvsp[-1].expr_list), &(yyvsp[0].expr_list)); + (yyval.expr) = (yyvsp[-1].expr); + (yyval.expr)->try_block.catches->push_back((yyvsp[0].catch_)); } -#line 3132 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3118 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 83: -#line 656 "src/wast-parser.y" /* yacc.c:1646 */ +#line 660 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr_list) = (yyvsp[-1].expr_list); } -#line 3138 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3124 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 84: -#line 660 "src/wast-parser.y" /* yacc.c:1646 */ +#line 664 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr_list) = join_exprs2(&(yylsp[-1]), &(yyvsp[0].expr_list), (yyvsp[-1].expr)); } -#line 3146 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3132 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 85: -#line 663 "src/wast-parser.y" /* yacc.c:1646 */ +#line 667 "src/wast-parser.y" /* yacc.c:1646 */ { Expr* expr = Expr::CreateBlock((yyvsp[0].block)); expr->block->label = (yyvsp[-1].text); (yyval.expr_list) = join_exprs1(&(yylsp[-2]), expr); } -#line 3156 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3142 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 86: -#line 668 "src/wast-parser.y" /* yacc.c:1646 */ +#line 672 "src/wast-parser.y" /* yacc.c:1646 */ { Expr* expr = Expr::CreateLoop((yyvsp[0].block)); expr->loop->label = (yyvsp[-1].text); (yyval.expr_list) = join_exprs1(&(yylsp[-2]), expr); } -#line 3166 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3152 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 87: -#line 673 "src/wast-parser.y" /* yacc.c:1646 */ +#line 677 "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); } -#line 3177 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3163 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 88: -#line 679 "src/wast-parser.y" /* yacc.c:1646 */ +#line 683 "src/wast-parser.y" /* yacc.c:1646 */ { Block* block = (yyvsp[0].expr)->try_block.block; block->label = (yyvsp[-1].text); (yyval.expr_list) = join_exprs1(&(yylsp[-2]), (yyvsp[0].expr)); } -#line 3187 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3173 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 89: -#line 687 "src/wast-parser.y" /* yacc.c:1646 */ +#line 691 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = (yyvsp[0].expr); Block* block = (yyval.expr)->try_block.block; block->sig.insert(block->sig.end(), (yyvsp[-1].types)->begin(), (yyvsp[-1].types)->end()); delete (yyvsp[-1].types); } -#line 3198 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3184 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 90: -#line 693 "src/wast-parser.y" /* yacc.c:1646 */ +#line 697 "src/wast-parser.y" /* yacc.c:1646 */ { Block* block = new Block(); block->first = (yyvsp[-1].expr_list).first; - (yyval.expr) = Expr::CreateTry(block, (yyvsp[0].expr_list).first); + (yyval.expr) = (yyvsp[0].expr); + (yyval.expr)->try_block.block = block; } -#line 3208 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3195 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 91: -#line 701 "src/wast-parser.y" /* yacc.c:1646 */ +#line 706 "src/wast-parser.y" /* yacc.c:1646 */ { - (yyval.expr_list) = (yyvsp[-1].expr_list); + (yyval.catch_) = (yyvsp[-1].catch_); } -#line 3216 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3203 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 92: -#line 704 "src/wast-parser.y" /* yacc.c:1646 */ +#line 709 "src/wast-parser.y" /* yacc.c:1646 */ { - (yyval.expr_list) = (yyvsp[-1].expr_list); + (yyval.catch_) = (yyvsp[-1].catch_); } -#line 3224 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3211 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ + break; + + case 93: +#line 715 "src/wast-parser.y" /* yacc.c:1646 */ + { + (yyval.expr) = Expr::CreateTry(); + (yyval.expr)->try_block.catches->push_back((yyvsp[0].catch_)); + } +#line 3220 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 94: #line 719 "src/wast-parser.y" /* yacc.c:1646 */ { - (yyval.expr_list) = (yyvsp[-1].expr_list); - append_expr_list(&(yyvsp[-1].expr_list), &(yyvsp[0].expr_list)); + (yyval.expr) = (yyvsp[-1].expr); + (yyval.expr)->try_block.catches->push_back((yyvsp[0].catch_)); } -#line 3233 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3229 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 95: @@ -3242,7 +3238,7 @@ yyreduce: true_->sig.insert(true_->sig.end(), (yyvsp[-1].types)->begin(), (yyvsp[-1].types)->end()); delete (yyvsp[-1].types); } -#line 3246 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3242 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 97: @@ -3251,7 +3247,7 @@ yyreduce: Expr* expr = Expr::CreateIf(new Block((yyvsp[-5].expr_list).first), (yyvsp[-1].expr_list).first); (yyval.expr_list) = join_exprs1(&(yylsp[-7]), expr); } -#line 3255 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3251 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 98: @@ -3260,7 +3256,7 @@ yyreduce: Expr* expr = Expr::CreateIf(new Block((yyvsp[-1].expr_list).first), nullptr); (yyval.expr_list) = join_exprs1(&(yylsp[-3]), expr); } -#line 3264 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3260 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 99: @@ -3269,7 +3265,7 @@ yyreduce: Expr* expr = Expr::CreateIf(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 3273 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3269 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 100: @@ -3278,7 +3274,7 @@ yyreduce: Expr* expr = Expr::CreateIf(new Block((yyvsp[-1].expr_list).first), nullptr); (yyval.expr_list) = join_exprs2(&(yylsp[-4]), &(yyvsp[-4].expr_list), expr); } -#line 3282 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3278 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 101: @@ -3287,7 +3283,7 @@ yyreduce: Expr* expr = Expr::CreateIf(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 3291 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3287 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 102: @@ -3296,7 +3292,7 @@ yyreduce: Expr* expr = Expr::CreateIf(new Block((yyvsp[0].expr_list).first), nullptr); (yyval.expr_list) = join_exprs2(&(yylsp[-1]), &(yyvsp[-1].expr_list), expr); } -#line 3300 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3296 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 103: @@ -3304,7 +3300,7 @@ yyreduce: { CHECK_ALLOW_EXCEPTIONS(&(yylsp[0]), "rethrow"); } -#line 3308 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3304 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 104: @@ -3312,7 +3308,7 @@ yyreduce: { CHECK_ALLOW_EXCEPTIONS(&(yylsp[0]), "throw"); } -#line 3316 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3312 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 105: @@ -3320,13 +3316,13 @@ yyreduce: { CHECK_ALLOW_EXCEPTIONS(&(yylsp[0]), "try"); } -#line 3324 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3320 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 106: #line 782 "src/wast-parser.y" /* yacc.c:1646 */ { WABT_ZERO_MEMORY((yyval.expr_list)); } -#line 3330 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3326 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 107: @@ -3337,13 +3333,13 @@ yyreduce: (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 3341 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3337 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 108: #line 791 "src/wast-parser.y" /* yacc.c:1646 */ { WABT_ZERO_MEMORY((yyval.expr_list)); } -#line 3347 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3343 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 109: @@ -3354,7 +3350,7 @@ yyreduce: (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 3358 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3354 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 111: @@ -3365,7 +3361,7 @@ yyreduce: (yyval.exception)->sig = std::move(*(yyvsp[-1].types)); delete (yyvsp[-1].types); } -#line 3369 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3365 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 112: @@ -3375,7 +3371,7 @@ yyreduce: (yyval.module_field)->loc = (yylsp[0]); (yyval.module_field)->except = (yyvsp[0].exception); } -#line 3379 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3375 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 113: @@ -3391,7 +3387,7 @@ yyreduce: main->import->func->name = (yyvsp[-2].text); } } -#line 3395 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3391 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 114: @@ -3404,7 +3400,7 @@ yyreduce: delete (yyvsp[-1].var); (yyval.module_fields).first = (yyval.module_fields).last = field; } -#line 3408 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3404 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 115: @@ -3414,7 +3410,7 @@ yyreduce: field->func = (yyvsp[0].func); (yyval.module_fields).first = (yyval.module_fields).last = field; } -#line 3418 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3414 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 116: @@ -3430,7 +3426,7 @@ yyreduce: delete (yyvsp[-1].var); (yyval.module_fields).first = (yyval.module_fields).last = field; } -#line 3434 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3430 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 117: @@ -3443,7 +3439,7 @@ yyreduce: field->import->func = (yyvsp[0].func); (yyval.module_fields).first = (yyval.module_fields).last = field; } -#line 3447 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3443 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 118: @@ -3456,7 +3452,7 @@ yyreduce: (yyval.module_fields).first = (yyvsp[0].module_fields).first; (yyval.module_fields).last = (yyvsp[0].module_fields).last->next = field; } -#line 3460 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3456 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 119: @@ -3465,7 +3461,7 @@ yyreduce: (yyval.func) = (yyvsp[0].func); reverse_bindings(&(yyval.func)->decl.sig.param_types, &(yyval.func)->param_bindings); } -#line 3469 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3465 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 121: @@ -3476,7 +3472,7 @@ yyreduce: (yyvsp[-2].types)->begin(), (yyvsp[-2].types)->end()); delete (yyvsp[-2].types); } -#line 3480 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3476 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 122: @@ -3488,13 +3484,13 @@ 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 3492 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3488 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 123: #line 903 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.func) = new Func(); } -#line 3498 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3494 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 124: @@ -3505,7 +3501,7 @@ yyreduce: (yyvsp[-2].types)->begin(), (yyvsp[-2].types)->end()); delete (yyvsp[-2].types); } -#line 3509 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3505 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 125: @@ -3514,7 +3510,7 @@ yyreduce: (yyval.func) = (yyvsp[0].func); reverse_bindings(&(yyval.func)->decl.sig.param_types, &(yyval.func)->param_bindings); } -#line 3518 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3514 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 127: @@ -3525,7 +3521,7 @@ yyreduce: (yyvsp[-2].types)->begin(), (yyvsp[-2].types)->end()); delete (yyvsp[-2].types); } -#line 3529 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3525 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 128: @@ -3537,7 +3533,7 @@ 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 3541 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3537 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 130: @@ -3548,7 +3544,7 @@ yyreduce: (yyvsp[-2].types)->begin(), (yyvsp[-2].types)->end()); delete (yyvsp[-2].types); } -#line 3552 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3548 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 131: @@ -3557,7 +3553,7 @@ yyreduce: (yyval.func) = (yyvsp[0].func); reverse_bindings(&(yyval.func)->local_types, &(yyval.func)->local_bindings); } -#line 3561 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3557 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 132: @@ -3566,7 +3562,7 @@ yyreduce: (yyval.func) = new Func(); (yyval.func)->first_expr = (yyvsp[0].expr_list).first; } -#line 3570 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3566 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 133: @@ -3576,7 +3572,7 @@ yyreduce: (yyval.func)->local_types.insert((yyval.func)->local_types.begin(), (yyvsp[-2].types)->begin(), (yyvsp[-2].types)->end()); delete (yyvsp[-2].types); } -#line 3580 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3576 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 134: @@ -3588,7 +3584,7 @@ yyreduce: destroy_string_slice(&(yyvsp[-3].text)); (yyval.func)->local_types.insert((yyval.func)->local_types.begin(), (yyvsp[-2].type)); } -#line 3592 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3588 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 135: @@ -3596,7 +3592,7 @@ yyreduce: { (yyval.expr_list) = (yyvsp[-1].expr_list); } -#line 3600 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3596 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 137: @@ -3611,7 +3607,7 @@ yyreduce: (yyval.module_field)->elem_segment->vars = std::move(*(yyvsp[-1].vars)); delete (yyvsp[-1].vars); } -#line 3615 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3611 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 138: @@ -3627,7 +3623,7 @@ yyreduce: (yyval.module_field)->elem_segment->vars = std::move(*(yyvsp[-1].vars)); delete (yyvsp[-1].vars); } -#line 3631 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3627 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 139: @@ -3643,7 +3639,7 @@ yyreduce: main->import->table->name = (yyvsp[-2].text); } } -#line 3647 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3643 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 140: @@ -3654,7 +3650,7 @@ yyreduce: field->table = (yyvsp[0].table); (yyval.module_fields).first = (yyval.module_fields).last = field; } -#line 3658 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3654 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 141: @@ -3667,7 +3663,7 @@ yyreduce: field->import->table = (yyvsp[0].table); (yyval.module_fields).first = (yyval.module_fields).last = field; } -#line 3671 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3667 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 142: @@ -3680,7 +3676,7 @@ yyreduce: (yyval.module_fields).first = (yyvsp[0].module_fields).first; (yyval.module_fields).last = (yyvsp[0].module_fields).last->next = field; } -#line 3684 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3680 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 143: @@ -3702,7 +3698,7 @@ yyreduce: (yyval.module_fields).first = table_field; (yyval.module_fields).last = table_field->next = elem_field; } -#line 3706 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3702 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 144: @@ -3717,7 +3713,7 @@ 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 3721 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3717 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 145: @@ -3733,7 +3729,7 @@ 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 3737 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3733 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 146: @@ -3749,7 +3745,7 @@ yyreduce: main->import->memory->name = (yyvsp[-2].text); } } -#line 3753 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3749 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 147: @@ -3759,7 +3755,7 @@ yyreduce: field->memory = (yyvsp[0].memory); (yyval.module_fields).first = (yyval.module_fields).last = field; } -#line 3763 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3759 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 148: @@ -3772,7 +3768,7 @@ yyreduce: field->import->memory = (yyvsp[0].memory); (yyval.module_fields).first = (yyval.module_fields).last = field; } -#line 3776 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3772 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 149: @@ -3785,7 +3781,7 @@ yyreduce: (yyval.module_fields).first = (yyvsp[0].module_fields).first; (yyval.module_fields).last = (yyvsp[0].module_fields).last->next = field; } -#line 3789 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3785 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 150: @@ -3811,7 +3807,7 @@ yyreduce: (yyval.module_fields).first = memory_field; (yyval.module_fields).last = memory_field->next = data_field; } -#line 3815 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3811 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 151: @@ -3827,7 +3823,7 @@ yyreduce: main->import->global->name = (yyvsp[-2].text); } } -#line 3831 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3827 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 152: @@ -3838,7 +3834,7 @@ yyreduce: field->global->init_expr = (yyvsp[0].expr_list).first; (yyval.module_fields).first = (yyval.module_fields).last = field; } -#line 3842 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3838 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 153: @@ -3851,7 +3847,7 @@ yyreduce: field->import->global = (yyvsp[0].global); (yyval.module_fields).first = (yyval.module_fields).last = field; } -#line 3855 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3851 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 154: @@ -3864,7 +3860,7 @@ yyreduce: (yyval.module_fields).first = (yyvsp[0].module_fields).first; (yyval.module_fields).last = (yyvsp[0].module_fields).last->next = field; } -#line 3868 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3864 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 155: @@ -3878,7 +3874,7 @@ yyreduce: (yyval.import)->func->decl.type_var = std::move(*(yyvsp[-1].var)); delete (yyvsp[-1].var); } -#line 3882 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3878 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 156: @@ -3891,7 +3887,7 @@ yyreduce: (yyval.import)->func->decl.sig = std::move(*(yyvsp[-1].func_sig)); delete (yyvsp[-1].func_sig); } -#line 3895 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3891 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 157: @@ -3902,7 +3898,7 @@ yyreduce: (yyval.import)->table = (yyvsp[-1].table); (yyval.import)->table->name = (yyvsp[-2].text); } -#line 3906 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3902 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 158: @@ -3913,7 +3909,7 @@ yyreduce: (yyval.import)->memory = (yyvsp[-1].memory); (yyval.import)->memory->name = (yyvsp[-2].text); } -#line 3917 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3913 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 159: @@ -3924,7 +3920,7 @@ yyreduce: (yyval.import)->global = (yyvsp[-1].global); (yyval.import)->global->name = (yyvsp[-2].text); } -#line 3928 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3924 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 160: @@ -3934,7 +3930,7 @@ yyreduce: (yyval.import)->kind = ExternalKind::Except; (yyval.import)->except = (yyvsp[0].exception); } -#line 3938 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3934 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 161: @@ -3946,7 +3942,7 @@ yyreduce: (yyval.module_field)->import->module_name = (yyvsp[-3].text); (yyval.module_field)->import->field_name = (yyvsp[-2].text); } -#line 3950 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3946 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 162: @@ -3956,7 +3952,7 @@ yyreduce: (yyval.import)->module_name = (yyvsp[-2].text); (yyval.import)->field_name = (yyvsp[-1].text); } -#line 3960 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3956 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 163: @@ -3967,7 +3963,7 @@ yyreduce: (yyval.export_)->var = std::move(*(yyvsp[-1].var)); delete (yyvsp[-1].var); } -#line 3971 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3967 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 164: @@ -3978,7 +3974,7 @@ yyreduce: (yyval.export_)->var = std::move(*(yyvsp[-1].var)); delete (yyvsp[-1].var); } -#line 3982 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3978 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 165: @@ -3989,7 +3985,7 @@ yyreduce: (yyval.export_)->var = std::move(*(yyvsp[-1].var)); delete (yyvsp[-1].var); } -#line 3993 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3989 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 166: @@ -4000,7 +3996,7 @@ yyreduce: (yyval.export_)->var = std::move(*(yyvsp[-1].var)); delete (yyvsp[-1].var); } -#line 4004 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4000 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 167: @@ -4011,7 +4007,7 @@ yyreduce: (yyval.export_)->var = std::move(*(yyvsp[-1].var)); delete (yyvsp[-1].var); } -#line 4015 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4011 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 168: @@ -4022,7 +4018,7 @@ yyreduce: (yyval.module_field)->export_ = (yyvsp[-1].export_); (yyval.module_field)->export_->name = (yyvsp[-2].text); } -#line 4026 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4022 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 169: @@ -4031,7 +4027,7 @@ yyreduce: (yyval.export_) = new Export(); (yyval.export_)->name = (yyvsp[-1].text); } -#line 4035 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4031 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 170: @@ -4043,7 +4039,7 @@ yyreduce: (yyval.module_field)->func_type->sig = std::move(*(yyvsp[-1].func_sig)); delete (yyvsp[-1].func_sig); } -#line 4047 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4043 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 171: @@ -4056,7 +4052,7 @@ yyreduce: (yyval.module_field)->func_type->sig = std::move(*(yyvsp[-1].func_sig)); delete (yyvsp[-1].func_sig); } -#line 4060 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4056 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 172: @@ -4067,55 +4063,55 @@ yyreduce: (yyval.module_field)->start = std::move(*(yyvsp[-1].var)); delete (yyvsp[-1].var); } -#line 4071 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4067 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 173: #line 1325 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_fields).first = (yyval.module_fields).last = (yyvsp[0].module_field); } -#line 4077 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4073 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 178: #line 1330 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_fields).first = (yyval.module_fields).last = (yyvsp[0].module_field); } -#line 4083 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4079 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 179: #line 1331 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_fields).first = (yyval.module_fields).last = (yyvsp[0].module_field); } -#line 4089 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4085 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 180: #line 1332 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_fields).first = (yyval.module_fields).last = (yyvsp[0].module_field); } -#line 4095 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4091 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 181: #line 1333 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_fields).first = (yyval.module_fields).last = (yyvsp[0].module_field); } -#line 4101 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4097 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 182: #line 1334 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_fields).first = (yyval.module_fields).last = (yyvsp[0].module_field); } -#line 4107 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4103 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 183: #line 1335 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_fields).first = (yyval.module_fields).last = (yyvsp[0].module_field); } -#line 4113 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4109 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 184: #line 1339 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module) = new Module(); } -#line 4119 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4115 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 186: @@ -4125,7 +4121,7 @@ yyreduce: 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 4129 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4125 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 187: @@ -4135,7 +4131,7 @@ yyreduce: 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 4139 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4135 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 188: @@ -4157,7 +4153,7 @@ yyreduce: } delete (yyvsp[0].script_module); } -#line 4161 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4157 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 190: @@ -4165,7 +4161,7 @@ yyreduce: { (yyval.var) = new Var(kInvalidIndex); } -#line 4169 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4165 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 191: @@ -4175,7 +4171,7 @@ yyreduce: DUPTEXT(name, (yyvsp[0].text)); (yyval.var) = new Var(name); } -#line 4179 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4175 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 192: @@ -4198,7 +4194,7 @@ yyreduce: } } } -#line 4202 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4198 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 193: @@ -4211,7 +4207,7 @@ 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 4215 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4211 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 194: @@ -4224,7 +4220,7 @@ 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 4228 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4224 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 195: @@ -4240,7 +4236,7 @@ yyreduce: (yyval.action)->invoke->args = std::move(*(yyvsp[-1].consts)); delete (yyvsp[-1].consts); } -#line 4244 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4240 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 196: @@ -4253,7 +4249,7 @@ yyreduce: (yyval.action)->type = ActionType::Get; (yyval.action)->name = (yyvsp[-1].text); } -#line 4257 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4253 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 197: @@ -4264,7 +4260,7 @@ yyreduce: (yyval.command)->assert_malformed.module = (yyvsp[-2].script_module); (yyval.command)->assert_malformed.text = (yyvsp[-1].text); } -#line 4268 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4264 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 198: @@ -4275,7 +4271,7 @@ yyreduce: (yyval.command)->assert_invalid.module = (yyvsp[-2].script_module); (yyval.command)->assert_invalid.text = (yyvsp[-1].text); } -#line 4279 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4275 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 199: @@ -4286,7 +4282,7 @@ yyreduce: (yyval.command)->assert_unlinkable.module = (yyvsp[-2].script_module); (yyval.command)->assert_unlinkable.text = (yyvsp[-1].text); } -#line 4290 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4286 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 200: @@ -4297,7 +4293,7 @@ yyreduce: (yyval.command)->assert_uninstantiable.module = (yyvsp[-2].script_module); (yyval.command)->assert_uninstantiable.text = (yyvsp[-1].text); } -#line 4301 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4297 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 201: @@ -4308,7 +4304,7 @@ yyreduce: (yyval.command)->assert_return.action = (yyvsp[-2].action); (yyval.command)->assert_return.expected = (yyvsp[-1].consts); } -#line 4312 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4308 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 202: @@ -4318,7 +4314,7 @@ yyreduce: (yyval.command)->type = CommandType::AssertReturnCanonicalNan; (yyval.command)->assert_return_canonical_nan.action = (yyvsp[-1].action); } -#line 4322 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4318 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 203: @@ -4328,7 +4324,7 @@ yyreduce: (yyval.command)->type = CommandType::AssertReturnArithmeticNan; (yyval.command)->assert_return_arithmetic_nan.action = (yyvsp[-1].action); } -#line 4332 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4328 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 204: @@ -4339,7 +4335,7 @@ yyreduce: (yyval.command)->assert_trap.action = (yyvsp[-2].action); (yyval.command)->assert_trap.text = (yyvsp[-1].text); } -#line 4343 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4339 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 205: @@ -4350,7 +4346,7 @@ yyreduce: (yyval.command)->assert_trap.action = (yyvsp[-2].action); (yyval.command)->assert_trap.text = (yyvsp[-1].text); } -#line 4354 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4350 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 206: @@ -4360,7 +4356,7 @@ yyreduce: (yyval.command)->type = CommandType::Action; (yyval.command)->action = (yyvsp[0].action); } -#line 4364 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4360 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 208: @@ -4370,7 +4366,7 @@ yyreduce: (yyval.command)->type = CommandType::Module; (yyval.command)->module = (yyvsp[0].module); } -#line 4374 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4370 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 209: @@ -4383,7 +4379,7 @@ yyreduce: delete (yyvsp[-1].var); (yyval.command)->register_.var.loc = (yylsp[-1]); } -#line 4387 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4383 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 210: @@ -4392,7 +4388,7 @@ yyreduce: (yyval.commands) = new CommandPtrVector(); (yyval.commands)->emplace_back((yyvsp[0].command)); } -#line 4396 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4392 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 211: @@ -4401,7 +4397,7 @@ yyreduce: (yyval.commands) = (yyvsp[-1].commands); (yyval.commands)->emplace_back((yyvsp[0].command)); } -#line 4405 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4401 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 212: @@ -4416,13 +4412,13 @@ yyreduce: } delete [] (yyvsp[-1].literal).text.start; } -#line 4420 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4416 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 213: #line 1553 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.consts) = new ConstVector(); } -#line 4426 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4422 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 214: @@ -4431,7 +4427,7 @@ yyreduce: (yyval.consts) = (yyvsp[-1].consts); (yyval.consts)->push_back((yyvsp[0].const_)); } -#line 4435 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4431 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 215: @@ -4439,7 +4435,7 @@ yyreduce: { (yyval.script) = new Script(); } -#line 4443 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4439 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 216: @@ -4504,7 +4500,7 @@ yyreduce: } } } -#line 4508 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4504 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 217: @@ -4516,17 +4512,17 @@ yyreduce: command->module = (yyvsp[0].module); (yyval.script)->commands.emplace_back(command); } -#line 4520 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4516 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 218: #line 1636 "src/wast-parser.y" /* yacc.c:1646 */ { parser->script = (yyvsp[0].script); } -#line 4526 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4522 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; -#line 4530 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4526 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ default: break; } /* User semantic actions sometimes alter yychar, and that requires @@ -4801,14 +4797,6 @@ ExprList join_exprs2(Location* loc, ExprList* expr1, Expr* expr2) { return result; } -ExprList join_expr_lists(ExprList* expr1, ExprList* expr2) { - ExprList result; - WABT_ZERO_MEMORY(result); - append_expr_list(&result, expr1); - append_expr_list(&result, expr2); - return result; -} - Result parse_const(Type type, LiteralType literal_type, const char* s, @@ -5008,7 +4996,7 @@ void append_module_fields(Module* module, ModuleField* first) { name = &field->import->except->name; bindings = &module->except_bindings; index = module->excepts.size(); - module->excepts.push_back(field->except); + module->excepts.push_back(field->import->except); ++module->num_except_imports; break; } diff --git a/src/prebuilt/wast-parser-gen.output b/src/prebuilt/wast-parser-gen.output index 06470897..ebfabe54 100644 --- a/src/prebuilt/wast-parser-gen.output +++ b/src/prebuilt/wast-parser-gen.output @@ -112,7 +112,7 @@ Grammar 79 | plain_catch_all 80 catch_instr_list: catch_instr - 81 | catch_instr catch_instr_list + 81 | catch_instr_list catch_instr 82 expr: "(" expr1 ")" @@ -5071,24 +5071,22 @@ State 375 State 376 80 catch_instr_list: catch_instr . - 81 | catch_instr . catch_instr_list - - CATCH shift, and go to state 372 - CATCH_ALL shift, and go to state 373 $default reduce using rule 80 (catch_instr_list) - plain_catch go to state 374 - plain_catch_all go to state 375 - catch_instr go to state 376 - catch_instr_list go to state 421 - State 377 72 block_instr: try_check labeling_opt block catch_instr_list . END labeling_opt + 81 catch_instr_list: catch_instr_list . catch_instr - END shift, and go to state 422 + END shift, and go to state 421 + CATCH shift, and go to state 372 + CATCH_ALL shift, and go to state 373 + + plain_catch go to state 374 + plain_catch_all go to state 375 + catch_instr go to state 422 State 378 @@ -5766,13 +5764,6 @@ State 420 State 421 - 81 catch_instr_list: catch_instr catch_instr_list . - - $default reduce using rule 81 (catch_instr_list) - - -State 422 - 72 block_instr: try_check labeling_opt block catch_instr_list END . labeling_opt VAR shift, and go to state 53 @@ -5783,6 +5774,13 @@ State 422 labeling_opt go to state 448 +State 422 + + 81 catch_instr_list: catch_instr_list catch_instr . + + $default reduce using rule 81 (catch_instr_list) + + State 423 120 func_fields_import1: "(" PARAM value_type_list ")" . func_fields_import1 diff --git a/src/resolve-names.cc b/src/resolve-names.cc index a55ec3c9..fe47ad38 100644 --- a/src/resolve-names.cc +++ b/src/resolve-names.cc @@ -46,6 +46,7 @@ class NameResolver : public ExprVisitor::DelegateNop { 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; @@ -55,6 +56,10 @@ class NameResolver : public ExprVisitor::DelegateNop { 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; private: void PrintError(const Location* loc, const char* fmt, ...); @@ -68,6 +73,7 @@ class NameResolver : public ExprVisitor::DelegateNop { void ResolveFuncTypeVar(Var* var); void ResolveTableVar(Var* var); void ResolveMemoryVar(Var* var); + void ResolveExceptionVar(Var* var); void ResolveLocalVar(Var* var); void VisitFunc(Func* func); void VisitExport(Export* export_); @@ -181,6 +187,10 @@ void NameResolver::ResolveMemoryVar(Var* var) { ResolveVar(¤t_module_->memory_bindings, var, "memory"); } +void NameResolver::ResolveExceptionVar(Var* var) { + ResolveVar(¤t_module_->except_bindings, var, "exception"); +} + void NameResolver::ResolveLocalVar(Var* var) { if (var->type == VarType::Name) { if (!current_func_) @@ -281,6 +291,34 @@ Result NameResolver::OnTeeLocalExpr(Expr* expr) { return Result::Ok; } +Result NameResolver::BeginTryExpr(Expr* expr) { + PushLabel(&expr->try_block.block->label); + return Result::Ok; +} + +Result NameResolver::EndTryExpr(Expr*) { + PopLabel(); + return Result::Ok; +} + +Result NameResolver::OnCatchExpr(Expr* expr, Catch* catch_) { + if (!catch_->IsCatchAll()) + ResolveExceptionVar(&catch_->var); + return Result::Ok; +} + +Result NameResolver::OnThrowExpr(Expr* expr) { + ResolveExceptionVar(&expr->throw_.var); + return Result::Ok; +} + +Result NameResolver::OnRethrowExpr(Expr* expr) { + // Note: the variable refers to corresponding (enclosing) catch, using the try + // block label for context. + ResolveLabelVar(&expr->rethrow_.var); + return Result::Ok; +} + void NameResolver::VisitFunc(Func* func) { current_func_ = func; if (func->decl.has_func_type) @@ -312,7 +350,7 @@ void NameResolver::VisitExport(Export* export_) { break; case ExternalKind::Except: - WABT_FATAL("NameResolver::VisitExport(except) not defined\n"); + ResolveExceptionVar(&export_->var); break; } } @@ -340,6 +378,7 @@ Result NameResolver::VisitModule(Module* module) { CheckDuplicateBindings(&module->func_type_bindings, "function type"); CheckDuplicateBindings(&module->table_bindings, "table"); CheckDuplicateBindings(&module->memory_bindings, "memory"); + CheckDuplicateBindings(&module->except_bindings, "except"); for (Func* func : module->funcs) VisitFunc(func); diff --git a/src/tools/wast-desugar.cc b/src/tools/wast-desugar.cc index 55caf7d0..6103066f 100644 --- a/src/tools/wast-desugar.cc +++ b/src/tools/wast-desugar.cc @@ -38,6 +38,7 @@ static const char* s_infile; static const char* s_outfile; static WriteWatOptions s_write_wat_options; static bool s_generate_names; +static WastParseOptions s_parse_options; static const char s_description[] = R"( read a file in the wasm s-expression format and format it. @@ -59,8 +60,13 @@ static void parse_options(int argc, char** argv) { parser.AddHelpOption(); parser.AddOption('o', "output", "FILE", "Output file for the formatted file", [](const char* argument) { s_outfile = argument; }); + parser.AddOption("debug-parser", "Turn on debugging the parser of wast files", + []() { s_parse_options.debug_parsing = true; }); parser.AddOption('f', "fold-exprs", "Write folded expressions where possible", []() { s_write_wat_options.fold_exprs = true; }); + parser.AddOption("future-exceptions", + "Test future extension for exception handling", + []() { s_parse_options.allow_future_exceptions = true; }); parser.AddOption( "generate-names", "Give auto-generated names to non-named functions, types, etc.", @@ -81,7 +87,8 @@ int ProgramMain(int argc, char** argv) { SourceErrorHandlerFile error_handler; Script* script; - Result result = parse_wast(lexer.get(), &script, &error_handler); + Result result = parse_wast(lexer.get(), &script, &error_handler, + &s_parse_options); if (WABT_SUCCEEDED(result)) { Module* module = script->GetFirstModule(); diff --git a/src/tools/wast2wasm.cc b/src/tools/wast2wasm.cc index 5ff77df2..96eca46b 100644 --- a/src/tools/wast2wasm.cc +++ b/src/tools/wast2wasm.cc @@ -85,7 +85,7 @@ static void parse_options(int argc, char* argv[]) { []() { s_dump_module = true; }); parser.AddOption("future-exceptions", "Test future extension for exception handling", - []() { s_parse_options.allow_exceptions = true; }); + []() { s_parse_options.allow_future_exceptions = true; }); parser.AddOption('o', "output", "FILE", "output wasm binary file", [](const char* argument) { s_outfile = argument; }); parser.AddOption( diff --git a/src/type-checker.cc b/src/type-checker.cc index 82971dc9..2881d391 100644 --- a/src/type-checker.cc +++ b/src/type-checker.cc @@ -344,6 +344,24 @@ Result TypeChecker::OnCompare(Opcode opcode) { return CheckOpcode2(opcode); } +Result TypeChecker::OnCatch(const TypeVector* sig) { + PushTypes(*sig); + return Result::Ok; +} + +Result TypeChecker::OnCatchBlock(const TypeVector* sig) { + Result result = Result::Ok; + Label* label; + CHECK_RESULT(TopLabel(&label)); + COMBINE_RESULT(result, CheckLabelType(label, LabelType::Try)); + COMBINE_RESULT(result, PopAndCheckSignature(label->sig, "try block")); + COMBINE_RESULT(result, CheckTypeStackEnd("try block")); + ResetTypeStackToLabel(label); + label->label_type = LabelType::Catch; + label->unreachable = false; + return result; +} + Result TypeChecker::OnConst(Type type) { PushType(type); return Result::Ok; @@ -394,7 +412,8 @@ Result TypeChecker::OnEnd(Label* label, Result TypeChecker::OnEnd() { Result result = Result::Ok; static const char* s_label_type_name[] = {"function", "block", "loop", "if", - "if false branch"}; + "if false branch", "try", + "try catch"}; WABT_STATIC_ASSERT(WABT_ARRAY_SIZE(s_label_type_name) == kLabelTypeCount); Label* label; CHECK_RESULT(TopLabel(&label)); @@ -439,6 +458,28 @@ Result TypeChecker::OnLoop(const TypeVector* sig) { return Result::Ok; } +Result TypeChecker::OnRethrow(Index depth) { + Result result = Result::Ok; + Label* label; + CHECK_RESULT(GetLabel(depth, &label)); + if (label->label_type != LabelType::Catch) { + // TODO(karlschimpf) Make this error more readable (readers + // typically think in terms of try/catch clauses, not all blocks). + PrintError("invalid rethrow depth: %" PRIindex " (max %" PRIzd ")", depth, + label_stack_.size() - 1); + result = Result::Error; + } + CHECK_RESULT(SetUnreachable()); + return result; +} + +Result TypeChecker::OnThrow(const TypeVector* sig) { + Result result = Result::Ok; + COMBINE_RESULT(result, PopAndCheckSignature(*sig, "throw")); + CHECK_RESULT(SetUnreachable()); + return result; +} + Result TypeChecker::OnReturn() { Result result = Result::Ok; Label* func_label; @@ -469,6 +510,11 @@ Result TypeChecker::OnStore(Opcode opcode) { return CheckOpcode2(opcode); } +Result TypeChecker::OnTryBlock(const TypeVector* sig) { + PushLabel(LabelType::Try, *sig); + return Result::Ok; +} + Result TypeChecker::OnTeeLocal(Type type) { Result result = Result::Ok; Type value = Type::Any; diff --git a/src/type-checker.h b/src/type-checker.h index f7238365..849c701d 100644 --- a/src/type-checker.h +++ b/src/type-checker.h @@ -61,6 +61,8 @@ class TypeChecker { Result OnCall(const TypeVector* param_types, const TypeVector* result_types); Result OnCallIndirect(const TypeVector* param_types, const TypeVector* result_types); + Result OnCatch(const TypeVector* sig); + Result OnCatchBlock(const TypeVector* sig); Result OnCompare(Opcode); Result OnConst(Type); Result OnConvert(Opcode); @@ -74,12 +76,15 @@ class TypeChecker { Result OnIf(const TypeVector* sig); Result OnLoad(Opcode); Result OnLoop(const TypeVector* sig); + Result OnRethrow(Index depth); Result OnReturn(); Result OnSelect(); Result OnSetGlobal(Type); Result OnSetLocal(Type); Result OnStore(Opcode); Result OnTeeLocal(Type); + Result OnThrow(const TypeVector* sig); + Result OnTryBlock(const TypeVector* sig); Result OnUnary(Opcode); Result OnUnreachable(); Result EndFunction(); diff --git a/src/validator.cc b/src/validator.cc index c7b16ad4..0ba45930 100644 --- a/src/validator.cc +++ b/src/validator.cc @@ -52,6 +52,11 @@ class Validator { }; }; + struct TryContext { + const Expr* try_ = nullptr; + const Catch* catch_ = nullptr; + }; + void WABT_PRINTF_FORMAT(3, 4) PrintError(const Location* loc, const char* fmt, ...); void OnTypecheckerError(const char* msg); @@ -133,6 +138,9 @@ class Validator { void CheckAssertReturnNanCommand(const Action* action); void CheckCommand(const Command* command); + void CheckExcept(const Location* loc, const Exception* Except); + Result CheckExceptVar(const Var* var, const Exception** out_except); + SourceErrorHandler* error_handler_ = nullptr; WastLexer* lexer_ = nullptr; const Script* script_ = nullptr; @@ -142,10 +150,12 @@ class Validator { Index current_memory_index_ = 0; Index current_global_index_ = 0; Index num_imported_globals_ = 0; + Index current_except_index_ = 0; TypeChecker typechecker_; // Cached for access by OnTypecheckerError. const Location* expr_loc_ = nullptr; Result result_ = Result::Ok; + std::vector<TryContext> try_contexts_; }; Validator::Validator(SourceErrorHandler* error_handler, @@ -464,16 +474,6 @@ void Validator::CheckExpr(const Expr* expr) { break; } - case ExprType::Catch: - // TODO(karlschimpf) Define. - PrintError(&expr->loc, "Catch: don't know how to validate"); - break; - - case ExprType::CatchAll: - // TODO(karlschimpf) Define. - PrintError(&expr->loc, "CatchAll: don't know how to validate"); - break; - case ExprType::Compare: typechecker_.OnCompare(expr->compare.opcode); break; @@ -537,8 +537,9 @@ void Validator::CheckExpr(const Expr* expr) { break; case ExprType::Rethrow: - // TODO(karlschimpf) Define. - PrintError(&expr->loc, "Rethrow: don't know how to validate"); + if (try_contexts_.empty() || try_contexts_.back().catch_ == nullptr) + PrintError(&expr->loc, "Rethrow not in try catch block"); + typechecker_.OnRethrow(expr->rethrow_.var.index); break; case ExprType::Return: @@ -569,14 +570,42 @@ void Validator::CheckExpr(const Expr* expr) { break; case ExprType::Throw: - // TODO(karlschimpf) Define. - PrintError(&expr->loc, "Throw: don't know how to validate"); + const Exception* except; + if (WABT_SUCCEEDED(CheckExceptVar(&expr->throw_.var, &except))) { + typechecker_.OnThrow(&except->sig); + } break; - case ExprType::TryBlock: - // TODO(karlschimpf) Define. - PrintError(&expr->loc, "TryBlock: don't know how to validate"); + case ExprType::TryBlock: { + TryContext context; + context.try_ = expr; + try_contexts_.push_back(context); + CheckBlockSig(&expr->loc, Opcode::Try, &expr->try_block.block->sig); + + typechecker_.OnTryBlock(&expr->try_block.block->sig); + CheckExprList(&expr->loc, expr->try_block.block->first); + + if (expr->try_block.catches->empty()) + PrintError(&expr->loc, "TryBlock: doesn't have any catch clauses"); + bool found_catch_all = false; + for (const Catch* catch_ : *expr->try_block.catches) { + try_contexts_.back().catch_ = catch_; + typechecker_.OnCatchBlock(&expr->try_block.block->sig); + if (catch_->IsCatchAll()) { + found_catch_all = true; + } else { + if (found_catch_all) + PrintError(&catch_->loc, "Appears after catch all block"); + const Exception* except = nullptr; + CheckExceptVar(&catch_->var, &except); + typechecker_.OnCatch(&except->sig); + } + CheckExprList(&catch_->loc, catch_->first); + } + typechecker_.OnEnd(); + try_contexts_.pop_back(); break; + } case ExprType::Unary: typechecker_.OnUnary(expr->unary.opcode); @@ -750,8 +779,8 @@ void Validator::CheckDataSegments(const Module* module) { void Validator::CheckImport(const Location* loc, const Import* import) { switch (import->kind) { case ExternalKind::Except: - // TODO(karlschimpf) Define. - PrintError(loc, "import except: don't know how to validate"); + ++current_except_index_; + CheckExcept(loc, import->except); break; case ExternalKind::Func: if (import->func->decl.has_func_type) @@ -759,18 +788,18 @@ void Validator::CheckImport(const Location* loc, const Import* import) { break; case ExternalKind::Table: CheckTable(loc, import->table); - current_table_index_++; + ++current_table_index_; break; case ExternalKind::Memory: CheckMemory(loc, import->memory); - current_memory_index_++; + ++current_memory_index_; break; case ExternalKind::Global: if (import->global->mutable_) { PrintError(loc, "mutable globals cannot be imported"); } - num_imported_globals_++; - current_global_index_++; + ++num_imported_globals_; + ++current_global_index_; break; } } @@ -778,8 +807,7 @@ void Validator::CheckImport(const Location* loc, const Import* import) { void Validator::CheckExport(const Location* loc, const Export* export_) { switch (export_->kind) { case ExternalKind::Except: - // TODO(karlschimpf) Define. - PrintError(loc, "except: don't know how to validate export"); + CheckExceptVar(&export_->var, nullptr); break; case ExternalKind::Func: CheckFuncVar(&export_->var, nullptr); @@ -821,13 +849,15 @@ void Validator::CheckModule(const Module* module) { current_memory_index_ = 0; current_global_index_ = 0; num_imported_globals_ = 0; + current_except_index_ = 0; for (ModuleField* field = module->first_field; field; field = field->next) { switch (field->type) { case ModuleFieldType::Except: - // TODO(karlschimpf) Define. - PrintError(&field->loc, "except clause: don't know how to validate"); + ++current_except_index_; + CheckExcept(&field->loc, field->except); break; + case ModuleFieldType::Func: CheckFunc(&field->loc, field->func); break; @@ -959,6 +989,32 @@ Result Validator::CheckGet(const Action* action, Type* out_type) { return Result::Ok; } +Result Validator::CheckExceptVar(const Var* var, const Exception** out_except) { + Index index; + if (WABT_FAILED( + CheckVar(current_module_->excepts.size(), var, "except", &index))) { + return Result::Error; + } + if (out_except) + *out_except = current_module_->excepts[index]; + return Result::Ok; +} + +void Validator::CheckExcept(const Location* loc, const Exception* except) { + for (Type ty : except->sig) { + switch (ty) { + case Type::I32: + case Type::I64: + case Type::F32: + case Type::F64: + break; + default: + PrintError(loc, "Invalid exception type: %s", get_type_name(ty)); + break; + } + } +} + Validator::ActionResult Validator::CheckAction(const Action* action) { ActionResult result; WABT_ZERO_MEMORY(result); diff --git a/src/wast-parser-lexer-shared.h b/src/wast-parser-lexer-shared.h index 76be8f31..c54d6368 100644 --- a/src/wast-parser-lexer-shared.h +++ b/src/wast-parser-lexer-shared.h @@ -65,6 +65,7 @@ union Token { tokens is a hotspot when parsing large files. */ Action* action; Block* block; + Catch* catch_; Command* command; CommandPtrVector* commands; Const const_; diff --git a/src/wast-parser.h b/src/wast-parser.h index 53ba4422..ea83bbde 100644 --- a/src/wast-parser.h +++ b/src/wast-parser.h @@ -25,7 +25,7 @@ struct Script; class SourceErrorHandler; struct WastParseOptions { - bool allow_exceptions = false; + bool allow_future_exceptions = false; bool debug_parsing = false; }; diff --git a/src/wast-parser.y b/src/wast-parser.y index a5dabd42..2011aa02 100644 --- a/src/wast-parser.y +++ b/src/wast-parser.y @@ -97,7 +97,7 @@ #define CHECK_ALLOW_EXCEPTIONS(loc, opcode_name) \ do { \ - if (!parser->options->allow_exceptions) { \ + if (!parser->options->allow_future_exceptions) { \ wast_parser_error(loc, lexer, parser, "opcode not allowed: %s", \ opcode_name); \ } \ @@ -116,7 +116,6 @@ static bool is_power_of_two(uint32_t x) { static ExprList join_exprs1(Location* loc, Expr* expr1); static ExprList join_exprs2(Location* loc, ExprList* expr1, Expr* expr2); -static ExprList join_expr_lists(ExprList* expr1, ExprList* expr2); static void append_expr_list(ExprList* expr_list, ExprList* expr); static Result parse_const(Type type, @@ -199,8 +198,8 @@ class BinaryErrorHandlerModule : public BinaryErrorHandler { %type<export_> export_desc inline_export %type<expr> plain_instr block_instr %type<expr> try_ -%type<expr_list> plain_catch plain_catch_all -%type<expr_list> catch_instr catch_sexp catch_sexp_list catch_instr_list +%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 @@ -606,7 +605,8 @@ block_instr : } | try_check labeling_opt block catch_instr_list END labeling_opt { $3->label = $2; - $$ = Expr::CreateTry($3, $4.first); + $$ = $4; + $$->try_block.block = $3; CHECK_END_LABEL(@6, $3->label, $6); } ; @@ -628,15 +628,15 @@ block : plain_catch : CATCH var instr_list { - Expr* expr = Expr::CreateCatch(std::move(*$2), $3.first); + $$ = new Catch(std::move(*$2), $3.first); + $$->loc = @1; delete $2; - $$ = join_exprs1(&@1, expr); } ; plain_catch_all : CATCH_ALL instr_list { - Expr* expr = Expr::CreateCatchAll($2.first); - $$ = join_exprs1(&@1, expr); + $$ = new Catch($2.first); + $$->loc = @1; } ; @@ -646,9 +646,13 @@ catch_instr : ; catch_instr_list : - catch_instr - | catch_instr catch_instr_list { - $$ = join_expr_lists(&$1, &$2); + catch_instr { + $$ = Expr::CreateTry(); + $$->try_block.catches->push_back($1); + } + | catch_instr_list catch_instr { + $$ = $1; + $$->try_block.catches->push_back($2); } ; @@ -693,7 +697,8 @@ try_ : | instr_list catch_sexp_list { Block* block = new Block(); block->first = $1.first; - $$ = Expr::CreateTry(block, $2.first); + $$ = $2; + $$->try_block.block = block; } ; @@ -707,10 +712,13 @@ catch_sexp : ; catch_sexp_list : - catch_sexp + catch_sexp { + $$ = Expr::CreateTry(); + $$->try_block.catches->push_back($1); + } | catch_sexp_list catch_sexp { $$ = $1; - append_expr_list(&$1, &$2); + $$->try_block.catches->push_back($2); } ; @@ -1667,14 +1675,6 @@ ExprList join_exprs2(Location* loc, ExprList* expr1, Expr* expr2) { return result; } -ExprList join_expr_lists(ExprList* expr1, ExprList* expr2) { - ExprList result; - WABT_ZERO_MEMORY(result); - append_expr_list(&result, expr1); - append_expr_list(&result, expr2); - return result; -} - Result parse_const(Type type, LiteralType literal_type, const char* s, @@ -1874,7 +1874,7 @@ void append_module_fields(Module* module, ModuleField* first) { name = &field->import->except->name; bindings = &module->except_bindings; index = module->excepts.size(); - module->excepts.push_back(field->except); + module->excepts.push_back(field->import->except); ++module->num_except_imports; break; } |