diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ast-parser-lexer-shared.cc | 12 | ||||
-rw-r--r-- | src/ast-parser-lexer-shared.h | 1 | ||||
-rw-r--r-- | src/ast-parser.h | 6 | ||||
-rw-r--r-- | src/ast-parser.y | 42 | ||||
-rw-r--r-- | src/binary-error-handler.cc | 59 | ||||
-rw-r--r-- | src/binary-error-handler.h | 59 | ||||
-rw-r--r-- | src/binary-reader-ast.cc | 6 | ||||
-rw-r--r-- | src/binary-reader-ast.h | 5 | ||||
-rw-r--r-- | src/binary-reader-interpreter.cc | 6 | ||||
-rw-r--r-- | src/binary-reader-interpreter.h | 5 | ||||
-rw-r--r-- | src/common.cc | 86 | ||||
-rw-r--r-- | src/common.h | 63 | ||||
-rw-r--r-- | src/prebuilt/ast-parser-gen.cc | 980 | ||||
-rw-r--r-- | src/prebuilt/ast-parser-gen.hh | 4 | ||||
-rw-r--r-- | src/resolve-names.cc | 14 | ||||
-rw-r--r-- | src/resolve-names.h | 11 | ||||
-rw-r--r-- | src/source-error-handler.cc | 85 | ||||
-rw-r--r-- | src/source-error-handler.h | 91 | ||||
-rw-r--r-- | src/tools/wasm-interp.cc | 66 | ||||
-rw-r--r-- | src/tools/wasm2wast.cc | 7 | ||||
-rw-r--r-- | src/tools/wast-desugar.cc | 7 | ||||
-rw-r--r-- | src/tools/wast2wasm.cc | 11 | ||||
-rw-r--r-- | src/validator.h | 2 |
23 files changed, 883 insertions, 745 deletions
diff --git a/src/ast-parser-lexer-shared.cc b/src/ast-parser-lexer-shared.cc index eab46b36..a6f8ba96 100644 --- a/src/ast-parser-lexer-shared.cc +++ b/src/ast-parser-lexer-shared.cc @@ -20,6 +20,8 @@ #include <stdio.h> #include <string.h> +#include <string> + namespace wabt { void ast_parser_error(Location* loc, @@ -52,7 +54,7 @@ void ast_format_error(SourceErrorHandler* error_handler, char* source_line = nullptr; size_t source_line_length = 0; int source_line_column_offset = 0; - size_t source_line_max_length = error_handler->source_line_max_length; + size_t source_line_max_length = error_handler->source_line_max_length(); if (loc && lexer) { source_line = static_cast<char*>(alloca(source_line_max_length + 1)); Result result = ast_lexer_get_source_line( @@ -65,11 +67,9 @@ void ast_format_error(SourceErrorHandler* error_handler, } } - if (error_handler->on_error) { - error_handler->on_error(loc, buffer, source_line, source_line_length, - source_line_column_offset, - error_handler->user_data); - } + error_handler->OnError(loc, std::string(buffer), + std::string(source_line, source_line_length), + source_line_column_offset); va_end(args_copy); } diff --git a/src/ast-parser-lexer-shared.h b/src/ast-parser-lexer-shared.h index b06da3c2..894db7b1 100644 --- a/src/ast-parser-lexer-shared.h +++ b/src/ast-parser-lexer-shared.h @@ -24,6 +24,7 @@ #include "ast.h" #include "ast-lexer.h" #include "common.h" +#include "source-error-handler.h" #define WABT_AST_PARSER_STYPE Token #define WABT_AST_PARSER_LTYPE Location diff --git a/src/ast-parser.h b/src/ast-parser.h index 0992d16b..4cd90f31 100644 --- a/src/ast-parser.h +++ b/src/ast-parser.h @@ -18,15 +18,13 @@ #define WABT_AST_PARSER_H_ #include "ast-lexer.h" -#include "common.h" namespace wabt { struct Script; +class SourceErrorHandler; -Result parse_ast(AstLexer* lexer, - struct Script** out_script, - SourceErrorHandler*); +Result parse_ast(AstLexer* lexer, Script** out_script, SourceErrorHandler*); } // namespace wabt diff --git a/src/ast-parser.y b/src/ast-parser.y index ff788670..081bedcb 100644 --- a/src/ast-parser.y +++ b/src/ast-parser.y @@ -25,6 +25,7 @@ #include "ast-parser.h" #include "ast-parser-lexer-shared.h" +#include "binary-error-handler.h" #include "binary-reader-ast.h" #include "binary-reader.h" #include "literal.h" @@ -161,14 +162,16 @@ void append_implicit_func_declaration(Location*, Module*, FuncDeclaration*); -struct BinaryErrorCallbackData { - Location* loc; - AstLexer* lexer; - AstParser* parser; -}; +class BinaryErrorHandlerModule : public BinaryErrorHandler { + public: + BinaryErrorHandlerModule(Location* loc, AstLexer* lexer, AstParser* parser); + bool OnError(uint32_t offset, const std::string& error) override; -static bool on_read_binary_error(uint32_t offset, const char* error, - void* user_data); + private: + Location* loc_; + AstLexer* lexer_; + AstParser* parser_; +}; #define wabt_ast_parser_lex ast_lexer_lex #define wabt_ast_parser_error ast_parser_error @@ -1280,13 +1283,7 @@ module : assert($1->type == RawModuleType::Binary); $$ = new Module(); ReadBinaryOptions options = WABT_READ_BINARY_OPTIONS_DEFAULT; - BinaryErrorCallbackData user_data; - user_data.loc = &$1->binary.loc; - user_data.lexer = lexer; - user_data.parser = parser; - BinaryErrorHandler error_handler; - error_handler.on_error = on_read_binary_error; - error_handler.user_data = &user_data; + BinaryErrorHandlerModule error_handler(&$1->binary.loc, lexer, parser); read_binary_ast($1->binary.data, $1->binary.size, &options, &error_handler, $$); $$->name = $1->binary.name; @@ -1668,14 +1665,19 @@ Result parse_ast(AstLexer* lexer, Script** out_script, return result == 0 && parser.errors == 0 ? Result::Ok : Result::Error; } -bool on_read_binary_error(uint32_t offset, const char* error, void* user_data) { - BinaryErrorCallbackData* data = (BinaryErrorCallbackData*)user_data; +BinaryErrorHandlerModule::BinaryErrorHandlerModule( + Location* loc, AstLexer* lexer, AstParser* parser) + : loc_(loc), lexer_(lexer), parser_(parser) {} + +bool BinaryErrorHandlerModule::OnError(uint32_t offset, + const std::string& error) { if (offset == WABT_UNKNOWN_OFFSET) { - ast_parser_error(data->loc, data->lexer, data->parser, - "error in binary module: %s", error); + ast_parser_error(loc_, lexer_, parser_, "error in binary module: %s", + error.c_str()); } else { - ast_parser_error(data->loc, data->lexer, data->parser, - "error in binary module: @0x%08x: %s", offset, error); + ast_parser_error(loc_, lexer_, parser_, + "error in binary module: @0x%08x: %s", offset, + error.c_str()); } return true; } diff --git a/src/binary-error-handler.cc b/src/binary-error-handler.cc new file mode 100644 index 00000000..c785d2af --- /dev/null +++ b/src/binary-error-handler.cc @@ -0,0 +1,59 @@ +/* + * Copyright 2017 WebAssembly Community Group participants + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "binary-error-handler.h" + +#include "common.h" + +namespace wabt { + +BinaryErrorHandlerFile::BinaryErrorHandlerFile(FILE* file, + const std::string& header, + PrintHeader print_header) + : file_(file), header_(header), print_header_(print_header) {} + +bool BinaryErrorHandlerFile::OnError(uint32_t offset, + const std::string& error) { + PrintErrorHeader(); + if (offset == WABT_UNKNOWN_OFFSET) + fprintf(file_, "error: %s\n", error.c_str()); + else + fprintf(file_, "error: @0x%08x: %s\n", offset, error.c_str()); + fflush(file_); + return true; +} + +void BinaryErrorHandlerFile::PrintErrorHeader() { + if (header_.empty()) + return; + + switch (print_header_) { + case PrintHeader::Never: + break; + + case PrintHeader::Once: + print_header_ = PrintHeader::Never; + // Fallthrough. + + case PrintHeader::Always: + fprintf(file_, "%s:\n", header_.c_str()); + break; + } + // If there's a header, indent the following message. + fprintf(file_, " "); +} + +} // namespace wabt diff --git a/src/binary-error-handler.h b/src/binary-error-handler.h new file mode 100644 index 00000000..8fa3f847 --- /dev/null +++ b/src/binary-error-handler.h @@ -0,0 +1,59 @@ +/* + * Copyright 2017 WebAssembly Community Group participants + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef WABT_BINARY_ERROR_HANDLER_H_ +#define WABT_BINARY_ERROR_HANDLER_H_ + +#include <stdint.h> +#include <stdio.h> + +#include <string> + +namespace wabt { + +class BinaryErrorHandler { + public: + virtual ~BinaryErrorHandler() {} + + // Returns true if the error was handled. + virtual bool OnError(uint32_t offset, const std::string& error) = 0; +}; + +class BinaryErrorHandlerFile : public BinaryErrorHandler { + public: + enum class PrintHeader { + Never, + Once, + Always, + }; + + BinaryErrorHandlerFile(FILE* file = stderr, + const std::string& header = std::string(), + PrintHeader print_header = PrintHeader::Never); + + bool OnError(uint32_t offset, const std::string& error) override; + + private: + void PrintErrorHeader(); + + FILE* file_; + std::string header_; + PrintHeader print_header_; +}; + +} // namespace wabt + +#endif // WABT_BINARY_ERROR_HANDLER_H_ diff --git a/src/binary-reader-ast.cc b/src/binary-reader-ast.cc index de0a2a93..2aafc341 100644 --- a/src/binary-reader-ast.cc +++ b/src/binary-reader-ast.cc @@ -25,6 +25,7 @@ #include <vector> #include "ast.h" +#include "binary-error-handler.h" #include "binary-reader-nop.h" #include "common.h" @@ -264,10 +265,7 @@ Result BinaryReaderAST::AppendExpr(Expr* expr) { } bool BinaryReaderAST::HandleError(uint32_t offset, const char* message) { - if (error_handler->on_error) { - return error_handler->on_error(offset, message, error_handler->user_data); - } - return false; + return error_handler->OnError(offset, message); } bool BinaryReaderAST::OnError(const char* message) { diff --git a/src/binary-reader-ast.h b/src/binary-reader-ast.h index 07599033..49d99d2e 100644 --- a/src/binary-reader-ast.h +++ b/src/binary-reader-ast.h @@ -23,12 +23,13 @@ namespace wabt { struct Module; struct ReadBinaryOptions; +class BinaryErrorHandler; Result read_binary_ast(const void* data, size_t size, - const struct ReadBinaryOptions* options, + const ReadBinaryOptions* options, BinaryErrorHandler*, - struct Module* out_module); + Module* out_module); } // namespace wabt diff --git a/src/binary-reader-interpreter.cc b/src/binary-reader-interpreter.cc index db5f9719..fcb6fede 100644 --- a/src/binary-reader-interpreter.cc +++ b/src/binary-reader-interpreter.cc @@ -23,6 +23,7 @@ #include <vector> +#include "binary-error-handler.h" #include "binary-reader-nop.h" #include "interpreter.h" #include "type-checker.h" @@ -322,10 +323,7 @@ Label* BinaryReaderInterpreter::TopLabel() { bool BinaryReaderInterpreter::HandleError(uint32_t offset, const char* message) { - if (error_handler->on_error) { - return error_handler->on_error(offset, message, error_handler->user_data); - } - return false; + return error_handler->OnError(offset, message); } void WABT_PRINTF_FORMAT(2, 3) diff --git a/src/binary-reader-interpreter.h b/src/binary-reader-interpreter.h index 66fa5542..60f985ce 100644 --- a/src/binary-reader-interpreter.h +++ b/src/binary-reader-interpreter.h @@ -21,14 +21,15 @@ namespace wabt { +class BinaryErrorHandler; struct DefinedInterpreterModule; struct InterpreterEnvironment; struct ReadBinaryOptions; -Result read_binary_interpreter(struct InterpreterEnvironment* env, +Result read_binary_interpreter(InterpreterEnvironment* env, const void* data, size_t size, - const struct ReadBinaryOptions* options, + const ReadBinaryOptions* options, BinaryErrorHandler*, DefinedInterpreterModule** out_module); diff --git a/src/common.cc b/src/common.cc index aca5b78d..72198f8c 100644 --- a/src/common.cc +++ b/src/common.cc @@ -164,92 +164,6 @@ Result read_file(const char* filename, char** out_data, size_t* out_size) { return Result::Ok; } -static void print_carets(FILE* out, - size_t num_spaces, - size_t num_carets, - size_t max_line) { - /* print the caret */ - char* carets = static_cast<char*>(alloca(max_line)); - memset(carets, '^', max_line); - if (num_carets > max_line - num_spaces) - num_carets = max_line - num_spaces; - /* always print at least one caret */ - if (num_carets == 0) - num_carets = 1; - fprintf(out, "%*s%.*s\n", static_cast<int>(num_spaces), "", - static_cast<int>(num_carets), carets); -} - -static void print_source_error(FILE* out, - const Location* loc, - const char* error, - const char* source_line, - size_t source_line_length, - size_t source_line_column_offset) { - fprintf(out, "%s:%d:%d: %s\n", loc->filename, loc->line, loc->first_column, - error); - if (source_line && source_line_length > 0) { - fprintf(out, "%s\n", source_line); - size_t num_spaces = (loc->first_column - 1) - source_line_column_offset; - size_t num_carets = loc->last_column - loc->first_column; - print_carets(out, num_spaces, num_carets, source_line_length); - } -} - -static void print_error_header(FILE* out, DefaultErrorHandlerInfo* info) { - if (info && info->header) { - switch (info->print_header) { - case PrintErrorHeader::Never: - break; - - case PrintErrorHeader::Once: - info->print_header = PrintErrorHeader::Never; - /* Fallthrough. */ - - case PrintErrorHeader::Always: - fprintf(out, "%s:\n", info->header); - break; - } - /* If there's a header, indent the following message. */ - fprintf(out, " "); - } -} - -static FILE* get_default_error_handler_info_output_file( - DefaultErrorHandlerInfo* info) { - return info && info->out_file ? info->out_file : stderr; -} - -bool default_source_error_callback(const Location* loc, - const char* error, - const char* source_line, - size_t source_line_length, - size_t source_line_column_offset, - void* user_data) { - DefaultErrorHandlerInfo* info = - static_cast<DefaultErrorHandlerInfo*>(user_data); - FILE* out = get_default_error_handler_info_output_file(info); - print_error_header(out, info); - print_source_error(out, loc, error, source_line, source_line_length, - source_line_column_offset); - return true; -} - -bool default_binary_error_callback(uint32_t offset, - const char* error, - void* user_data) { - DefaultErrorHandlerInfo* info = - static_cast<DefaultErrorHandlerInfo*>(user_data); - FILE* out = get_default_error_handler_info_output_file(info); - print_error_header(out, info); - if (offset == WABT_UNKNOWN_OFFSET) - fprintf(out, "error: %s\n", error); - else - fprintf(out, "error: @0x%08x: %s\n", offset, error); - fflush(out); - return true; -} - void init_stdio() { #if COMPILER_IS_MSVC int result = _setmode(_fileno(stdout), _O_BINARY); diff --git a/src/common.h b/src/common.h index 4c62c7f8..b7153046 100644 --- a/src/common.h +++ b/src/common.h @@ -83,6 +83,20 @@ enum class Result { #define WABT_SUCCEEDED(x) ((x) == Result::Ok) #define WABT_FAILED(x) ((x) == Result::Error) +inline std::string WABT_PRINTF_FORMAT(1, 2) + string_printf(const char* format, ...) { + va_list args; + va_list args_copy; + va_start(args, format); + va_copy(args_copy, args); + size_t len = wabt_vsnprintf(nullptr, 0, format, args) + 1; // For \0. + std::vector<char> buffer(len); + va_end(args); + wabt_vsnprintf(buffer.data(), len, format, args_copy); + va_end(args_copy); + return std::string(buffer.data(), len - 1); +} + enum class LabelType { Func, Block, @@ -107,55 +121,6 @@ struct Location { int last_column; }; -/* Returns true if the error was handled. */ -typedef bool (*SourceErrorCallback)(const Location*, - const char* error, - const char* source_line, - size_t source_line_length, - size_t source_line_column_offset, - void* user_data); - -struct SourceErrorHandler { - SourceErrorCallback on_error; - /* on_error will be called with with source_line trimmed to this length */ - size_t source_line_max_length; - void* user_data; -}; - -#define WABT_SOURCE_LINE_MAX_LENGTH_DEFAULT 80 -#define WABT_SOURCE_ERROR_HANDLER_DEFAULT \ - { \ - default_source_error_callback, WABT_SOURCE_LINE_MAX_LENGTH_DEFAULT, \ - nullptr \ - } - -/* Returns true if the error was handled. */ -typedef bool (*BinaryErrorCallback)(uint32_t offset, - const char* error, - void* user_data); - -struct BinaryErrorHandler { - BinaryErrorCallback on_error; - void* user_data; -}; - -#define WABT_BINARY_ERROR_HANDLER_DEFAULT \ - { default_binary_error_callback, nullptr } - -/* This data structure is not required; it is just used by the default error - * handler callbacks. */ -enum class PrintErrorHeader { - Never, - Once, - Always, -}; - -struct DefaultErrorHandlerInfo { - const char* header; - FILE* out_file; - PrintErrorHeader print_header; -}; - /* matches binary format, do not change */ enum class Type { I32 = -0x01, diff --git a/src/prebuilt/ast-parser-gen.cc b/src/prebuilt/ast-parser-gen.cc index 1cc209b7..a756c8d2 100644 --- a/src/prebuilt/ast-parser-gen.cc +++ b/src/prebuilt/ast-parser-gen.cc @@ -1,8 +1,8 @@ -/* A Bison parser, made by GNU Bison 3.0.4. */ +/* A Bison parser, made by GNU Bison 3.0.2. */ /* Bison implementation for Yacc-like parsers in C - Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. + Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -44,7 +44,7 @@ #define YYBISON 1 /* Bison version. */ -#define YYBISON_VERSION "3.0.4" +#define YYBISON_VERSION "3.0.2" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" @@ -82,6 +82,7 @@ #include "ast-parser.h" #include "ast-parser-lexer-shared.h" +#include "binary-error-handler.h" #include "binary-reader-ast.h" #include "binary-reader.h" #include "literal.h" @@ -218,20 +219,22 @@ void append_implicit_func_declaration(Location*, Module*, FuncDeclaration*); -struct BinaryErrorCallbackData { - Location* loc; - AstLexer* lexer; - AstParser* parser; -}; +class BinaryErrorHandlerModule : public BinaryErrorHandler { + public: + BinaryErrorHandlerModule(Location* loc, AstLexer* lexer, AstParser* parser); + bool OnError(uint32_t offset, const std::string& error) override; -static bool on_read_binary_error(uint32_t offset, const char* error, - void* user_data); + private: + Location* loc_; + AstLexer* lexer_; + AstParser* parser_; +}; #define wabt_ast_parser_lex ast_lexer_lex #define wabt_ast_parser_error ast_parser_error -#line 235 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:339 */ +#line 238 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:339 */ # ifndef YY_NULLPTR # if defined __cplusplus && 201103L <= __cplusplus @@ -379,7 +382,7 @@ int wabt_ast_parser_parse (::wabt::AstLexer* lexer, ::wabt::AstParser* parser); /* Copy the second part of user declarations. */ -#line 383 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:358 */ +#line 386 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:358 */ #ifdef short # undef short @@ -685,24 +688,24 @@ static const yytype_uint8 yytranslate[] = /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 293, 293, 299, 309, 310, 314, 332, 333, 339, - 342, 347, 354, 357, 358, 363, 370, 378, 384, 390, - 395, 402, 408, 419, 423, 427, 434, 439, 446, 447, - 453, 454, 457, 461, 462, 466, 467, 477, 478, 489, - 490, 491, 494, 497, 500, 503, 506, 509, 512, 515, - 518, 521, 524, 527, 530, 533, 536, 539, 542, 545, - 558, 561, 564, 567, 570, 573, 578, 583, 588, 593, - 601, 610, 614, 617, 622, 627, 637, 641, 645, 649, - 653, 657, 664, 665, 673, 674, 682, 687, 688, 694, - 700, 710, 716, 722, 732, 784, 794, 801, 809, 819, - 822, 826, 833, 845, 853, 875, 882, 894, 902, 923, - 945, 953, 966, 974, 982, 988, 994, 1002, 1007, 1015, - 1023, 1029, 1035, 1044, 1052, 1057, 1062, 1067, 1074, 1081, - 1085, 1088, 1100, 1105, 1114, 1118, 1121, 1128, 1137, 1154, - 1171, 1183, 1189, 1195, 1201, 1234, 1244, 1264, 1275, 1303, - 1308, 1316, 1326, 1336, 1342, 1348, 1354, 1360, 1366, 1371, - 1376, 1382, 1391, 1396, 1397, 1402, 1411, 1412, 1419, 1431, - 1432, 1439, 1505 + 0, 296, 296, 302, 312, 313, 317, 335, 336, 342, + 345, 350, 357, 360, 361, 366, 373, 381, 387, 393, + 398, 405, 411, 422, 426, 430, 437, 442, 449, 450, + 456, 457, 460, 464, 465, 469, 470, 480, 481, 492, + 493, 494, 497, 500, 503, 506, 509, 512, 515, 518, + 521, 524, 527, 530, 533, 536, 539, 542, 545, 548, + 561, 564, 567, 570, 573, 576, 581, 586, 591, 596, + 604, 613, 617, 620, 625, 630, 640, 644, 648, 652, + 656, 660, 667, 668, 676, 677, 685, 690, 691, 697, + 703, 713, 719, 725, 735, 787, 797, 804, 812, 822, + 825, 829, 836, 848, 856, 878, 885, 897, 905, 926, + 948, 956, 969, 977, 985, 991, 997, 1005, 1010, 1018, + 1026, 1032, 1038, 1047, 1055, 1060, 1065, 1070, 1077, 1084, + 1088, 1091, 1103, 1108, 1117, 1121, 1124, 1131, 1140, 1157, + 1174, 1186, 1192, 1198, 1204, 1237, 1247, 1267, 1278, 1300, + 1305, 1313, 1323, 1333, 1339, 1345, 1351, 1357, 1363, 1368, + 1373, 1379, 1388, 1393, 1394, 1399, 1408, 1409, 1416, 1428, + 1429, 1436, 1502 }; #endif @@ -1642,363 +1645,363 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio switch (yytype) { case 5: /* NAT */ -#line 250 "src/ast-parser.y" /* yacc.c:1257 */ +#line 253 "src/ast-parser.y" /* yacc.c:1257 */ {} -#line 1648 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1651 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 6: /* INT */ -#line 250 "src/ast-parser.y" /* yacc.c:1257 */ +#line 253 "src/ast-parser.y" /* yacc.c:1257 */ {} -#line 1654 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1657 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 7: /* FLOAT */ -#line 250 "src/ast-parser.y" /* yacc.c:1257 */ +#line 253 "src/ast-parser.y" /* yacc.c:1257 */ {} -#line 1660 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1663 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 8: /* TEXT */ -#line 250 "src/ast-parser.y" /* yacc.c:1257 */ +#line 253 "src/ast-parser.y" /* yacc.c:1257 */ {} -#line 1666 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1669 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 9: /* VAR */ -#line 250 "src/ast-parser.y" /* yacc.c:1257 */ +#line 253 "src/ast-parser.y" /* yacc.c:1257 */ {} -#line 1672 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1675 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 35: /* OFFSET_EQ_NAT */ -#line 250 "src/ast-parser.y" /* yacc.c:1257 */ +#line 253 "src/ast-parser.y" /* yacc.c:1257 */ {} -#line 1678 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1681 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 36: /* ALIGN_EQ_NAT */ -#line 250 "src/ast-parser.y" /* yacc.c:1257 */ +#line 253 "src/ast-parser.y" /* yacc.c:1257 */ {} -#line 1684 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1687 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 76: /* non_empty_text_list */ -#line 277 "src/ast-parser.y" /* yacc.c:1257 */ +#line 280 "src/ast-parser.y" /* yacc.c:1257 */ { destroy_text_list(&((*yyvaluep).text_list)); } -#line 1690 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1693 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 77: /* text_list */ -#line 277 "src/ast-parser.y" /* yacc.c:1257 */ +#line 280 "src/ast-parser.y" /* yacc.c:1257 */ { destroy_text_list(&((*yyvaluep).text_list)); } -#line 1696 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1699 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 78: /* quoted_text */ -#line 251 "src/ast-parser.y" /* yacc.c:1257 */ +#line 254 "src/ast-parser.y" /* yacc.c:1257 */ { destroy_string_slice(&((*yyvaluep).text)); } -#line 1702 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1705 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 79: /* value_type_list */ -#line 278 "src/ast-parser.y" /* yacc.c:1257 */ +#line 281 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).types); } -#line 1708 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1711 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 81: /* global_type */ -#line 270 "src/ast-parser.y" /* yacc.c:1257 */ +#line 273 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).global); } -#line 1714 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1717 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 82: /* func_type */ -#line 268 "src/ast-parser.y" /* yacc.c:1257 */ +#line 271 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).func_sig); } -#line 1720 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1723 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 83: /* func_sig */ -#line 268 "src/ast-parser.y" /* yacc.c:1257 */ +#line 271 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).func_sig); } -#line 1726 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1729 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 85: /* memory_sig */ -#line 273 "src/ast-parser.y" /* yacc.c:1257 */ +#line 276 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).memory); } -#line 1732 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1735 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 87: /* type_use */ -#line 279 "src/ast-parser.y" /* yacc.c:1257 */ +#line 282 "src/ast-parser.y" /* yacc.c:1257 */ { destroy_var(&((*yyvaluep).var)); } -#line 1738 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1741 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 89: /* literal */ -#line 252 "src/ast-parser.y" /* yacc.c:1257 */ +#line 255 "src/ast-parser.y" /* yacc.c:1257 */ { destroy_string_slice(&((*yyvaluep).literal).text); } -#line 1744 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1747 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 90: /* var */ -#line 279 "src/ast-parser.y" /* yacc.c:1257 */ +#line 282 "src/ast-parser.y" /* yacc.c:1257 */ { destroy_var(&((*yyvaluep).var)); } -#line 1750 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1753 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 91: /* var_list */ -#line 280 "src/ast-parser.y" /* yacc.c:1257 */ +#line 283 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).vars); } -#line 1756 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1759 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 92: /* bind_var_opt */ -#line 251 "src/ast-parser.y" /* yacc.c:1257 */ +#line 254 "src/ast-parser.y" /* yacc.c:1257 */ { destroy_string_slice(&((*yyvaluep).text)); } -#line 1762 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1765 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 93: /* bind_var */ -#line 251 "src/ast-parser.y" /* yacc.c:1257 */ +#line 254 "src/ast-parser.y" /* yacc.c:1257 */ { destroy_string_slice(&((*yyvaluep).text)); } -#line 1768 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1771 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 94: /* labeling_opt */ -#line 251 "src/ast-parser.y" /* yacc.c:1257 */ +#line 254 "src/ast-parser.y" /* yacc.c:1257 */ { destroy_string_slice(&((*yyvaluep).text)); } -#line 1774 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1777 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 97: /* instr */ -#line 265 "src/ast-parser.y" /* yacc.c:1257 */ +#line 268 "src/ast-parser.y" /* yacc.c:1257 */ { destroy_expr_list(((*yyvaluep).expr_list).first); } -#line 1780 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1783 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 98: /* plain_instr */ -#line 264 "src/ast-parser.y" /* yacc.c:1257 */ +#line 267 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).expr); } -#line 1786 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1789 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 99: /* block_instr */ -#line 264 "src/ast-parser.y" /* yacc.c:1257 */ +#line 267 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).expr); } -#line 1792 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1795 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 100: /* block */ -#line 254 "src/ast-parser.y" /* yacc.c:1257 */ +#line 257 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).block); } -#line 1798 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1801 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 101: /* expr */ -#line 265 "src/ast-parser.y" /* yacc.c:1257 */ +#line 268 "src/ast-parser.y" /* yacc.c:1257 */ { destroy_expr_list(((*yyvaluep).expr_list).first); } -#line 1804 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1807 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 102: /* expr1 */ -#line 265 "src/ast-parser.y" /* yacc.c:1257 */ +#line 268 "src/ast-parser.y" /* yacc.c:1257 */ { destroy_expr_list(((*yyvaluep).expr_list).first); } -#line 1810 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1813 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 103: /* if_ */ -#line 265 "src/ast-parser.y" /* yacc.c:1257 */ +#line 268 "src/ast-parser.y" /* yacc.c:1257 */ { destroy_expr_list(((*yyvaluep).expr_list).first); } -#line 1816 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1819 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 104: /* instr_list */ -#line 265 "src/ast-parser.y" /* yacc.c:1257 */ +#line 268 "src/ast-parser.y" /* yacc.c:1257 */ { destroy_expr_list(((*yyvaluep).expr_list).first); } -#line 1822 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1825 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 105: /* expr_list */ -#line 265 "src/ast-parser.y" /* yacc.c:1257 */ +#line 268 "src/ast-parser.y" /* yacc.c:1257 */ { destroy_expr_list(((*yyvaluep).expr_list).first); } -#line 1828 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1831 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 106: /* const_expr */ -#line 265 "src/ast-parser.y" /* yacc.c:1257 */ +#line 268 "src/ast-parser.y" /* yacc.c:1257 */ { destroy_expr_list(((*yyvaluep).expr_list).first); } -#line 1834 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1837 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 107: /* func_fields */ -#line 266 "src/ast-parser.y" /* yacc.c:1257 */ +#line 269 "src/ast-parser.y" /* yacc.c:1257 */ { destroy_func_fields(((*yyvaluep).func_fields)); } -#line 1840 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1843 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 108: /* func_body */ -#line 266 "src/ast-parser.y" /* yacc.c:1257 */ +#line 269 "src/ast-parser.y" /* yacc.c:1257 */ { destroy_func_fields(((*yyvaluep).func_fields)); } -#line 1846 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1849 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 109: /* func_info */ -#line 267 "src/ast-parser.y" /* yacc.c:1257 */ +#line 270 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).func); } -#line 1852 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1855 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 110: /* func */ -#line 261 "src/ast-parser.y" /* yacc.c:1257 */ +#line 264 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).exported_func); } -#line 1858 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1861 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 111: /* offset */ -#line 265 "src/ast-parser.y" /* yacc.c:1257 */ +#line 268 "src/ast-parser.y" /* yacc.c:1257 */ { destroy_expr_list(((*yyvaluep).expr_list).first); } -#line 1864 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1867 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 112: /* elem */ -#line 259 "src/ast-parser.y" /* yacc.c:1257 */ +#line 262 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).elem_segment); } -#line 1870 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1873 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 113: /* table */ -#line 263 "src/ast-parser.y" /* yacc.c:1257 */ +#line 266 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).exported_table); } -#line 1876 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1879 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 114: /* data */ -#line 258 "src/ast-parser.y" /* yacc.c:1257 */ +#line 261 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).data_segment); } -#line 1882 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1885 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 115: /* memory */ -#line 262 "src/ast-parser.y" /* yacc.c:1257 */ +#line 265 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).exported_memory); } -#line 1888 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1891 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 117: /* import_kind */ -#line 271 "src/ast-parser.y" /* yacc.c:1257 */ +#line 274 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).import); } -#line 1894 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1897 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 118: /* import */ -#line 271 "src/ast-parser.y" /* yacc.c:1257 */ +#line 274 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).import); } -#line 1900 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1903 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 119: /* inline_import */ -#line 271 "src/ast-parser.y" /* yacc.c:1257 */ +#line 274 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).import); } -#line 1906 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1909 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 120: /* export_kind */ -#line 260 "src/ast-parser.y" /* yacc.c:1257 */ +#line 263 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).export_); } -#line 1912 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1915 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 121: /* export */ -#line 260 "src/ast-parser.y" /* yacc.c:1257 */ +#line 263 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).export_); } -#line 1918 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1921 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 122: /* inline_export_opt */ -#line 272 "src/ast-parser.y" /* yacc.c:1257 */ +#line 275 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).optional_export); } -#line 1924 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1927 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 123: /* inline_export */ -#line 272 "src/ast-parser.y" /* yacc.c:1257 */ +#line 275 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).optional_export); } -#line 1930 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1933 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 124: /* type_def */ -#line 269 "src/ast-parser.y" /* yacc.c:1257 */ +#line 272 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).func_type); } -#line 1936 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1939 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 125: /* start */ -#line 279 "src/ast-parser.y" /* yacc.c:1257 */ +#line 282 "src/ast-parser.y" /* yacc.c:1257 */ { destroy_var(&((*yyvaluep).var)); } -#line 1942 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1945 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 126: /* module_fields */ -#line 274 "src/ast-parser.y" /* yacc.c:1257 */ +#line 277 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).module); } -#line 1948 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1951 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 127: /* raw_module */ -#line 275 "src/ast-parser.y" /* yacc.c:1257 */ +#line 278 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).raw_module); } -#line 1954 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1957 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 128: /* module */ -#line 274 "src/ast-parser.y" /* yacc.c:1257 */ +#line 277 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).module); } -#line 1960 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1963 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 129: /* script_var_opt */ -#line 279 "src/ast-parser.y" /* yacc.c:1257 */ +#line 282 "src/ast-parser.y" /* yacc.c:1257 */ { destroy_var(&((*yyvaluep).var)); } -#line 1966 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1969 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 130: /* action */ -#line 253 "src/ast-parser.y" /* yacc.c:1257 */ +#line 256 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).action); } -#line 1972 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1975 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 131: /* assertion */ -#line 255 "src/ast-parser.y" /* yacc.c:1257 */ +#line 258 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).command); } -#line 1978 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1981 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 132: /* cmd */ -#line 255 "src/ast-parser.y" /* yacc.c:1257 */ +#line 258 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).command); } -#line 1984 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1987 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 133: /* cmd_list */ -#line 256 "src/ast-parser.y" /* yacc.c:1257 */ +#line 259 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).commands); } -#line 1990 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1993 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 135: /* const_list */ -#line 257 "src/ast-parser.y" /* yacc.c:1257 */ +#line 260 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).consts); } -#line 1996 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 1999 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; case 136: /* script */ -#line 276 "src/ast-parser.y" /* yacc.c:1257 */ +#line 279 "src/ast-parser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).script); } -#line 2002 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ +#line 2005 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1257 */ break; @@ -2290,18 +2293,18 @@ yyreduce: switch (yyn) { case 2: -#line 293 "src/ast-parser.y" /* yacc.c:1646 */ +#line 296 "src/ast-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 2301 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2304 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 3: -#line 299 "src/ast-parser.y" /* yacc.c:1646 */ +#line 302 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.text_list) = (yyvsp[-1].text_list); TextListNode* node = new TextListNode(); @@ -2310,17 +2313,17 @@ yyreduce: (yyval.text_list).last->next = node; (yyval.text_list).last = node; } -#line 2314 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2317 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 4: -#line 309 "src/ast-parser.y" /* yacc.c:1646 */ +#line 312 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.text_list).first = (yyval.text_list).last = nullptr; } -#line 2320 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2323 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 6: -#line 314 "src/ast-parser.y" /* yacc.c:1646 */ +#line 317 "src/ast-parser.y" /* yacc.c:1646 */ { TextListNode node; node.text = (yyvsp[0].text); @@ -2334,74 +2337,74 @@ yyreduce: (yyval.text).start = data; (yyval.text).length = size; } -#line 2338 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2341 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 7: -#line 332 "src/ast-parser.y" /* yacc.c:1646 */ +#line 335 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.types) = new TypeVector(); } -#line 2344 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2347 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 8: -#line 333 "src/ast-parser.y" /* yacc.c:1646 */ +#line 336 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.types) = (yyvsp[-1].types); (yyval.types)->push_back((yyvsp[0].type)); } -#line 2353 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2356 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 9: -#line 339 "src/ast-parser.y" /* yacc.c:1646 */ +#line 342 "src/ast-parser.y" /* yacc.c:1646 */ {} -#line 2359 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2362 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 10: -#line 342 "src/ast-parser.y" /* yacc.c:1646 */ +#line 345 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.global) = new Global(); (yyval.global)->type = (yyvsp[0].type); (yyval.global)->mutable_ = false; } -#line 2369 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2372 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 11: -#line 347 "src/ast-parser.y" /* yacc.c:1646 */ +#line 350 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.global) = new Global(); (yyval.global)->type = (yyvsp[-1].type); (yyval.global)->mutable_ = true; } -#line 2379 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2382 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 12: -#line 354 "src/ast-parser.y" /* yacc.c:1646 */ +#line 357 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.func_sig) = (yyvsp[-1].func_sig); } -#line 2385 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2388 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 13: -#line 357 "src/ast-parser.y" /* yacc.c:1646 */ +#line 360 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.func_sig) = new FuncSignature(); } -#line 2391 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2394 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 14: -#line 358 "src/ast-parser.y" /* yacc.c:1646 */ +#line 361 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.func_sig) = new FuncSignature(); (yyval.func_sig)->param_types = std::move(*(yyvsp[-1].types)); delete (yyvsp[-1].types); } -#line 2401 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2404 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 15: -#line 363 "src/ast-parser.y" /* yacc.c:1646 */ +#line 366 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.func_sig) = new FuncSignature(); (yyval.func_sig)->param_types = std::move(*(yyvsp[-5].types)); @@ -2409,65 +2412,65 @@ yyreduce: (yyval.func_sig)->result_types = std::move(*(yyvsp[-1].types)); delete (yyvsp[-1].types); } -#line 2413 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2416 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 16: -#line 370 "src/ast-parser.y" /* yacc.c:1646 */ +#line 373 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.func_sig) = new FuncSignature(); (yyval.func_sig)->result_types = std::move(*(yyvsp[-1].types)); delete (yyvsp[-1].types); } -#line 2423 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2426 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 17: -#line 378 "src/ast-parser.y" /* yacc.c:1646 */ +#line 381 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.table) = new Table(); (yyval.table)->elem_limits = (yyvsp[-1].limits); } -#line 2432 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2435 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 18: -#line 384 "src/ast-parser.y" /* yacc.c:1646 */ +#line 387 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.memory) = new Memory(); (yyval.memory)->page_limits = (yyvsp[0].limits); } -#line 2441 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2444 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 19: -#line 390 "src/ast-parser.y" /* yacc.c:1646 */ +#line 393 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.limits).has_max = false; (yyval.limits).initial = (yyvsp[0].u64); (yyval.limits).max = 0; } -#line 2451 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2454 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 20: -#line 395 "src/ast-parser.y" /* yacc.c:1646 */ +#line 398 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.limits).has_max = true; (yyval.limits).initial = (yyvsp[-1].u64); (yyval.limits).max = (yyvsp[0].u64); } -#line 2461 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2464 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 21: -#line 402 "src/ast-parser.y" /* yacc.c:1646 */ +#line 405 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.var) = (yyvsp[-1].var); } -#line 2467 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2470 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 22: -#line 408 "src/ast-parser.y" /* yacc.c:1646 */ +#line 411 "src/ast-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)))) { @@ -2476,97 +2479,97 @@ yyreduce: WABT_PRINTF_STRING_SLICE_ARG((yyvsp[0].literal).text)); } } -#line 2480 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2483 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 23: -#line 419 "src/ast-parser.y" /* yacc.c:1646 */ +#line 422 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.literal).type = (yyvsp[0].literal).type; DUPTEXT((yyval.literal).text, (yyvsp[0].literal).text); } -#line 2489 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2492 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 24: -#line 423 "src/ast-parser.y" /* yacc.c:1646 */ +#line 426 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.literal).type = (yyvsp[0].literal).type; DUPTEXT((yyval.literal).text, (yyvsp[0].literal).text); } -#line 2498 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2501 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 25: -#line 427 "src/ast-parser.y" /* yacc.c:1646 */ +#line 430 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.literal).type = (yyvsp[0].literal).type; DUPTEXT((yyval.literal).text, (yyvsp[0].literal).text); } -#line 2507 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2510 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 26: -#line 434 "src/ast-parser.y" /* yacc.c:1646 */ +#line 437 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.var).loc = (yylsp[0]); (yyval.var).type = VarType::Index; (yyval.var).index = (yyvsp[0].u64); } -#line 2517 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2520 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 27: -#line 439 "src/ast-parser.y" /* yacc.c:1646 */ +#line 442 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.var).loc = (yylsp[0]); (yyval.var).type = VarType::Name; DUPTEXT((yyval.var).name, (yyvsp[0].text)); } -#line 2527 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2530 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 28: -#line 446 "src/ast-parser.y" /* yacc.c:1646 */ +#line 449 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.vars) = new VarVector(); } -#line 2533 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2536 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 29: -#line 447 "src/ast-parser.y" /* yacc.c:1646 */ +#line 450 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.vars) = (yyvsp[-1].vars); (yyval.vars)->push_back((yyvsp[0].var)); } -#line 2542 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2545 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 30: -#line 453 "src/ast-parser.y" /* yacc.c:1646 */ +#line 456 "src/ast-parser.y" /* yacc.c:1646 */ { WABT_ZERO_MEMORY((yyval.text)); } -#line 2548 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2551 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 32: -#line 457 "src/ast-parser.y" /* yacc.c:1646 */ +#line 460 "src/ast-parser.y" /* yacc.c:1646 */ { DUPTEXT((yyval.text), (yyvsp[0].text)); } -#line 2554 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2557 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 33: -#line 461 "src/ast-parser.y" /* yacc.c:1646 */ +#line 464 "src/ast-parser.y" /* yacc.c:1646 */ { WABT_ZERO_MEMORY((yyval.text)); } -#line 2560 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2563 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 35: -#line 466 "src/ast-parser.y" /* yacc.c:1646 */ +#line 469 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.u64) = 0; } -#line 2566 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2569 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 36: -#line 467 "src/ast-parser.y" /* yacc.c:1646 */ +#line 470 "src/ast-parser.y" /* yacc.c:1646 */ { if (WABT_FAILED(parse_int64((yyvsp[0].text).start, (yyvsp[0].text).start + (yyvsp[0].text).length, &(yyval.u64), ParseIntType::SignedAndUnsigned))) { @@ -2575,17 +2578,17 @@ yyreduce: WABT_PRINTF_STRING_SLICE_ARG((yyvsp[0].text))); } } -#line 2579 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2582 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 37: -#line 477 "src/ast-parser.y" /* yacc.c:1646 */ +#line 480 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.u32) = USE_NATURAL_ALIGNMENT; } -#line 2585 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2588 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 38: -#line 478 "src/ast-parser.y" /* yacc.c:1646 */ +#line 481 "src/ast-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))) { @@ -2594,165 +2597,165 @@ yyreduce: WABT_PRINTF_STRING_SLICE_ARG((yyvsp[0].text))); } } -#line 2598 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2601 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 39: -#line 489 "src/ast-parser.y" /* yacc.c:1646 */ +#line 492 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr_list) = join_exprs1(&(yylsp[0]), (yyvsp[0].expr)); } -#line 2604 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2607 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 40: -#line 490 "src/ast-parser.y" /* yacc.c:1646 */ +#line 493 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr_list) = join_exprs1(&(yylsp[0]), (yyvsp[0].expr)); } -#line 2610 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2613 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 41: -#line 491 "src/ast-parser.y" /* yacc.c:1646 */ +#line 494 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr_list) = (yyvsp[0].expr_list); } -#line 2616 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2619 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 42: -#line 494 "src/ast-parser.y" /* yacc.c:1646 */ +#line 497 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateUnreachable(); } -#line 2624 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2627 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 43: -#line 497 "src/ast-parser.y" /* yacc.c:1646 */ +#line 500 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateNop(); } -#line 2632 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2635 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 44: -#line 500 "src/ast-parser.y" /* yacc.c:1646 */ +#line 503 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateDrop(); } -#line 2640 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2643 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 45: -#line 503 "src/ast-parser.y" /* yacc.c:1646 */ +#line 506 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateSelect(); } -#line 2648 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2651 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 46: -#line 506 "src/ast-parser.y" /* yacc.c:1646 */ +#line 509 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateBr((yyvsp[0].var)); } -#line 2656 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2659 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 47: -#line 509 "src/ast-parser.y" /* yacc.c:1646 */ +#line 512 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateBrIf((yyvsp[0].var)); } -#line 2664 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2667 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 48: -#line 512 "src/ast-parser.y" /* yacc.c:1646 */ +#line 515 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateBrTable((yyvsp[-1].vars), (yyvsp[0].var)); } -#line 2672 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2675 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 49: -#line 515 "src/ast-parser.y" /* yacc.c:1646 */ +#line 518 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateReturn(); } -#line 2680 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2683 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 50: -#line 518 "src/ast-parser.y" /* yacc.c:1646 */ +#line 521 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateCall((yyvsp[0].var)); } -#line 2688 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2691 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 51: -#line 521 "src/ast-parser.y" /* yacc.c:1646 */ +#line 524 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateCallIndirect((yyvsp[0].var)); } -#line 2696 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2699 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 52: -#line 524 "src/ast-parser.y" /* yacc.c:1646 */ +#line 527 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateGetLocal((yyvsp[0].var)); } -#line 2704 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2707 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 53: -#line 527 "src/ast-parser.y" /* yacc.c:1646 */ +#line 530 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateSetLocal((yyvsp[0].var)); } -#line 2712 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2715 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 54: -#line 530 "src/ast-parser.y" /* yacc.c:1646 */ +#line 533 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateTeeLocal((yyvsp[0].var)); } -#line 2720 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2723 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 55: -#line 533 "src/ast-parser.y" /* yacc.c:1646 */ +#line 536 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateGetGlobal((yyvsp[0].var)); } -#line 2728 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2731 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 56: -#line 536 "src/ast-parser.y" /* yacc.c:1646 */ +#line 539 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateSetGlobal((yyvsp[0].var)); } -#line 2736 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2739 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 57: -#line 539 "src/ast-parser.y" /* yacc.c:1646 */ +#line 542 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateLoad((yyvsp[-2].opcode), (yyvsp[0].u32), (yyvsp[-1].u64)); } -#line 2744 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2747 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 58: -#line 542 "src/ast-parser.y" /* yacc.c:1646 */ +#line 545 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateStore((yyvsp[-2].opcode), (yyvsp[0].u32), (yyvsp[-1].u64)); } -#line 2752 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2755 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 59: -#line 545 "src/ast-parser.y" /* yacc.c:1646 */ +#line 548 "src/ast-parser.y" /* yacc.c:1646 */ { Const const_; WABT_ZERO_MEMORY(const_); @@ -2766,145 +2769,145 @@ yyreduce: delete [] (yyvsp[0].literal).text.start; (yyval.expr) = Expr::CreateConst(const_); } -#line 2770 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2773 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 60: -#line 558 "src/ast-parser.y" /* yacc.c:1646 */ +#line 561 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateUnary((yyvsp[0].opcode)); } -#line 2778 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2781 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 61: -#line 561 "src/ast-parser.y" /* yacc.c:1646 */ +#line 564 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateBinary((yyvsp[0].opcode)); } -#line 2786 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2789 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 62: -#line 564 "src/ast-parser.y" /* yacc.c:1646 */ +#line 567 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateCompare((yyvsp[0].opcode)); } -#line 2794 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2797 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 63: -#line 567 "src/ast-parser.y" /* yacc.c:1646 */ +#line 570 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateConvert((yyvsp[0].opcode)); } -#line 2802 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2805 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 64: -#line 570 "src/ast-parser.y" /* yacc.c:1646 */ +#line 573 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateCurrentMemory(); } -#line 2810 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2813 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 65: -#line 573 "src/ast-parser.y" /* yacc.c:1646 */ +#line 576 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateGrowMemory(); } -#line 2818 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2821 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 66: -#line 578 "src/ast-parser.y" /* yacc.c:1646 */ +#line 581 "src/ast-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 2828 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2831 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 67: -#line 583 "src/ast-parser.y" /* yacc.c:1646 */ +#line 586 "src/ast-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 2838 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2841 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 68: -#line 588 "src/ast-parser.y" /* yacc.c:1646 */ +#line 591 "src/ast-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 2848 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2851 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 69: -#line 593 "src/ast-parser.y" /* yacc.c:1646 */ +#line 596 "src/ast-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 2859 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2862 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 70: -#line 601 "src/ast-parser.y" /* yacc.c:1646 */ +#line 604 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.block) = new Block(); (yyval.block)->sig = std::move(*(yyvsp[-1].types)); delete (yyvsp[-1].types); (yyval.block)->first = (yyvsp[0].expr_list).first; } -#line 2870 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2873 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 71: -#line 610 "src/ast-parser.y" /* yacc.c:1646 */ +#line 613 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr_list) = (yyvsp[-1].expr_list); } -#line 2876 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2879 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 72: -#line 614 "src/ast-parser.y" /* yacc.c:1646 */ +#line 617 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr_list) = join_exprs2(&(yylsp[-1]), &(yyvsp[0].expr_list), (yyvsp[-1].expr)); } -#line 2884 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2887 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 73: -#line 617 "src/ast-parser.y" /* yacc.c:1646 */ +#line 620 "src/ast-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 2894 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2897 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 74: -#line 622 "src/ast-parser.y" /* yacc.c:1646 */ +#line 625 "src/ast-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 2904 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2907 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 75: -#line 627 "src/ast-parser.y" /* yacc.c:1646 */ +#line 630 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr_list) = (yyvsp[0].expr_list); Expr* if_ = (yyvsp[0].expr_list).last; @@ -2913,121 +2916,121 @@ yyreduce: if_->if_.true_->sig = std::move(*(yyvsp[-1].types)); delete (yyvsp[-1].types); } -#line 2917 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2920 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 76: -#line 637 "src/ast-parser.y" /* yacc.c:1646 */ +#line 640 "src/ast-parser.y" /* yacc.c:1646 */ { 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 2926 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2929 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 77: -#line 641 "src/ast-parser.y" /* yacc.c:1646 */ +#line 644 "src/ast-parser.y" /* yacc.c:1646 */ { Expr* expr = Expr::CreateIf(new Block((yyvsp[-1].expr_list).first), nullptr); (yyval.expr_list) = join_exprs1(&(yylsp[-3]), expr); } -#line 2935 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2938 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 78: -#line 645 "src/ast-parser.y" /* yacc.c:1646 */ +#line 648 "src/ast-parser.y" /* yacc.c:1646 */ { 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 2944 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2947 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 79: -#line 649 "src/ast-parser.y" /* yacc.c:1646 */ +#line 652 "src/ast-parser.y" /* yacc.c:1646 */ { 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 2953 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2956 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 80: -#line 653 "src/ast-parser.y" /* yacc.c:1646 */ +#line 656 "src/ast-parser.y" /* yacc.c:1646 */ { 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 2962 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2965 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 81: -#line 657 "src/ast-parser.y" /* yacc.c:1646 */ +#line 660 "src/ast-parser.y" /* yacc.c:1646 */ { 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 2971 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2974 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 82: -#line 664 "src/ast-parser.y" /* yacc.c:1646 */ +#line 667 "src/ast-parser.y" /* yacc.c:1646 */ { WABT_ZERO_MEMORY((yyval.expr_list)); } -#line 2977 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2980 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 83: -#line 665 "src/ast-parser.y" /* yacc.c:1646 */ +#line 668 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr_list).first = (yyvsp[-1].expr_list).first; (yyvsp[-1].expr_list).last->next = (yyvsp[0].expr_list).first; (yyval.expr_list).last = (yyvsp[0].expr_list).last ? (yyvsp[0].expr_list).last : (yyvsp[-1].expr_list).last; (yyval.expr_list).size = (yyvsp[-1].expr_list).size + (yyvsp[0].expr_list).size; } -#line 2988 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2991 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 84: -#line 673 "src/ast-parser.y" /* yacc.c:1646 */ +#line 676 "src/ast-parser.y" /* yacc.c:1646 */ { WABT_ZERO_MEMORY((yyval.expr_list)); } -#line 2994 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 2997 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 85: -#line 674 "src/ast-parser.y" /* yacc.c:1646 */ +#line 677 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr_list).first = (yyvsp[-1].expr_list).first; (yyvsp[-1].expr_list).last->next = (yyvsp[0].expr_list).first; (yyval.expr_list).last = (yyvsp[0].expr_list).last ? (yyvsp[0].expr_list).last : (yyvsp[-1].expr_list).last; (yyval.expr_list).size = (yyvsp[-1].expr_list).size + (yyvsp[0].expr_list).size; } -#line 3005 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3008 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 88: -#line 688 "src/ast-parser.y" /* yacc.c:1646 */ +#line 691 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.func_fields) = new FuncField(); (yyval.func_fields)->type = FuncFieldType::ResultTypes; (yyval.func_fields)->types = (yyvsp[-2].types); (yyval.func_fields)->next = (yyvsp[0].func_fields); } -#line 3016 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3019 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 89: -#line 694 "src/ast-parser.y" /* yacc.c:1646 */ +#line 697 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.func_fields) = new FuncField(); (yyval.func_fields)->type = FuncFieldType::ParamTypes; (yyval.func_fields)->types = (yyvsp[-2].types); (yyval.func_fields)->next = (yyvsp[0].func_fields); } -#line 3027 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3030 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 90: -#line 700 "src/ast-parser.y" /* yacc.c:1646 */ +#line 703 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.func_fields) = new FuncField(); (yyval.func_fields)->type = FuncFieldType::BoundParam; @@ -3036,33 +3039,33 @@ yyreduce: (yyval.func_fields)->bound_type.type = (yyvsp[-2].type); (yyval.func_fields)->next = (yyvsp[0].func_fields); } -#line 3040 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3043 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 91: -#line 710 "src/ast-parser.y" /* yacc.c:1646 */ +#line 713 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.func_fields) = new FuncField(); (yyval.func_fields)->type = FuncFieldType::Exprs; (yyval.func_fields)->first_expr = (yyvsp[0].expr_list).first; (yyval.func_fields)->next = nullptr; } -#line 3051 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3054 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 92: -#line 716 "src/ast-parser.y" /* yacc.c:1646 */ +#line 719 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.func_fields) = new FuncField(); (yyval.func_fields)->type = FuncFieldType::LocalTypes; (yyval.func_fields)->types = (yyvsp[-2].types); (yyval.func_fields)->next = (yyvsp[0].func_fields); } -#line 3062 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3065 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 93: -#line 722 "src/ast-parser.y" /* yacc.c:1646 */ +#line 725 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.func_fields) = new FuncField(); (yyval.func_fields)->type = FuncFieldType::BoundLocal; @@ -3071,11 +3074,11 @@ yyreduce: (yyval.func_fields)->bound_type.type = (yyvsp[-2].type); (yyval.func_fields)->next = (yyvsp[0].func_fields); } -#line 3075 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3078 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 94: -#line 732 "src/ast-parser.y" /* yacc.c:1646 */ +#line 735 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.func) = new Func(); FuncField* field = (yyvsp[0].func_fields); @@ -3126,11 +3129,11 @@ yyreduce: field = next; } } -#line 3130 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3133 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 95: -#line 784 "src/ast-parser.y" /* yacc.c:1646 */ +#line 787 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.exported_func) = new ExportedFunc(); (yyval.exported_func)->func.reset((yyvsp[-1].func)); @@ -3140,11 +3143,11 @@ yyreduce: (yyval.exported_func)->export_ = std::move(*(yyvsp[-3].optional_export)); delete (yyvsp[-3].optional_export); } -#line 3144 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3147 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 96: -#line 794 "src/ast-parser.y" /* yacc.c:1646 */ +#line 797 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.exported_func) = new ExportedFunc(); (yyval.exported_func)->func.reset((yyvsp[-1].func)); @@ -3152,11 +3155,11 @@ yyreduce: (yyval.exported_func)->func->decl.type_var = (yyvsp[-2].var); (yyval.exported_func)->func->name = (yyvsp[-3].text); } -#line 3156 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3159 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 97: -#line 801 "src/ast-parser.y" /* yacc.c:1646 */ +#line 804 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.exported_func) = new ExportedFunc(); (yyval.exported_func)->func.reset((yyvsp[-1].func)); @@ -3164,29 +3167,29 @@ yyreduce: (yyval.exported_func)->export_ = std::move(*(yyvsp[-2].optional_export)); delete (yyvsp[-2].optional_export); } -#line 3168 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3171 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 98: -#line 809 "src/ast-parser.y" /* yacc.c:1646 */ +#line 812 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.exported_func) = new ExportedFunc(); (yyval.exported_func)->func.reset((yyvsp[-1].func)); (yyval.exported_func)->func->name = (yyvsp[-2].text); } -#line 3178 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3181 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 99: -#line 819 "src/ast-parser.y" /* yacc.c:1646 */ +#line 822 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.expr_list) = (yyvsp[-1].expr_list); } -#line 3186 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3189 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 101: -#line 826 "src/ast-parser.y" /* yacc.c:1646 */ +#line 829 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.elem_segment) = new ElemSegment(); (yyval.elem_segment)->table_var = (yyvsp[-3].var); @@ -3194,11 +3197,11 @@ yyreduce: (yyval.elem_segment)->vars = std::move(*(yyvsp[-1].vars)); delete (yyvsp[-1].vars); } -#line 3198 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3201 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 102: -#line 833 "src/ast-parser.y" /* yacc.c:1646 */ +#line 836 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.elem_segment) = new ElemSegment(); (yyval.elem_segment)->table_var.loc = (yylsp[-3]); @@ -3208,11 +3211,11 @@ yyreduce: (yyval.elem_segment)->vars = std::move(*(yyvsp[-1].vars)); delete (yyvsp[-1].vars); } -#line 3212 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3215 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 103: -#line 845 "src/ast-parser.y" /* yacc.c:1646 */ +#line 848 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.exported_table) = new ExportedTable(); (yyval.exported_table)->table.reset((yyvsp[-1].table)); @@ -3221,11 +3224,11 @@ yyreduce: (yyval.exported_table)->export_ = std::move(*(yyvsp[-2].optional_export)); delete (yyvsp[-2].optional_export); } -#line 3225 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3228 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 104: -#line 854 "src/ast-parser.y" /* yacc.c:1646 */ +#line 857 "src/ast-parser.y" /* yacc.c:1646 */ { Expr* expr = Expr::CreateConst(Const(Const::I32(), 0)); expr->loc = (yylsp[-8]); @@ -3244,11 +3247,11 @@ yyreduce: (yyval.exported_table)->export_ = std::move(*(yyvsp[-6].optional_export)); delete (yyvsp[-6].optional_export); } -#line 3248 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3251 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 105: -#line 875 "src/ast-parser.y" /* yacc.c:1646 */ +#line 878 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.data_segment) = new DataSegment(); (yyval.data_segment)->memory_var = (yyvsp[-3].var); @@ -3256,11 +3259,11 @@ yyreduce: dup_text_list(&(yyvsp[-1].text_list), &(yyval.data_segment)->data, &(yyval.data_segment)->size); destroy_text_list(&(yyvsp[-1].text_list)); } -#line 3260 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3263 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 106: -#line 882 "src/ast-parser.y" /* yacc.c:1646 */ +#line 885 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.data_segment) = new DataSegment(); (yyval.data_segment)->memory_var.loc = (yylsp[-3]); @@ -3270,11 +3273,11 @@ yyreduce: dup_text_list(&(yyvsp[-1].text_list), &(yyval.data_segment)->data, &(yyval.data_segment)->size); destroy_text_list(&(yyvsp[-1].text_list)); } -#line 3274 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3277 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 107: -#line 894 "src/ast-parser.y" /* yacc.c:1646 */ +#line 897 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.exported_memory) = new ExportedMemory(); (yyval.exported_memory)->memory.reset((yyvsp[-1].memory)); @@ -3283,11 +3286,11 @@ yyreduce: (yyval.exported_memory)->export_ = std::move(*(yyvsp[-2].optional_export)); delete (yyvsp[-2].optional_export); } -#line 3287 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3290 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 108: -#line 902 "src/ast-parser.y" /* yacc.c:1646 */ +#line 905 "src/ast-parser.y" /* yacc.c:1646 */ { Expr* expr = Expr::CreateConst(Const(Const::I32(), 0)); expr->loc = (yylsp[-7]); @@ -3308,11 +3311,11 @@ yyreduce: (yyval.exported_memory)->export_ = std::move(*(yyvsp[-5].optional_export)); delete (yyvsp[-5].optional_export); } -#line 3312 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3315 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 109: -#line 923 "src/ast-parser.y" /* yacc.c:1646 */ +#line 926 "src/ast-parser.y" /* yacc.c:1646 */ { Expr* expr = Expr::CreateConst(Const(Const::I32(), 0)); expr->loc = (yylsp[-6]); @@ -3332,11 +3335,11 @@ yyreduce: (yyval.exported_memory)->memory->page_limits.has_max = true; (yyval.exported_memory)->export_.has_export = false; } -#line 3336 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3339 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 110: -#line 945 "src/ast-parser.y" /* yacc.c:1646 */ +#line 948 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.exported_global) = new ExportedGlobal(); (yyval.exported_global)->global.reset((yyvsp[-2].global)); @@ -3345,11 +3348,11 @@ yyreduce: (yyval.exported_global)->export_ = std::move(*(yyvsp[-3].optional_export)); delete (yyvsp[-3].optional_export); } -#line 3349 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3352 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 111: -#line 953 "src/ast-parser.y" /* yacc.c:1646 */ +#line 956 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.exported_global) = new ExportedGlobal(); (yyval.exported_global)->global.reset((yyvsp[-2].global)); @@ -3357,11 +3360,11 @@ yyreduce: (yyval.exported_global)->global->init_expr = (yyvsp[-1].expr_list).first; (yyval.exported_global)->export_.has_export = false; } -#line 3361 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3364 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 112: -#line 966 "src/ast-parser.y" /* yacc.c:1646 */ +#line 969 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.import) = new Import(); (yyval.import)->kind = ExternalKind::Func; @@ -3370,11 +3373,11 @@ yyreduce: (yyval.import)->func->decl.has_func_type = true; (yyval.import)->func->decl.type_var = (yyvsp[-1].var); } -#line 3374 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3377 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 113: -#line 974 "src/ast-parser.y" /* yacc.c:1646 */ +#line 977 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.import) = new Import(); (yyval.import)->kind = ExternalKind::Func; @@ -3383,54 +3386,54 @@ yyreduce: (yyval.import)->func->decl.sig = std::move(*(yyvsp[-1].func_sig)); delete (yyvsp[-1].func_sig); } -#line 3387 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3390 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 114: -#line 982 "src/ast-parser.y" /* yacc.c:1646 */ +#line 985 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.import) = new Import(); (yyval.import)->kind = ExternalKind::Table; (yyval.import)->table = (yyvsp[-1].table); (yyval.import)->table->name = (yyvsp[-2].text); } -#line 3398 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3401 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 115: -#line 988 "src/ast-parser.y" /* yacc.c:1646 */ +#line 991 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.import) = new Import(); (yyval.import)->kind = ExternalKind::Memory; (yyval.import)->memory = (yyvsp[-1].memory); (yyval.import)->memory->name = (yyvsp[-2].text); } -#line 3409 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3412 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 116: -#line 994 "src/ast-parser.y" /* yacc.c:1646 */ +#line 997 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.import) = new Import(); (yyval.import)->kind = ExternalKind::Global; (yyval.import)->global = (yyvsp[-1].global); (yyval.import)->global->name = (yyvsp[-2].text); } -#line 3420 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3423 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 117: -#line 1002 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1005 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.import) = (yyvsp[-1].import); (yyval.import)->module_name = (yyvsp[-3].text); (yyval.import)->field_name = (yyvsp[-2].text); } -#line 3430 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3433 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 118: -#line 1007 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1010 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.import) = (yyvsp[-2].import); (yyval.import)->kind = ExternalKind::Func; @@ -3439,11 +3442,11 @@ yyreduce: (yyval.import)->func->decl.has_func_type = true; (yyval.import)->func->decl.type_var = (yyvsp[-1].var); } -#line 3443 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3446 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 119: -#line 1015 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1018 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.import) = (yyvsp[-2].import); (yyval.import)->kind = ExternalKind::Func; @@ -3452,158 +3455,158 @@ yyreduce: (yyval.import)->func->decl.sig = std::move(*(yyvsp[-1].func_sig)); delete (yyvsp[-1].func_sig); } -#line 3456 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3459 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 120: -#line 1023 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1026 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.import) = (yyvsp[-2].import); (yyval.import)->kind = ExternalKind::Table; (yyval.import)->table = (yyvsp[-1].table); (yyval.import)->table->name = (yyvsp[-3].text); } -#line 3467 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3470 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 121: -#line 1029 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1032 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.import) = (yyvsp[-2].import); (yyval.import)->kind = ExternalKind::Memory; (yyval.import)->memory = (yyvsp[-1].memory); (yyval.import)->memory->name = (yyvsp[-3].text); } -#line 3478 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3481 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 122: -#line 1035 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1038 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.import) = (yyvsp[-2].import); (yyval.import)->kind = ExternalKind::Global; (yyval.import)->global = (yyvsp[-1].global); (yyval.import)->global->name = (yyvsp[-3].text); } -#line 3489 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3492 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 123: -#line 1044 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1047 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.import) = new Import(); (yyval.import)->module_name = (yyvsp[-2].text); (yyval.import)->field_name = (yyvsp[-1].text); } -#line 3499 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3502 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 124: -#line 1052 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1055 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.export_) = new Export(); (yyval.export_)->kind = ExternalKind::Func; (yyval.export_)->var = (yyvsp[-1].var); } -#line 3509 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3512 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 125: -#line 1057 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1060 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.export_) = new Export(); (yyval.export_)->kind = ExternalKind::Table; (yyval.export_)->var = (yyvsp[-1].var); } -#line 3519 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3522 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 126: -#line 1062 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1065 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.export_) = new Export(); (yyval.export_)->kind = ExternalKind::Memory; (yyval.export_)->var = (yyvsp[-1].var); } -#line 3529 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3532 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 127: -#line 1067 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1070 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.export_) = new Export(); (yyval.export_)->kind = ExternalKind::Global; (yyval.export_)->var = (yyvsp[-1].var); } -#line 3539 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3542 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 128: -#line 1074 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1077 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.export_) = (yyvsp[-1].export_); (yyval.export_)->name = (yyvsp[-2].text); } -#line 3548 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3551 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 129: -#line 1081 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1084 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.optional_export) = new OptionalExport(); (yyval.optional_export)->has_export = false; } -#line 3557 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3560 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 131: -#line 1088 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1091 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.optional_export) = new OptionalExport(); (yyval.optional_export)->has_export = true; (yyval.optional_export)->export_.reset(new Export()); (yyval.optional_export)->export_->name = (yyvsp[-1].text); } -#line 3568 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3571 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 132: -#line 1100 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1103 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.func_type) = new FuncType(); (yyval.func_type)->sig = std::move(*(yyvsp[-1].func_sig)); delete (yyvsp[-1].func_sig); } -#line 3578 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3581 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 133: -#line 1105 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1108 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.func_type) = new FuncType(); (yyval.func_type)->name = (yyvsp[-2].text); (yyval.func_type)->sig = std::move(*(yyvsp[-1].func_sig)); delete (yyvsp[-1].func_sig); } -#line 3589 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3592 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 134: -#line 1114 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1117 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.var) = (yyvsp[-1].var); } -#line 3595 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3598 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 135: -#line 1118 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1121 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.module) = new Module(); } -#line 3603 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3606 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 136: -#line 1121 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1124 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.module) = (yyvsp[-1].module); ModuleField* field; @@ -3611,11 +3614,11 @@ yyreduce: APPEND_ITEM_TO_VECTOR((yyval.module), func_types, field->func_type); INSERT_BINDING((yyval.module), func_type, func_types, (yylsp[0]), (yyvsp[0].func_type)->name); } -#line 3615 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3618 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 137: -#line 1128 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1131 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.module) = (yyvsp[-1].module); ModuleField* field; @@ -3625,11 +3628,11 @@ yyreduce: APPEND_INLINE_EXPORT((yyval.module), Global, (yylsp[0]), (yyvsp[0].exported_global), (yyval.module)->globals.size() - 1); delete (yyvsp[0].exported_global); } -#line 3629 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3632 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 138: -#line 1137 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1140 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.module) = (yyvsp[-1].module); ModuleField* field; @@ -3647,11 +3650,11 @@ yyreduce: } delete (yyvsp[0].exported_table); } -#line 3651 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3654 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 139: -#line 1154 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1157 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.module) = (yyvsp[-1].module); ModuleField* field; @@ -3669,11 +3672,11 @@ yyreduce: } delete (yyvsp[0].exported_memory); } -#line 3673 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3676 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 140: -#line 1171 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1174 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.module) = (yyvsp[-1].module); ModuleField* field; @@ -3686,44 +3689,44 @@ yyreduce: APPEND_INLINE_EXPORT((yyval.module), Func, (yylsp[0]), (yyvsp[0].exported_func), (yyval.module)->funcs.size() - 1); delete (yyvsp[0].exported_func); } -#line 3690 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3693 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 141: -#line 1183 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1186 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.module) = (yyvsp[-1].module); ModuleField* field; APPEND_FIELD_TO_LIST((yyval.module), field, ElemSegment, elem_segment, (yylsp[0]), (yyvsp[0].elem_segment)); APPEND_ITEM_TO_VECTOR((yyval.module), elem_segments, field->elem_segment); } -#line 3701 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3704 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 142: -#line 1189 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1192 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.module) = (yyvsp[-1].module); ModuleField* field; APPEND_FIELD_TO_LIST((yyval.module), field, DataSegment, data_segment, (yylsp[0]), (yyvsp[0].data_segment)); APPEND_ITEM_TO_VECTOR((yyval.module), data_segments, field->data_segment); } -#line 3712 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3715 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 143: -#line 1195 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1198 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.module) = (yyvsp[-1].module); ModuleField* field; APPEND_FIELD_TO_LIST((yyval.module), field, Start, start, (yylsp[0]), (yyvsp[0].var)); (yyval.module)->start = &field->start; } -#line 3723 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3726 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 144: -#line 1201 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1204 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.module) = (yyvsp[-1].module); ModuleField* field; @@ -3757,11 +3760,11 @@ yyreduce: } APPEND_ITEM_TO_VECTOR((yyval.module), imports, field->import); } -#line 3761 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3764 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 145: -#line 1234 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1237 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.module) = (yyvsp[-1].module); ModuleField* field; @@ -3769,11 +3772,11 @@ yyreduce: APPEND_ITEM_TO_VECTOR((yyval.module), exports, field->export_); INSERT_BINDING((yyval.module), export, exports, (yylsp[0]), field->export_->name); } -#line 3773 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3776 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 146: -#line 1244 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1247 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.raw_module) = new RawModule(); (yyval.raw_module)->type = RawModuleType::Text; @@ -3794,11 +3797,11 @@ yyreduce: } } } -#line 3798 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3801 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 147: -#line 1264 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1267 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.raw_module) = new RawModule(); (yyval.raw_module)->type = RawModuleType::Binary; @@ -3807,11 +3810,11 @@ yyreduce: dup_text_list(&(yyvsp[-1].text_list), &(yyval.raw_module)->binary.data, &(yyval.raw_module)->binary.size); destroy_text_list(&(yyvsp[-1].text_list)); } -#line 3811 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3814 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 148: -#line 1275 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1278 "src/ast-parser.y" /* yacc.c:1646 */ { if ((yyvsp[0].raw_module)->type == RawModuleType::Text) { (yyval.module) = (yyvsp[0].raw_module)->text; @@ -3820,13 +3823,7 @@ yyreduce: assert((yyvsp[0].raw_module)->type == RawModuleType::Binary); (yyval.module) = new Module(); ReadBinaryOptions options = WABT_READ_BINARY_OPTIONS_DEFAULT; - BinaryErrorCallbackData user_data; - user_data.loc = &(yyvsp[0].raw_module)->binary.loc; - user_data.lexer = lexer; - user_data.parser = parser; - BinaryErrorHandler error_handler; - error_handler.on_error = on_read_binary_error; - error_handler.user_data = &user_data; + BinaryErrorHandlerModule error_handler(&(yyvsp[0].raw_module)->binary.loc, lexer, parser); read_binary_ast((yyvsp[0].raw_module)->binary.data, (yyvsp[0].raw_module)->binary.size, &options, &error_handler, (yyval.module)); (yyval.module)->name = (yyvsp[0].raw_module)->binary.name; @@ -3835,31 +3832,31 @@ yyreduce: } delete (yyvsp[0].raw_module); } -#line 3839 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3836 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 149: -#line 1303 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1300 "src/ast-parser.y" /* yacc.c:1646 */ { WABT_ZERO_MEMORY((yyval.var)); (yyval.var).type = VarType::Index; (yyval.var).index = INVALID_VAR_INDEX; } -#line 3849 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3846 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 150: -#line 1308 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1305 "src/ast-parser.y" /* yacc.c:1646 */ { WABT_ZERO_MEMORY((yyval.var)); (yyval.var).type = VarType::Name; DUPTEXT((yyval.var).name, (yyvsp[0].text)); } -#line 3859 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3856 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 151: -#line 1316 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1313 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.action) = new Action(); (yyval.action)->loc = (yylsp[-4]); @@ -3870,11 +3867,11 @@ yyreduce: (yyval.action)->invoke->args = std::move(*(yyvsp[-1].consts)); delete (yyvsp[-1].consts); } -#line 3874 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3871 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 152: -#line 1326 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1323 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.action) = new Action(); (yyval.action)->loc = (yylsp[-3]); @@ -3882,128 +3879,128 @@ yyreduce: (yyval.action)->type = ActionType::Get; (yyval.action)->name = (yyvsp[-1].text); } -#line 3886 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3883 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 153: -#line 1336 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1333 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new Command(); (yyval.command)->type = CommandType::AssertMalformed; (yyval.command)->assert_malformed.module = (yyvsp[-2].raw_module); (yyval.command)->assert_malformed.text = (yyvsp[-1].text); } -#line 3897 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3894 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 154: -#line 1342 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1339 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new Command(); (yyval.command)->type = CommandType::AssertInvalid; (yyval.command)->assert_invalid.module = (yyvsp[-2].raw_module); (yyval.command)->assert_invalid.text = (yyvsp[-1].text); } -#line 3908 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3905 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 155: -#line 1348 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1345 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new Command(); (yyval.command)->type = CommandType::AssertUnlinkable; (yyval.command)->assert_unlinkable.module = (yyvsp[-2].raw_module); (yyval.command)->assert_unlinkable.text = (yyvsp[-1].text); } -#line 3919 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3916 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 156: -#line 1354 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1351 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new Command(); (yyval.command)->type = CommandType::AssertUninstantiable; (yyval.command)->assert_uninstantiable.module = (yyvsp[-2].raw_module); (yyval.command)->assert_uninstantiable.text = (yyvsp[-1].text); } -#line 3930 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3927 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 157: -#line 1360 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1357 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new Command(); (yyval.command)->type = CommandType::AssertReturn; (yyval.command)->assert_return.action = (yyvsp[-2].action); (yyval.command)->assert_return.expected = (yyvsp[-1].consts); } -#line 3941 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3938 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 158: -#line 1366 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1363 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new Command(); (yyval.command)->type = CommandType::AssertReturnCanonicalNan; (yyval.command)->assert_return_canonical_nan.action = (yyvsp[-1].action); } -#line 3951 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3948 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 159: -#line 1371 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1368 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new Command(); (yyval.command)->type = CommandType::AssertReturnArithmeticNan; (yyval.command)->assert_return_arithmetic_nan.action = (yyvsp[-1].action); } -#line 3961 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3958 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 160: -#line 1376 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1373 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new Command(); (yyval.command)->type = CommandType::AssertTrap; (yyval.command)->assert_trap.action = (yyvsp[-2].action); (yyval.command)->assert_trap.text = (yyvsp[-1].text); } -#line 3972 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3969 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 161: -#line 1382 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1379 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new Command(); (yyval.command)->type = CommandType::AssertExhaustion; (yyval.command)->assert_trap.action = (yyvsp[-2].action); (yyval.command)->assert_trap.text = (yyvsp[-1].text); } -#line 3983 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3980 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 162: -#line 1391 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1388 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new Command(); (yyval.command)->type = CommandType::Action; (yyval.command)->action = (yyvsp[0].action); } -#line 3993 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 3990 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 164: -#line 1397 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1394 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new Command(); (yyval.command)->type = CommandType::Module; (yyval.command)->module = (yyvsp[0].module); } -#line 4003 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 4000 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 165: -#line 1402 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1399 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new Command(); (yyval.command)->type = CommandType::Register; @@ -4011,26 +4008,26 @@ yyreduce: (yyval.command)->register_.var = (yyvsp[-1].var); (yyval.command)->register_.var.loc = (yylsp[-1]); } -#line 4015 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 4012 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 166: -#line 1411 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1408 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.commands) = new CommandPtrVector(); } -#line 4021 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 4018 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 167: -#line 1412 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1409 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.commands) = (yyvsp[-1].commands); (yyval.commands)->emplace_back((yyvsp[0].command)); } -#line 4030 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 4027 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 168: -#line 1419 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1416 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.const_).loc = (yylsp[-2]); if (WABT_FAILED(parse_const((yyvsp[-2].type), (yyvsp[-1].literal).type, (yyvsp[-1].literal).text.start, @@ -4041,26 +4038,26 @@ yyreduce: } delete [] (yyvsp[-1].literal).text.start; } -#line 4045 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 4042 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 169: -#line 1431 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1428 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.consts) = new ConstVector(); } -#line 4051 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 4048 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 170: -#line 1432 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1429 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.consts) = (yyvsp[-1].consts); (yyval.consts)->push_back((yyvsp[0].const_)); } -#line 4060 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 4057 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; case 171: -#line 1439 "src/ast-parser.y" /* yacc.c:1646 */ +#line 1436 "src/ast-parser.y" /* yacc.c:1646 */ { (yyval.script) = new Script(); (yyval.script)->commands = std::move(*(yyvsp[0].commands)); @@ -4122,11 +4119,11 @@ yyreduce: } parser->script = (yyval.script); } -#line 4126 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 4123 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ break; -#line 4130 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ +#line 4127 "src/prebuilt/ast-parser-gen.cc" /* yacc.c:1646 */ default: break; } /* User semantic actions sometimes alter yychar, and that requires @@ -4361,7 +4358,7 @@ yyreturn: #endif return yyresult; } -#line 1508 "src/ast-parser.y" /* yacc.c:1906 */ +#line 1505 "src/ast-parser.y" /* yacc.c:1906 */ void append_expr_list(ExprList* expr_list, ExprList* expr) { @@ -4525,14 +4522,19 @@ Result parse_ast(AstLexer* lexer, Script** out_script, return result == 0 && parser.errors == 0 ? Result::Ok : Result::Error; } -bool on_read_binary_error(uint32_t offset, const char* error, void* user_data) { - BinaryErrorCallbackData* data = (BinaryErrorCallbackData*)user_data; +BinaryErrorHandlerModule::BinaryErrorHandlerModule( + Location* loc, AstLexer* lexer, AstParser* parser) + : loc_(loc), lexer_(lexer), parser_(parser) {} + +bool BinaryErrorHandlerModule::OnError(uint32_t offset, + const std::string& error) { if (offset == WABT_UNKNOWN_OFFSET) { - ast_parser_error(data->loc, data->lexer, data->parser, - "error in binary module: %s", error); + ast_parser_error(loc_, lexer_, parser_, "error in binary module: %s", + error.c_str()); } else { - ast_parser_error(data->loc, data->lexer, data->parser, - "error in binary module: @0x%08x: %s", offset, error); + ast_parser_error(loc_, lexer_, parser_, + "error in binary module: @0x%08x: %s", offset, + error.c_str()); } return true; } diff --git a/src/prebuilt/ast-parser-gen.hh b/src/prebuilt/ast-parser-gen.hh index 99b19c83..53b5e4e3 100644 --- a/src/prebuilt/ast-parser-gen.hh +++ b/src/prebuilt/ast-parser-gen.hh @@ -1,8 +1,8 @@ -/* A Bison parser, made by GNU Bison 3.0.4. */ +/* A Bison parser, made by GNU Bison 3.0.2. */ /* Bison interface for Yacc-like parsers in C - Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. + Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/src/resolve-names.cc b/src/resolve-names.cc index b20d1d78..c759b718 100644 --- a/src/resolve-names.cc +++ b/src/resolve-names.cc @@ -338,15 +338,6 @@ static void visit_raw_module(Context* ctx, RawModule* raw_module) { visit_module(ctx, raw_module->text); } -static bool dummy_source_error_callback(const Location* loc, - const char* error, - const char* source_line, - size_t source_line_length, - size_t source_line_column_offset, - void* user_data) { - return false; -} - static void visit_command(Context* ctx, Command* command) { switch (command->type) { case CommandType::Module: @@ -373,10 +364,7 @@ static void visit_command(Context* ctx, Command* command) { /* The module may be invalid because the names cannot be resolved; we * don't want to print errors or fail if that's the case, but we still * should try to resolve names when possible. */ - SourceErrorHandler new_error_handler; - new_error_handler.on_error = dummy_source_error_callback; - new_error_handler.source_line_max_length = - ctx->error_handler->source_line_max_length; + SourceErrorHandlerNop new_error_handler; Context new_ctx; new_ctx.error_handler = &new_error_handler; diff --git a/src/resolve-names.h b/src/resolve-names.h index db98342f..f6cded1d 100644 --- a/src/resolve-names.h +++ b/src/resolve-names.h @@ -24,15 +24,10 @@ namespace wabt { struct AstLexer; struct Module; struct Script; -struct SourceErrorHandler; +class SourceErrorHandler; -Result resolve_names_module(struct AstLexer*, - struct Module*, - struct SourceErrorHandler*); - -Result resolve_names_script(struct AstLexer*, - struct Script*, - struct SourceErrorHandler*); +Result resolve_names_module(AstLexer*, Module*, SourceErrorHandler*); +Result resolve_names_script(AstLexer*, Script*, SourceErrorHandler*); } // namespace wabt diff --git a/src/source-error-handler.cc b/src/source-error-handler.cc new file mode 100644 index 00000000..32976b77 --- /dev/null +++ b/src/source-error-handler.cc @@ -0,0 +1,85 @@ +/* + * Copyright 2017 WebAssembly Community Group participants + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "source-error-handler.h" + +#include <algorithm> + +namespace wabt { + +std::string SourceErrorHandler::DefaultErrorMessage( + const Location* loc, + const std::string& error, + const std::string& source_line, + size_t source_line_column_offset) { + std::string result = string_printf("%s:%d:%d: %s\n", loc->filename, loc->line, + loc->first_column, error.c_str()); + if (!source_line.empty()) { + result += source_line; + result += '\n'; + + size_t num_spaces = (loc->first_column - 1) - source_line_column_offset; + size_t num_carets = loc->last_column - loc->first_column; + num_carets = std::min(num_carets, source_line.size() - num_spaces); + num_carets = std::max<size_t>(num_carets, 1); + result.append(num_spaces, ' '); + result.append(num_carets, '^'); + result += '\n'; + } + return result; +} + +SourceErrorHandlerFile::SourceErrorHandlerFile(FILE* file, + const std::string& header, + PrintHeader print_header, + size_t source_line_max_length) + : file_(file), + header_(header), + print_header_(print_header), + source_line_max_length_(source_line_max_length) {} + +bool SourceErrorHandlerFile::OnError(const Location* loc, + const std::string& error, + const std::string& source_line, + size_t source_line_column_offset) { + PrintErrorHeader(); + std::string message = + DefaultErrorMessage(loc, error, source_line, source_line_column_offset); + fwrite(message.data(), 1, message.size(), file_); + return true; +} + +void SourceErrorHandlerFile::PrintErrorHeader() { + if (header_.empty()) + return; + + switch (print_header_) { + case PrintHeader::Never: + break; + + case PrintHeader::Once: + print_header_ = PrintHeader::Never; + // Fallthrough. + + case PrintHeader::Always: + fprintf(file_, "%s:\n", header_.c_str()); + break; + } + // If there's a header, indent the following message. + fprintf(file_, " "); +} + +} // namespace wabt diff --git a/src/source-error-handler.h b/src/source-error-handler.h new file mode 100644 index 00000000..eaa50300 --- /dev/null +++ b/src/source-error-handler.h @@ -0,0 +1,91 @@ +/* + * Copyright 2017 WebAssembly Community Group participants + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef WABT_SOURCE_ERROR_HANDLER_H_ +#define WABT_SOURCE_ERROR_HANDLER_H_ + +#include <string> + +#include "common.h" + +namespace wabt { + +class SourceErrorHandler { + public: + virtual ~SourceErrorHandler() {} + + // Returns true if the error was handled. + virtual bool OnError(const Location*, + const std::string& error, + const std::string& source_line, + size_t source_line_column_offset) = 0; + + // OnError will be called with with source_line trimmed to this length. + virtual size_t source_line_max_length() const = 0; + + std::string DefaultErrorMessage(const Location*, + const std::string& error, + const std::string& source_line, + size_t source_line_column_offset); +}; + +class SourceErrorHandlerNop : public SourceErrorHandler { + public: + bool OnError(const Location*, + const std::string& error, + const std::string& source_line, + size_t source_line_column_offset) override { + return false; + } + + size_t source_line_max_length() const override { return 80; } +}; + +class SourceErrorHandlerFile : public SourceErrorHandler { + public: + enum class PrintHeader { + Never, + Once, + Always, + }; + + SourceErrorHandlerFile(FILE* file = stderr, + const std::string& header = std::string(), + PrintHeader print_header = PrintHeader::Never, + size_t source_line_max_length = 80); + + bool OnError(const Location*, + const std::string& error, + const std::string& source_line, + size_t source_line_column_offset) override; + + size_t source_line_max_length() const override { + return source_line_max_length_; + } + + private: + void PrintErrorHeader(); + void PrintSourceError(); + + FILE* file_; + std::string header_; + PrintHeader print_header_; + size_t source_line_max_length_; +}; + +} // namespace wabt + +#endif // WABT_SOURCE_ERROR_HANDLER_H_ diff --git a/src/tools/wasm-interp.cc b/src/tools/wasm-interp.cc index a90ba77a..c0c03287 100644 --- a/src/tools/wasm-interp.cc +++ b/src/tools/wasm-interp.cc @@ -23,6 +23,7 @@ #include <memory> #include <vector> +#include "binary-error-handler.h" #include "binary-reader.h" #include "binary-reader-interpreter.h" #include "interpreter.h" @@ -49,8 +50,6 @@ static bool s_trace; static bool s_spec; static bool s_run_all_exports; -static BinaryErrorHandler s_error_handler = WABT_BINARY_ERROR_HANDLER_DEFAULT; - static std::unique_ptr<FileStream> s_log_stream; static std::unique_ptr<FileStream> s_stdout_stream; @@ -584,10 +583,11 @@ static Result read_and_run_module(const char* module_filename) { InterpreterEnvironment env; DefinedInterpreterModule* module = nullptr; InterpreterThread thread; + BinaryErrorHandlerFile error_handler; init_environment(&env); init_interpreter_thread(&env, &thread, &s_thread_options); - result = read_module(module_filename, &env, &s_error_handler, &module); + result = read_module(module_filename, &env, &error_handler, &module); if (WABT_SUCCEEDED(result)) { InterpreterResult iresult = run_start_function(&thread, module); if (iresult == InterpreterResult::Ok) { @@ -1011,8 +1011,9 @@ static Result on_module_command(Context* ctx, StringSlice name) { char* path = create_module_path(ctx, filename); InterpreterEnvironmentMark mark = mark_interpreter_environment(&ctx->env); + BinaryErrorHandlerFile error_handler; Result result = - read_module(path, &ctx->env, &s_error_handler, &ctx->last_module); + read_module(path, &ctx->env, &error_handler, &ctx->last_module); if (WABT_FAILED(result)) { reset_interpreter_environment_to_mark(&ctx->env, mark); @@ -1100,45 +1101,30 @@ static Result on_action_command(Context* ctx, Action* action) { return result; } -static BinaryErrorHandler* new_custom_error_handler(Context* ctx, - const char* desc) { - size_t header_size = ctx->source_filename.length + strlen(desc) + 100; - char* header = new char[header_size]; - snprintf(header, header_size, PRIstringslice ":%d: %s passed", - WABT_PRINTF_STRING_SLICE_ARG(ctx->source_filename), - ctx->command_line_number, desc); - - DefaultErrorHandlerInfo* info = new DefaultErrorHandlerInfo(); - info->header = header; - info->out_file = stdout; - info->print_header = PrintErrorHeader::Once; - - BinaryErrorHandler* error_handler = new BinaryErrorHandler(); - error_handler->on_error = default_binary_error_callback; - error_handler->user_data = info; - return error_handler; -} +class BinaryErrorHandlerAssert : public BinaryErrorHandlerFile { + public: + BinaryErrorHandlerAssert(Context* ctx, const char* desc) + : BinaryErrorHandlerFile(stdout, Header(ctx, desc), PrintHeader::Once) {} -static void destroy_custom_error_handler(BinaryErrorHandler* error_handler) { - DefaultErrorHandlerInfo* info = - static_cast<DefaultErrorHandlerInfo*>(error_handler->user_data); - delete [] info->header; - delete info; - delete error_handler; -} + private: + std::string Header(Context* ctx, const char* desc) { + return string_printf(PRIstringslice ":%d: %s passed", + WABT_PRINTF_STRING_SLICE_ARG(ctx->source_filename), + ctx->command_line_number, desc); + } +}; static Result on_assert_malformed_command(Context* ctx, StringSlice filename, StringSlice text) { - BinaryErrorHandler* error_handler = - new_custom_error_handler(ctx, "assert_malformed"); + BinaryErrorHandlerAssert error_handler(ctx, "assert_malformed"); InterpreterEnvironment env; init_environment(&env); ctx->total++; char* path = create_module_path(ctx, filename); DefinedInterpreterModule* module; - Result result = read_module(path, &env, error_handler, &module); + Result result = read_module(path, &env, &error_handler, &module); if (WABT_FAILED(result)) { ctx->passed++; result = Result::Ok; @@ -1148,7 +1134,6 @@ static Result on_assert_malformed_command(Context* ctx, } delete[] path; - destroy_custom_error_handler(error_handler); return result; } @@ -1187,14 +1172,13 @@ static Result on_register_command(Context* ctx, static Result on_assert_unlinkable_command(Context* ctx, StringSlice filename, StringSlice text) { - BinaryErrorHandler* error_handler = - new_custom_error_handler(ctx, "assert_unlinkable"); + BinaryErrorHandlerAssert error_handler(ctx, "assert_unlinkable"); ctx->total++; char* path = create_module_path(ctx, filename); DefinedInterpreterModule* module; InterpreterEnvironmentMark mark = mark_interpreter_environment(&ctx->env); - Result result = read_module(path, &ctx->env, error_handler, &module); + Result result = read_module(path, &ctx->env, &error_handler, &module); reset_interpreter_environment_to_mark(&ctx->env, mark); if (WABT_FAILED(result)) { @@ -1206,22 +1190,20 @@ static Result on_assert_unlinkable_command(Context* ctx, } delete[] path; - destroy_custom_error_handler(error_handler); return result; } static Result on_assert_invalid_command(Context* ctx, StringSlice filename, StringSlice text) { - BinaryErrorHandler* error_handler = - new_custom_error_handler(ctx, "assert_invalid"); + BinaryErrorHandlerAssert error_handler(ctx, "assert_invalid"); InterpreterEnvironment env; init_environment(&env); ctx->total++; char* path = create_module_path(ctx, filename); DefinedInterpreterModule* module; - Result result = read_module(path, &env, error_handler, &module); + Result result = read_module(path, &env, &error_handler, &module); if (WABT_FAILED(result)) { ctx->passed++; result = Result::Ok; @@ -1231,18 +1213,18 @@ static Result on_assert_invalid_command(Context* ctx, } delete[] path; - destroy_custom_error_handler(error_handler); return result; } static Result on_assert_uninstantiable_command(Context* ctx, StringSlice filename, StringSlice text) { + BinaryErrorHandlerFile error_handler; ctx->total++; char* path = create_module_path(ctx, filename); DefinedInterpreterModule* module; InterpreterEnvironmentMark mark = mark_interpreter_environment(&ctx->env); - Result result = read_module(path, &ctx->env, &s_error_handler, &module); + Result result = read_module(path, &ctx->env, &error_handler, &module); if (WABT_SUCCEEDED(result)) { InterpreterResult iresult = run_start_function(&ctx->thread, module); diff --git a/src/tools/wasm2wast.cc b/src/tools/wasm2wast.cc index e826c3b8..e8c4408e 100644 --- a/src/tools/wasm2wast.cc +++ b/src/tools/wasm2wast.cc @@ -22,6 +22,7 @@ #include "apply-names.h" #include "ast.h" #include "ast-writer.h" +#include "binary-error-handler.h" #include "binary-reader.h" #include "binary-reader-ast.h" #include "generate-names.h" @@ -38,7 +39,6 @@ static const char* s_infile; static const char* s_outfile; static ReadBinaryOptions s_read_binary_options = {nullptr, true}; static bool s_generate_names; -static BinaryErrorHandler s_error_handler = WABT_BINARY_ERROR_HANDLER_DEFAULT; static std::unique_ptr<FileStream> s_log_stream; #define NOPE HasArgument::No @@ -141,9 +141,10 @@ int main(int argc, char** argv) { size_t size; result = read_file(s_infile, &data, &size); if (WABT_SUCCEEDED(result)) { + BinaryErrorHandlerFile error_handler; Module module; - result = read_binary_ast(data, size, &s_read_binary_options, - &s_error_handler, &module); + result = read_binary_ast(data, size, &s_read_binary_options, &error_handler, + &module); if (WABT_SUCCEEDED(result)) { if (s_generate_names) result = generate_names(&module); diff --git a/src/tools/wast-desugar.cc b/src/tools/wast-desugar.cc index 51e12cb1..237539bc 100644 --- a/src/tools/wast-desugar.cc +++ b/src/tools/wast-desugar.cc @@ -28,6 +28,7 @@ #include "config.h" #include "generate-names.h" #include "option-parser.h" +#include "source-error-handler.h" #include "stream.h" #include "writer.h" @@ -39,9 +40,6 @@ static const char* s_infile; static const char* s_outfile; static bool s_generate_names; -static SourceErrorHandler s_error_handler = - WABT_SOURCE_ERROR_HANDLER_DEFAULT; - enum { FLAG_HELP, FLAG_OUTPUT, @@ -134,8 +132,9 @@ int main(int argc, char** argv) { if (!lexer) WABT_FATAL("unable to read %s\n", s_infile); + SourceErrorHandlerFile error_handler; Script* script; - Result result = parse_ast(lexer, &script, &s_error_handler); + Result result = parse_ast(lexer, &script, &error_handler); if (WABT_SUCCEEDED(result)) { Module* module = get_first_module(script); diff --git a/src/tools/wast2wasm.cc b/src/tools/wast2wasm.cc index a9f0e9dc..baa6f989 100644 --- a/src/tools/wast2wasm.cc +++ b/src/tools/wast2wasm.cc @@ -28,6 +28,7 @@ #include "common.h" #include "option-parser.h" #include "resolve-names.h" +#include "source-error-handler.h" #include "stream.h" #include "validator.h" #include "writer.h" @@ -47,9 +48,6 @@ static WriteBinarySpecOptions s_write_binary_spec_options = static bool s_spec; static bool s_validate = true; -static SourceErrorHandler s_error_handler = - WABT_SOURCE_ERROR_HANDLER_DEFAULT; - static std::unique_ptr<FileStream> s_log_stream; #define NOPE HasArgument::No @@ -203,14 +201,15 @@ int main(int argc, char** argv) { if (!lexer) WABT_FATAL("unable to read file: %s\n", s_infile); + SourceErrorHandlerFile error_handler; Script* script; - Result result = parse_ast(lexer, &script, &s_error_handler); + Result result = parse_ast(lexer, &script, &error_handler); if (WABT_SUCCEEDED(result)) { - result = resolve_names_script(lexer, script, &s_error_handler); + result = resolve_names_script(lexer, script, &error_handler); if (WABT_SUCCEEDED(result) && s_validate) - result = validate_script(lexer, script, &s_error_handler); + result = validate_script(lexer, script, &error_handler); if (WABT_SUCCEEDED(result)) { if (s_spec) { diff --git a/src/validator.h b/src/validator.h index 4f194353..c117e241 100644 --- a/src/validator.h +++ b/src/validator.h @@ -18,12 +18,12 @@ #define WABT_VALIDATOR_H_ #include "ast-lexer.h" -#include "common.h" namespace wabt { struct Module; struct Script; +class SourceErrorHandler; /* perform all checks on the AST; the module is valid if and only if this * function succeeds. */ |