diff options
-rw-r--r-- | src/binary-reader-ir.cc | 22 | ||||
-rw-r--r-- | src/ir.cc | 23 | ||||
-rw-r--r-- | src/ir.h | 9 | ||||
-rw-r--r-- | src/prebuilt/wast-parser-gen.cc | 583 | ||||
-rw-r--r-- | src/validator.cc | 38 | ||||
-rw-r--r-- | src/wast-parser-lexer-shared.cc | 9 | ||||
-rw-r--r-- | src/wast-parser-lexer-shared.h | 7 | ||||
-rw-r--r-- | src/wast-parser.y | 151 | ||||
-rw-r--r-- | src/wat-writer.cc | 27 |
9 files changed, 412 insertions, 457 deletions
diff --git a/src/binary-reader-ir.cc b/src/binary-reader-ir.cc index 2e479934..5140c586 100644 --- a/src/binary-reader-ir.cc +++ b/src/binary-reader-ir.cc @@ -310,7 +310,7 @@ Result BinaryReaderIR::OnType(Index index, func_type->sig.param_types.assign(param_types, param_types + param_count); func_type->sig.result_types.assign(result_types, result_types + result_count); module->func_types.push_back(func_type); - module->AppendField(new FuncTypeModuleField(func_type, GetLocation())); + module->fields.push_back(new FuncTypeModuleField(func_type, GetLocation())); return Result::Ok; } @@ -326,7 +326,7 @@ Result BinaryReaderIR::OnImport(Index index, import->module_name = dup_string_slice(module_name); import->field_name = dup_string_slice(field_name); module->imports.push_back(import); - module->AppendField(new ImportModuleField(import, GetLocation())); + module->fields.push_back(new ImportModuleField(import, GetLocation())); return Result::Ok; } @@ -422,7 +422,7 @@ Result BinaryReaderIR::OnFunction(Index index, Index sig_index) { func->decl.sig = module->func_types[sig_index]->sig; module->funcs.push_back(func); - module->AppendField(new FuncModuleField(func, GetLocation())); + module->fields.push_back(new FuncModuleField(func, GetLocation())); return Result::Ok; } @@ -437,7 +437,7 @@ Result BinaryReaderIR::OnTable(Index index, auto table = new Table(); table->elem_limits = *elem_limits; module->tables.push_back(table); - module->AppendField(new TableModuleField(table, GetLocation())); + module->fields.push_back(new TableModuleField(table, GetLocation())); return Result::Ok; } @@ -450,7 +450,7 @@ Result BinaryReaderIR::OnMemory(Index index, const Limits* page_limits) { auto memory = new Memory(); memory->page_limits = *page_limits; module->memories.push_back(memory); - module->AppendField(new MemoryModuleField(memory, GetLocation())); + module->fields.push_back(new MemoryModuleField(memory, GetLocation())); return Result::Ok; } @@ -464,7 +464,7 @@ Result BinaryReaderIR::BeginGlobal(Index index, Type type, bool mutable_) { global->type = type; global->mutable_ = mutable_; module->globals.push_back(global); - module->AppendField(new GlobalModuleField(global, GetLocation())); + module->fields.push_back(new GlobalModuleField(global, GetLocation())); return Result::Ok; } @@ -511,14 +511,14 @@ Result BinaryReaderIR::OnExport(Index index, export_->var = Var(item_index, GetLocation()); export_->kind = kind; module->exports.push_back(export_); - module->AppendField(new ExportModuleField(export_, GetLocation())); + module->fields.push_back(new ExportModuleField(export_, GetLocation())); return Result::Ok; } Result BinaryReaderIR::OnStartFunction(Index func_index) { assert(func_index < module->funcs.size()); Var start(func_index, GetLocation()); - module->AppendField(new StartModuleField(start, GetLocation())); + module->fields.push_back(new StartModuleField(start, GetLocation())); return Result::Ok; } @@ -804,7 +804,7 @@ Result BinaryReaderIR::BeginElemSegment(Index index, Index table_index) { auto elem_segment = new ElemSegment(); elem_segment->table_var = Var(table_index, GetLocation()); module->elem_segments.push_back(elem_segment); - module->AppendField(new ElemSegmentModuleField(elem_segment, GetLocation())); + module->fields.push_back(new ElemSegmentModuleField(elem_segment, GetLocation())); return Result::Ok; } @@ -847,7 +847,7 @@ Result BinaryReaderIR::BeginDataSegment(Index index, Index memory_index) { auto data_segment = new DataSegment(); data_segment->memory_var = Var(memory_index, GetLocation()); module->data_segments.push_back(data_segment); - module->AppendField(new DataSegmentModuleField(data_segment, GetLocation())); + module->fields.push_back(new DataSegmentModuleField(data_segment, GetLocation())); return Result::Ok; } @@ -976,7 +976,7 @@ Result BinaryReaderIR::OnLocalName(Index func_index, Result BinaryReaderIR::OnExceptionType(Index index, TypeVector& sig) { auto except = new Exception(sig); module->excepts.push_back(except); - module->AppendField(new ExceptionModuleField(except)); + module->fields.push_back(new ExceptionModuleField(except)); return Result::Ok; } @@ -224,20 +224,12 @@ void MakeTypeBindingReverseMapping( } } -void Module::AppendField(ModuleField* field) { - if (!first_field) - first_field = field; - else if (last_field) - last_field->next = field; - last_field = field; -} - FuncType* Module::AppendImplicitFuncType(const Location& loc, const FuncSignature& sig) { FuncType* func_type = new FuncType(); func_type->sig = sig; func_types.push_back(func_type); - AppendField(new FuncTypeModuleField(func_type, loc)); + fields.push_back(new FuncTypeModuleField(func_type, loc)); return func_type; } @@ -456,12 +448,10 @@ Export::~Export() { } ModuleField::ModuleField(ModuleFieldType type, const Location& loc) - : loc(loc), type(type), next(nullptr) {} + : loc(loc), type(type) {} Module::Module() - : first_field(nullptr), - last_field(nullptr), - num_except_imports(0), + : num_except_imports(0), num_func_imports(0), num_table_imports(0), num_memory_imports(0), @@ -472,13 +462,6 @@ Module::Module() Module::~Module() { destroy_string_slice(&name); - - ModuleField* field = first_field; - while (field) { - ModuleField* next_field = field->next; - delete field; - field = next_field; - } } ScriptModule::ScriptModule() : type(ScriptModule::Type::Text), text(nullptr) {} @@ -445,7 +445,7 @@ enum class ModuleFieldType { Except }; -class ModuleField { +class ModuleField : public intrusive_list_base<ModuleField> { public: WABT_DISALLOW_COPY_AND_ASSIGN(ModuleField); ModuleField() = delete; @@ -453,12 +453,13 @@ class ModuleField { Location loc; ModuleFieldType type; - ModuleField* next; protected: explicit ModuleField(ModuleFieldType, const Location& loc); }; +typedef intrusive_list<ModuleField> ModuleFieldList; + template <ModuleFieldType TypeEnum> class ModuleFieldMixin : public ModuleField { public: @@ -586,7 +587,6 @@ struct Module { Module(); ~Module(); - void AppendField(ModuleField*); FuncType* AppendImplicitFuncType(const Location&, const FuncSignature&); Index GetFuncTypeIndex(const Var&) const; @@ -610,8 +610,7 @@ struct Module { Location loc; StringSlice name; - ModuleField* first_field; - ModuleField* last_field; + ModuleFieldList fields; Index num_except_imports; Index num_func_imports; diff --git a/src/prebuilt/wast-parser-gen.cc b/src/prebuilt/wast-parser-gen.cc index 5d566266..2454772e 100644 --- a/src/prebuilt/wast-parser-gen.cc +++ b/src/prebuilt/wast-parser-gen.cc @@ -189,8 +189,8 @@ static void check_import_ordering(Location* loc, WastLexer* lexer, WastParser* parser, Module* module, - ModuleField* first); -static void append_module_fields(Module*, ModuleField*); + const ModuleFieldList&); +static void append_module_fields(Module*, ModuleFieldList*); class BinaryErrorHandlerModule : public BinaryErrorHandler { public: @@ -680,17 +680,17 @@ static const yytype_uint16 yyrline[] = 653, 657, 662, 669, 673, 678, 684, 690, 695, 704, 710, 720, 723, 729, 734, 742, 749, 752, 759, 765, 773, 780, 788, 798, 803, 809, 815, 816, 823, 824, - 831, 836, 844, 851, 864, 871, 875, 884, 890, 899, - 906, 907, 913, 923, 924, 933, 940, 941, 947, 957, - 958, 967, 974, 979, 984, 996, 999, 1003, 1013, 1027, - 1040, 1044, 1050, 1056, 1076, 1086, 1100, 1113, 1117, 1123, - 1129, 1152, 1165, 1171, 1177, 1188, 1197, 1205, 1211, 1217, - 1223, 1231, 1240, 1248, 1254, 1260, 1266, 1272, 1280, 1288, - 1298, 1304, 1314, 1321, 1322, 1323, 1324, 1325, 1326, 1327, - 1328, 1329, 1330, 1331, 1335, 1336, 1340, 1345, 1353, 1374, - 1381, 1384, 1392, 1410, 1418, 1429, 1440, 1451, 1454, 1457, - 1460, 1463, 1466, 1469, 1472, 1475, 1481, 1484, 1485, 1488, - 1496, 1500, 1507, 1519, 1520, 1527, 1530, 1594, 1603 + 831, 836, 842, 849, 862, 869, 872, 881, 887, 896, + 903, 904, 910, 920, 921, 930, 937, 938, 944, 954, + 955, 964, 971, 976, 981, 993, 996, 1000, 1010, 1024, + 1037, 1040, 1046, 1052, 1072, 1082, 1096, 1109, 1112, 1118, + 1124, 1147, 1160, 1166, 1172, 1183, 1192, 1200, 1206, 1212, + 1218, 1226, 1235, 1243, 1249, 1255, 1261, 1267, 1275, 1283, + 1293, 1299, 1309, 1316, 1317, 1318, 1319, 1320, 1321, 1322, + 1323, 1324, 1325, 1326, 1330, 1331, 1335, 1341, 1350, 1371, + 1378, 1381, 1389, 1407, 1415, 1426, 1437, 1448, 1451, 1454, + 1457, 1460, 1463, 1466, 1469, 1472, 1478, 1481, 1482, 1485, + 1493, 1497, 1504, 1516, 1517, 1524, 1527, 1591, 1600 }; #endif @@ -1932,13 +1932,13 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio case 129: /* func */ #line 235 "src/wast-parser.y" /* yacc.c:1257 */ - { destroy_module_field_list(&((*yyvaluep).module_fields)); } + { delete ((*yyvaluep).module_fields); } #line 1937 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 130: /* func_fields */ #line 235 "src/wast-parser.y" /* yacc.c:1257 */ - { destroy_module_field_list(&((*yyvaluep).module_fields)); } + { delete ((*yyvaluep).module_fields); } #line 1943 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; @@ -1998,37 +1998,37 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio case 141: /* table */ #line 235 "src/wast-parser.y" /* yacc.c:1257 */ - { destroy_module_field_list(&((*yyvaluep).module_fields)); } + { delete ((*yyvaluep).module_fields); } #line 2003 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 142: /* table_fields */ #line 235 "src/wast-parser.y" /* yacc.c:1257 */ - { destroy_module_field_list(&((*yyvaluep).module_fields)); } + { delete ((*yyvaluep).module_fields); } #line 2009 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 144: /* memory */ #line 235 "src/wast-parser.y" /* yacc.c:1257 */ - { destroy_module_field_list(&((*yyvaluep).module_fields)); } + { delete ((*yyvaluep).module_fields); } #line 2015 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 145: /* memory_fields */ #line 235 "src/wast-parser.y" /* yacc.c:1257 */ - { destroy_module_field_list(&((*yyvaluep).module_fields)); } + { delete ((*yyvaluep).module_fields); } #line 2021 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 146: /* global */ #line 235 "src/wast-parser.y" /* yacc.c:1257 */ - { destroy_module_field_list(&((*yyvaluep).module_fields)); } + { delete ((*yyvaluep).module_fields); } #line 2027 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 147: /* global_fields */ #line 235 "src/wast-parser.y" /* yacc.c:1257 */ - { destroy_module_field_list(&((*yyvaluep).module_fields)); } + { delete ((*yyvaluep).module_fields); } #line 2033 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; @@ -2058,7 +2058,7 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio case 156: /* module_field */ #line 235 "src/wast-parser.y" /* yacc.c:1257 */ - { destroy_module_field_list(&((*yyvaluep).module_fields)); } + { delete ((*yyvaluep).module_fields); } #line 2063 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; @@ -3370,27 +3370,25 @@ yyreduce: case 111: #line 836 "src/wast-parser.y" /* yacc.c:1646 */ { - (yyval.exception) = new Exception(); - (yyval.exception)->name = (yyvsp[-2].text); - (yyval.exception)->sig = std::move(*(yyvsp[-1].types)); + (yyval.exception) = new Exception((yyvsp[-2].text), *(yyvsp[-1].types)); delete (yyvsp[-1].types); } -#line 3379 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3377 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 112: -#line 844 "src/wast-parser.y" /* yacc.c:1646 */ +#line 842 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_field) = new ExceptionModuleField((yyvsp[0].exception)); } -#line 3387 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3385 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 113: -#line 851 "src/wast-parser.y" /* yacc.c:1646 */ +#line 849 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_fields) = (yyvsp[-1].module_fields); - ModuleField* main_field = (yyval.module_fields).first; + ModuleField* main_field = &(yyval.module_fields)->front(); main_field->loc = (yylsp[-3]); if (auto func_field = dyn_cast<FuncModuleField>(main_field)) { func_field->func->name = (yyvsp[-2].text); @@ -3398,32 +3396,31 @@ yyreduce: cast<ImportModuleField>(main_field)->import->func->name = (yyvsp[-2].text); } } -#line 3402 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3400 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 114: -#line 864 "src/wast-parser.y" /* yacc.c:1646 */ +#line 862 "src/wast-parser.y" /* yacc.c:1646 */ { auto field = new FuncModuleField((yyvsp[0].func)); field->func->decl.has_func_type = true; field->func->decl.type_var = std::move(*(yyvsp[-1].var)); delete (yyvsp[-1].var); - (yyval.module_fields).first = (yyval.module_fields).last = field; + (yyval.module_fields) = new ModuleFieldList(field); } -#line 3414 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3412 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 115: -#line 871 "src/wast-parser.y" /* yacc.c:1646 */ +#line 869 "src/wast-parser.y" /* yacc.c:1646 */ { - auto field = new FuncModuleField((yyvsp[0].func)); - (yyval.module_fields).first = (yyval.module_fields).last = field; + (yyval.module_fields) = new ModuleFieldList(new FuncModuleField((yyvsp[0].func))); } -#line 3423 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3420 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 116: -#line 875 "src/wast-parser.y" /* yacc.c:1646 */ +#line 872 "src/wast-parser.y" /* yacc.c:1646 */ { auto field = new ImportModuleField((yyvsp[-2].import), (yylsp[-2])); field->import->kind = ExternalKind::Func; @@ -3431,55 +3428,55 @@ yyreduce: field->import->func->decl.has_func_type = true; field->import->func->decl.type_var = std::move(*(yyvsp[-1].var)); delete (yyvsp[-1].var); - (yyval.module_fields).first = (yyval.module_fields).last = field; + (yyval.module_fields) = new ModuleFieldList(field); } -#line 3437 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3434 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 117: -#line 884 "src/wast-parser.y" /* yacc.c:1646 */ +#line 881 "src/wast-parser.y" /* yacc.c:1646 */ { auto field = new ImportModuleField((yyvsp[-1].import), (yylsp[-1])); field->import->kind = ExternalKind::Func; field->import->func = (yyvsp[0].func); - (yyval.module_fields).first = (yyval.module_fields).last = field; + (yyval.module_fields) = new ModuleFieldList(field); } -#line 3448 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3445 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 118: -#line 890 "src/wast-parser.y" /* yacc.c:1646 */ +#line 887 "src/wast-parser.y" /* yacc.c:1646 */ { auto field = new ExportModuleField((yyvsp[-1].export_), (yylsp[-1])); field->export_->kind = ExternalKind::Func; - (yyval.module_fields).first = (yyvsp[0].module_fields).first; - (yyval.module_fields).last = (yyvsp[0].module_fields).last->next = field; + (yyval.module_fields) = (yyvsp[0].module_fields); + (yyval.module_fields)->push_back(field); } -#line 3459 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3456 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 119: -#line 899 "src/wast-parser.y" /* yacc.c:1646 */ +#line 896 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.func) = (yyvsp[0].func); reverse_bindings(&(yyval.func)->decl.sig.param_types, &(yyval.func)->param_bindings); } -#line 3468 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3465 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 121: -#line 907 "src/wast-parser.y" /* yacc.c:1646 */ +#line 904 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.func) = (yyvsp[0].func); (yyval.func)->decl.sig.param_types.insert((yyval.func)->decl.sig.param_types.begin(), (yyvsp[-2].types)->begin(), (yyvsp[-2].types)->end()); delete (yyvsp[-2].types); } -#line 3479 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3476 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 122: -#line 913 "src/wast-parser.y" /* yacc.c:1646 */ +#line 910 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.func) = (yyvsp[0].func); (yyval.func)->param_bindings.emplace(string_slice_to_string((yyvsp[-3].text)), @@ -3487,48 +3484,48 @@ yyreduce: destroy_string_slice(&(yyvsp[-3].text)); (yyval.func)->decl.sig.param_types.insert((yyval.func)->decl.sig.param_types.begin(), (yyvsp[-2].type)); } -#line 3491 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3488 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 123: -#line 923 "src/wast-parser.y" /* yacc.c:1646 */ +#line 920 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.func) = new Func(); } -#line 3497 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3494 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 124: -#line 924 "src/wast-parser.y" /* yacc.c:1646 */ +#line 921 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.func) = (yyvsp[0].func); (yyval.func)->decl.sig.result_types.insert((yyval.func)->decl.sig.result_types.begin(), (yyvsp[-2].types)->begin(), (yyvsp[-2].types)->end()); delete (yyvsp[-2].types); } -#line 3508 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3505 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 125: -#line 933 "src/wast-parser.y" /* yacc.c:1646 */ +#line 930 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.func) = (yyvsp[0].func); reverse_bindings(&(yyval.func)->decl.sig.param_types, &(yyval.func)->param_bindings); } -#line 3517 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3514 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 127: -#line 941 "src/wast-parser.y" /* yacc.c:1646 */ +#line 938 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.func) = (yyvsp[0].func); (yyval.func)->decl.sig.param_types.insert((yyval.func)->decl.sig.param_types.begin(), (yyvsp[-2].types)->begin(), (yyvsp[-2].types)->end()); delete (yyvsp[-2].types); } -#line 3528 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3525 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 128: -#line 947 "src/wast-parser.y" /* yacc.c:1646 */ +#line 944 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.func) = (yyvsp[0].func); (yyval.func)->param_bindings.emplace(string_slice_to_string((yyvsp[-3].text)), @@ -3536,51 +3533,51 @@ yyreduce: destroy_string_slice(&(yyvsp[-3].text)); (yyval.func)->decl.sig.param_types.insert((yyval.func)->decl.sig.param_types.begin(), (yyvsp[-2].type)); } -#line 3540 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3537 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 130: -#line 958 "src/wast-parser.y" /* yacc.c:1646 */ +#line 955 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.func) = (yyvsp[0].func); (yyval.func)->decl.sig.result_types.insert((yyval.func)->decl.sig.result_types.begin(), (yyvsp[-2].types)->begin(), (yyvsp[-2].types)->end()); delete (yyvsp[-2].types); } -#line 3551 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3548 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 131: -#line 967 "src/wast-parser.y" /* yacc.c:1646 */ +#line 964 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.func) = (yyvsp[0].func); reverse_bindings(&(yyval.func)->local_types, &(yyval.func)->local_bindings); } -#line 3560 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3557 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 132: -#line 974 "src/wast-parser.y" /* yacc.c:1646 */ +#line 971 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.func) = new Func(); (yyval.func)->exprs = std::move(*(yyvsp[0].expr_list)); delete (yyvsp[0].expr_list); } -#line 3570 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3567 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 133: -#line 979 "src/wast-parser.y" /* yacc.c:1646 */ +#line 976 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.func) = (yyvsp[0].func); (yyval.func)->local_types.insert((yyval.func)->local_types.begin(), (yyvsp[-2].types)->begin(), (yyvsp[-2].types)->end()); delete (yyvsp[-2].types); } -#line 3580 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3577 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 134: -#line 984 "src/wast-parser.y" /* yacc.c:1646 */ +#line 981 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.func) = (yyvsp[0].func); (yyval.func)->local_bindings.emplace(string_slice_to_string((yyvsp[-3].text)), @@ -3588,19 +3585,19 @@ yyreduce: destroy_string_slice(&(yyvsp[-3].text)); (yyval.func)->local_types.insert((yyval.func)->local_types.begin(), (yyvsp[-2].type)); } -#line 3592 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3589 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 135: -#line 996 "src/wast-parser.y" /* yacc.c:1646 */ +#line 993 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr_list) = (yyvsp[-1].expr_list); } -#line 3600 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3597 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 137: -#line 1003 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1000 "src/wast-parser.y" /* yacc.c:1646 */ { auto elem_segment = new ElemSegment(); elem_segment->table_var = std::move(*(yyvsp[-3].var)); @@ -3611,11 +3608,11 @@ yyreduce: delete (yyvsp[-1].vars); (yyval.module_field) = new ElemSegmentModuleField(elem_segment, (yylsp[-4])); } -#line 3615 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3612 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 138: -#line 1013 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1010 "src/wast-parser.y" /* yacc.c:1646 */ { auto elem_segment = new ElemSegment(); elem_segment->table_var.loc = (yylsp[-3]); @@ -3627,14 +3624,14 @@ yyreduce: delete (yyvsp[-1].vars); (yyval.module_field) = new ElemSegmentModuleField(elem_segment, (yylsp[-3])); } -#line 3631 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3628 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 139: -#line 1027 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1024 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_fields) = (yyvsp[-1].module_fields); - ModuleField* main_field = (yyval.module_fields).first; + ModuleField* main_field = &(yyval.module_fields)->front(); main_field->loc = (yylsp[-3]); if (auto table_field = dyn_cast<TableModuleField>(main_field)) { table_field->table->name = (yyvsp[-2].text); @@ -3642,48 +3639,46 @@ yyreduce: cast<ImportModuleField>(main_field)->import->table->name = (yyvsp[-2].text); } } -#line 3646 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3643 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 140: -#line 1040 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1037 "src/wast-parser.y" /* yacc.c:1646 */ { - auto field = new TableModuleField((yyvsp[0].table)); - (yyval.module_fields).first = (yyval.module_fields).last = field; + (yyval.module_fields) = new ModuleFieldList(new TableModuleField((yyvsp[0].table))); } -#line 3655 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3651 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 141: -#line 1044 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1040 "src/wast-parser.y" /* yacc.c:1646 */ { auto field = new ImportModuleField((yyvsp[-1].import)); field->import->kind = ExternalKind::Table; field->import->table = (yyvsp[0].table); - (yyval.module_fields).first = (yyval.module_fields).last = field; + (yyval.module_fields) = new ModuleFieldList(field); } -#line 3666 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3662 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 142: -#line 1050 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1046 "src/wast-parser.y" /* yacc.c:1646 */ { auto field = new ExportModuleField((yyvsp[-1].export_), (yylsp[-1])); field->export_->kind = ExternalKind::Table; - (yyval.module_fields).first = (yyvsp[0].module_fields).first; - (yyval.module_fields).last = (yyvsp[0].module_fields).last->next = field; + (yyval.module_fields) = (yyvsp[0].module_fields); + (yyval.module_fields)->push_back(field); } -#line 3677 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3673 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 143: -#line 1056 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1052 "src/wast-parser.y" /* yacc.c:1646 */ { auto table = new Table(); table->elem_limits.initial = (yyvsp[-1].vars)->size(); table->elem_limits.max = (yyvsp[-1].vars)->size(); table->elem_limits.has_max = true; - auto table_field = new TableModuleField(table); auto elem_segment = new ElemSegment(); elem_segment->table_var = Var(kInvalidIndex); @@ -3691,15 +3686,16 @@ yyreduce: elem_segment->offset.back().loc = (yylsp[-2]); elem_segment->vars = std::move(*(yyvsp[-1].vars)); delete (yyvsp[-1].vars); - auto elem_field = new ElemSegmentModuleField(elem_segment, (yylsp[-2])); - (yyval.module_fields).first = table_field; - (yyval.module_fields).last = table_field->next = elem_field; + + (yyval.module_fields) = new ModuleFieldList(); + (yyval.module_fields)->push_back(new TableModuleField(table)); + (yyval.module_fields)->push_back(new ElemSegmentModuleField(elem_segment, (yylsp[-2]))); } -#line 3699 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3695 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 144: -#line 1076 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1072 "src/wast-parser.y" /* yacc.c:1646 */ { auto data_segment = new DataSegment(); data_segment->memory_var = std::move(*(yyvsp[-3].var)); @@ -3710,11 +3706,11 @@ yyreduce: destroy_text_list(&(yyvsp[-1].text_list)); (yyval.module_field) = new DataSegmentModuleField(data_segment, (yylsp[-4])); } -#line 3714 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3710 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 145: -#line 1086 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1082 "src/wast-parser.y" /* yacc.c:1646 */ { auto data_segment = new DataSegment(); data_segment->memory_var.loc = (yylsp[-3]); @@ -3726,14 +3722,14 @@ yyreduce: destroy_text_list(&(yyvsp[-1].text_list)); (yyval.module_field) = new DataSegmentModuleField(data_segment, (yylsp[-3])); } -#line 3730 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3726 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 146: -#line 1100 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1096 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_fields) = (yyvsp[-1].module_fields); - ModuleField* main_field = (yyval.module_fields).first; + ModuleField* main_field = &(yyval.module_fields)->front(); main_field->loc = (yylsp[-3]); if (auto memory_field = dyn_cast<MemoryModuleField>(main_field)) { memory_field->memory->name = (yyvsp[-2].text); @@ -3741,42 +3737,41 @@ yyreduce: cast<ImportModuleField>(main_field)->import->memory->name = (yyvsp[-2].text); } } -#line 3745 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3741 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 147: -#line 1113 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1109 "src/wast-parser.y" /* yacc.c:1646 */ { - auto field = new MemoryModuleField((yyvsp[0].memory)); - (yyval.module_fields).first = (yyval.module_fields).last = field; + (yyval.module_fields) = new ModuleFieldList(new MemoryModuleField((yyvsp[0].memory))); } -#line 3754 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3749 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 148: -#line 1117 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1112 "src/wast-parser.y" /* yacc.c:1646 */ { auto field = new ImportModuleField((yyvsp[-1].import)); field->import->kind = ExternalKind::Memory; field->import->memory = (yyvsp[0].memory); - (yyval.module_fields).first = (yyval.module_fields).last = field; + (yyval.module_fields) = new ModuleFieldList(field); } -#line 3765 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3760 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 149: -#line 1123 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1118 "src/wast-parser.y" /* yacc.c:1646 */ { auto field = new ExportModuleField((yyvsp[-1].export_), (yylsp[-1])); field->export_->kind = ExternalKind::Memory; - (yyval.module_fields).first = (yyvsp[0].module_fields).first; - (yyval.module_fields).last = (yyvsp[0].module_fields).last->next = field; + (yyval.module_fields) = (yyvsp[0].module_fields); + (yyval.module_fields)->push_back(field); } -#line 3776 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3771 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 150: -#line 1129 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1124 "src/wast-parser.y" /* yacc.c:1646 */ { auto data_segment = new DataSegment(); data_segment->memory_var = Var(kInvalidIndex); @@ -3784,7 +3779,6 @@ yyreduce: data_segment->offset.back().loc = (yylsp[-2]); dup_text_list(&(yyvsp[-1].text_list), &data_segment->data, &data_segment->size); destroy_text_list(&(yyvsp[-1].text_list)); - auto data_field = new DataSegmentModuleField(data_segment, (yylsp[-2])); uint32_t byte_size = WABT_ALIGN_UP_TO_PAGE(data_segment->size); uint32_t page_size = WABT_BYTES_TO_PAGES(byte_size); @@ -3793,18 +3787,19 @@ yyreduce: memory->page_limits.initial = page_size; memory->page_limits.max = page_size; memory->page_limits.has_max = true; - auto memory_field = new MemoryModuleField(memory); - (yyval.module_fields).first = memory_field; - (yyval.module_fields).last = memory_field->next = data_field; + + (yyval.module_fields) = new ModuleFieldList(); + (yyval.module_fields)->push_back(new MemoryModuleField(memory)); + (yyval.module_fields)->push_back(new DataSegmentModuleField(data_segment, (yylsp[-2]))); } -#line 3801 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3796 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 151: -#line 1152 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1147 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_fields) = (yyvsp[-1].module_fields); - ModuleField* main_field = (yyval.module_fields).first; + ModuleField* main_field = &(yyval.module_fields)->front(); main_field->loc = (yylsp[-3]); if (auto global_field = dyn_cast<GlobalModuleField>(main_field)) { global_field->global->name = (yyvsp[-2].text); @@ -3812,44 +3807,44 @@ yyreduce: cast<ImportModuleField>(main_field)->import->global->name = (yyvsp[-2].text); } } -#line 3816 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3811 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 152: -#line 1165 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1160 "src/wast-parser.y" /* yacc.c:1646 */ { auto field = new GlobalModuleField((yyvsp[-1].global)); field->global->init_expr = std::move(*(yyvsp[0].expr_list)); delete (yyvsp[0].expr_list); - (yyval.module_fields).first = (yyval.module_fields).last = field; + (yyval.module_fields) = new ModuleFieldList(field); } -#line 3827 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3822 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 153: -#line 1171 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1166 "src/wast-parser.y" /* yacc.c:1646 */ { auto field = new ImportModuleField((yyvsp[-1].import)); field->import->kind = ExternalKind::Global; field->import->global = (yyvsp[0].global); - (yyval.module_fields).first = (yyval.module_fields).last = field; + (yyval.module_fields) = new ModuleFieldList(field); } -#line 3838 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3833 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 154: -#line 1177 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1172 "src/wast-parser.y" /* yacc.c:1646 */ { auto field = new ExportModuleField((yyvsp[-1].export_), (yylsp[-1])); field->export_->kind = ExternalKind::Global; - (yyval.module_fields).first = (yyvsp[0].module_fields).first; - (yyval.module_fields).last = (yyvsp[0].module_fields).last->next = field; + (yyval.module_fields) = (yyvsp[0].module_fields); + (yyval.module_fields)->push_back(field); } -#line 3849 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3844 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 155: -#line 1188 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1183 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.import) = new Import(); (yyval.import)->kind = ExternalKind::Func; @@ -3859,11 +3854,11 @@ yyreduce: (yyval.import)->func->decl.type_var = std::move(*(yyvsp[-1].var)); delete (yyvsp[-1].var); } -#line 3863 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3858 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 156: -#line 1197 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1192 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.import) = new Import(); (yyval.import)->kind = ExternalKind::Func; @@ -3872,160 +3867,160 @@ yyreduce: (yyval.import)->func->decl.sig = std::move(*(yyvsp[-1].func_sig)); delete (yyvsp[-1].func_sig); } -#line 3876 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3871 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 157: -#line 1205 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1200 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.import) = new Import(); (yyval.import)->kind = ExternalKind::Table; (yyval.import)->table = (yyvsp[-1].table); (yyval.import)->table->name = (yyvsp[-2].text); } -#line 3887 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3882 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 158: -#line 1211 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1206 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.import) = new Import(); (yyval.import)->kind = ExternalKind::Memory; (yyval.import)->memory = (yyvsp[-1].memory); (yyval.import)->memory->name = (yyvsp[-2].text); } -#line 3898 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3893 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 159: -#line 1217 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1212 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.import) = new Import(); (yyval.import)->kind = ExternalKind::Global; (yyval.import)->global = (yyvsp[-1].global); (yyval.import)->global->name = (yyvsp[-2].text); } -#line 3909 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3904 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 160: -#line 1223 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1218 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.import) = new Import(); (yyval.import)->kind = ExternalKind::Except; (yyval.import)->except = (yyvsp[0].exception); } -#line 3919 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3914 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 161: -#line 1231 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1226 "src/wast-parser.y" /* yacc.c:1646 */ { auto field = new ImportModuleField((yyvsp[-1].import), (yylsp[-4])); field->import->module_name = (yyvsp[-3].text); field->import->field_name = (yyvsp[-2].text); (yyval.module_field) = field; } -#line 3930 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3925 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 162: -#line 1240 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1235 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.import) = new Import(); (yyval.import)->module_name = (yyvsp[-2].text); (yyval.import)->field_name = (yyvsp[-1].text); } -#line 3940 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3935 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 163: -#line 1248 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1243 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.export_) = new Export(); (yyval.export_)->kind = ExternalKind::Func; (yyval.export_)->var = std::move(*(yyvsp[-1].var)); delete (yyvsp[-1].var); } -#line 3951 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3946 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 164: -#line 1254 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1249 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.export_) = new Export(); (yyval.export_)->kind = ExternalKind::Table; (yyval.export_)->var = std::move(*(yyvsp[-1].var)); delete (yyvsp[-1].var); } -#line 3962 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3957 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 165: -#line 1260 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1255 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.export_) = new Export(); (yyval.export_)->kind = ExternalKind::Memory; (yyval.export_)->var = std::move(*(yyvsp[-1].var)); delete (yyvsp[-1].var); } -#line 3973 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3968 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 166: -#line 1266 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1261 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.export_) = new Export(); (yyval.export_)->kind = ExternalKind::Global; (yyval.export_)->var = std::move(*(yyvsp[-1].var)); delete (yyvsp[-1].var); } -#line 3984 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3979 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 167: -#line 1272 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1267 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.export_) = new Export(); (yyval.export_)->kind = ExternalKind::Except; (yyval.export_)->var = std::move(*(yyvsp[-1].var)); delete (yyvsp[-1].var); } -#line 3995 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3990 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 168: -#line 1280 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1275 "src/wast-parser.y" /* yacc.c:1646 */ { auto field = new ExportModuleField((yyvsp[-1].export_), (yylsp[-3])); field->export_->name = (yyvsp[-2].text); (yyval.module_field) = field; } -#line 4005 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4000 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 169: -#line 1288 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1283 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.export_) = new Export(); (yyval.export_)->name = (yyvsp[-1].text); } -#line 4014 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4009 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 170: -#line 1298 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1293 "src/wast-parser.y" /* yacc.c:1646 */ { auto func_type = new FuncType(); func_type->sig = std::move(*(yyvsp[-1].func_sig)); delete (yyvsp[-1].func_sig); (yyval.module_field) = new FuncTypeModuleField(func_type, (yylsp[-2])); } -#line 4025 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4020 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 171: -#line 1304 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1299 "src/wast-parser.y" /* yacc.c:1646 */ { auto func_type = new FuncType(); func_type->name = (yyvsp[-2].text); @@ -4033,88 +4028,90 @@ yyreduce: delete (yyvsp[-1].func_sig); (yyval.module_field) = new FuncTypeModuleField(func_type, (yylsp[-3])); } -#line 4037 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4032 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 172: -#line 1314 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1309 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_field) = new StartModuleField(*(yyvsp[-1].var), (yylsp[-2])); delete (yyvsp[-1].var); } -#line 4046 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4041 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 173: -#line 1321 "src/wast-parser.y" /* yacc.c:1646 */ - { (yyval.module_fields).first = (yyval.module_fields).last = (yyvsp[0].module_field); } -#line 4052 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 1316 "src/wast-parser.y" /* yacc.c:1646 */ + { (yyval.module_fields) = new ModuleFieldList((yyvsp[0].module_field)); } +#line 4047 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 178: -#line 1326 "src/wast-parser.y" /* yacc.c:1646 */ - { (yyval.module_fields).first = (yyval.module_fields).last = (yyvsp[0].module_field); } -#line 4058 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 1321 "src/wast-parser.y" /* yacc.c:1646 */ + { (yyval.module_fields) = new ModuleFieldList((yyvsp[0].module_field)); } +#line 4053 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 179: -#line 1327 "src/wast-parser.y" /* yacc.c:1646 */ - { (yyval.module_fields).first = (yyval.module_fields).last = (yyvsp[0].module_field); } -#line 4064 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 1322 "src/wast-parser.y" /* yacc.c:1646 */ + { (yyval.module_fields) = new ModuleFieldList((yyvsp[0].module_field)); } +#line 4059 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 180: -#line 1328 "src/wast-parser.y" /* yacc.c:1646 */ - { (yyval.module_fields).first = (yyval.module_fields).last = (yyvsp[0].module_field); } -#line 4070 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 1323 "src/wast-parser.y" /* yacc.c:1646 */ + { (yyval.module_fields) = new ModuleFieldList((yyvsp[0].module_field)); } +#line 4065 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 181: -#line 1329 "src/wast-parser.y" /* yacc.c:1646 */ - { (yyval.module_fields).first = (yyval.module_fields).last = (yyvsp[0].module_field); } -#line 4076 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 1324 "src/wast-parser.y" /* yacc.c:1646 */ + { (yyval.module_fields) = new ModuleFieldList((yyvsp[0].module_field)); } +#line 4071 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 182: -#line 1330 "src/wast-parser.y" /* yacc.c:1646 */ - { (yyval.module_fields).first = (yyval.module_fields).last = (yyvsp[0].module_field); } -#line 4082 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 1325 "src/wast-parser.y" /* yacc.c:1646 */ + { (yyval.module_fields) = new ModuleFieldList((yyvsp[0].module_field)); } +#line 4077 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 183: -#line 1331 "src/wast-parser.y" /* yacc.c:1646 */ - { (yyval.module_fields).first = (yyval.module_fields).last = (yyvsp[0].module_field); } -#line 4088 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 1326 "src/wast-parser.y" /* yacc.c:1646 */ + { (yyval.module_fields) = new ModuleFieldList((yyvsp[0].module_field)); } +#line 4083 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 184: -#line 1335 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1330 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module) = new Module(); } -#line 4094 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4089 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 186: -#line 1340 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1335 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module) = new Module(); - check_import_ordering(&(yylsp[0]), lexer, parser, (yyval.module), (yyvsp[0].module_fields).first); - append_module_fields((yyval.module), (yyvsp[0].module_fields).first); + check_import_ordering(&(yylsp[0]), lexer, parser, (yyval.module), *(yyvsp[0].module_fields)); + append_module_fields((yyval.module), (yyvsp[0].module_fields)); + delete (yyvsp[0].module_fields); } -#line 4104 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4100 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 187: -#line 1345 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1341 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module) = (yyvsp[-1].module); - check_import_ordering(&(yylsp[0]), lexer, parser, (yyval.module), (yyvsp[0].module_fields).first); - append_module_fields((yyval.module), (yyvsp[0].module_fields).first); + check_import_ordering(&(yylsp[0]), lexer, parser, (yyval.module), *(yyvsp[0].module_fields)); + append_module_fields((yyval.module), (yyvsp[0].module_fields)); + delete (yyvsp[0].module_fields); } -#line 4114 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4111 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 188: -#line 1353 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1350 "src/wast-parser.y" /* yacc.c:1646 */ { if ((yyvsp[0].script_module)->type == ScriptModule::Type::Text) { (yyval.module) = (yyvsp[0].script_module)->text; @@ -4133,29 +4130,29 @@ yyreduce: } delete (yyvsp[0].script_module); } -#line 4137 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4134 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 190: -#line 1381 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1378 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.var) = new Var(kInvalidIndex); } -#line 4145 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4142 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 191: -#line 1384 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1381 "src/wast-parser.y" /* yacc.c:1646 */ { StringSlice name; DUPTEXT(name, (yyvsp[0].text)); (yyval.var) = new Var(name); } -#line 4155 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4152 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 192: -#line 1392 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1389 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.script_module) = new ScriptModule(); (yyval.script_module)->type = ScriptModule::Type::Text; @@ -4174,11 +4171,11 @@ yyreduce: } } } -#line 4178 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4175 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 193: -#line 1410 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1407 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.script_module) = new ScriptModule(); (yyval.script_module)->type = ScriptModule::Type::Binary; @@ -4187,11 +4184,11 @@ yyreduce: dup_text_list(&(yyvsp[-1].text_list), &(yyval.script_module)->binary.data, &(yyval.script_module)->binary.size); destroy_text_list(&(yyvsp[-1].text_list)); } -#line 4191 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4188 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 194: -#line 1418 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1415 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.script_module) = new ScriptModule(); (yyval.script_module)->type = ScriptModule::Type::Quoted; @@ -4200,11 +4197,11 @@ yyreduce: dup_text_list(&(yyvsp[-1].text_list), &(yyval.script_module)->quoted.data, &(yyval.script_module)->quoted.size); destroy_text_list(&(yyvsp[-1].text_list)); } -#line 4204 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4201 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 195: -#line 1429 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1426 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.action) = new Action(); (yyval.action)->loc = (yylsp[-4]); @@ -4216,11 +4213,11 @@ yyreduce: (yyval.action)->invoke->args = std::move(*(yyvsp[-1].consts)); delete (yyvsp[-1].consts); } -#line 4220 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4217 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 196: -#line 1440 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1437 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.action) = new Action(); (yyval.action)->loc = (yylsp[-3]); @@ -4229,128 +4226,128 @@ yyreduce: (yyval.action)->type = ActionType::Get; (yyval.action)->name = (yyvsp[-1].text); } -#line 4233 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4230 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 197: -#line 1451 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1448 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new AssertMalformedCommand((yyvsp[-2].script_module), (yyvsp[-1].text)); } -#line 4241 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4238 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 198: -#line 1454 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1451 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new AssertInvalidCommand((yyvsp[-2].script_module), (yyvsp[-1].text)); } -#line 4249 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4246 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 199: -#line 1457 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1454 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new AssertUnlinkableCommand((yyvsp[-2].script_module), (yyvsp[-1].text)); } -#line 4257 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4254 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 200: -#line 1460 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1457 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new AssertUninstantiableCommand((yyvsp[-2].script_module), (yyvsp[-1].text)); } -#line 4265 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4262 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 201: -#line 1463 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1460 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new AssertReturnCommand((yyvsp[-2].action), (yyvsp[-1].consts)); } -#line 4273 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4270 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 202: -#line 1466 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1463 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new AssertReturnCanonicalNanCommand((yyvsp[-1].action)); } -#line 4281 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4278 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 203: -#line 1469 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1466 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new AssertReturnArithmeticNanCommand((yyvsp[-1].action)); } -#line 4289 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4286 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 204: -#line 1472 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1469 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new AssertTrapCommand((yyvsp[-2].action), (yyvsp[-1].text)); } -#line 4297 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4294 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 205: -#line 1475 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1472 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new AssertExhaustionCommand((yyvsp[-2].action), (yyvsp[-1].text)); } -#line 4305 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4302 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 206: -#line 1481 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1478 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new ActionCommand((yyvsp[0].action)); } -#line 4313 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4310 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 208: -#line 1485 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1482 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new ModuleCommand((yyvsp[0].module)); } -#line 4321 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4318 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 209: -#line 1488 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1485 "src/wast-parser.y" /* yacc.c:1646 */ { auto* command = new RegisterCommand((yyvsp[-2].text), *(yyvsp[-1].var)); delete (yyvsp[-1].var); command->var.loc = (yylsp[-1]); (yyval.command) = command; } -#line 4332 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4329 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 210: -#line 1496 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1493 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.commands) = new CommandPtrVector(); (yyval.commands)->emplace_back((yyvsp[0].command)); } -#line 4341 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4338 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 211: -#line 1500 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1497 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.commands) = (yyvsp[-1].commands); (yyval.commands)->emplace_back((yyvsp[0].command)); } -#line 4350 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4347 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 212: -#line 1507 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1504 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.const_).loc = (yylsp[-2]); if (Failed(parse_const((yyvsp[-2].type), (yyvsp[-1].literal).type, (yyvsp[-1].literal).text.start, @@ -4361,34 +4358,34 @@ yyreduce: } delete [] (yyvsp[-1].literal).text.start; } -#line 4365 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4362 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 213: -#line 1519 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1516 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.consts) = new ConstVector(); } -#line 4371 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4368 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 214: -#line 1520 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1517 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.consts) = (yyvsp[-1].consts); (yyval.consts)->push_back((yyvsp[0].const_)); } -#line 4380 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4377 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 215: -#line 1527 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1524 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.script) = new Script(); } -#line 4388 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4385 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 216: -#line 1530 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1527 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.script) = new Script(); (yyval.script)->commands = std::move(*(yyvsp[0].commands)); @@ -4453,26 +4450,26 @@ yyreduce: } } } -#line 4457 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4454 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 217: -#line 1594 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1591 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.script) = new Script(); (yyval.script)->commands.emplace_back(new ModuleCommand((yyvsp[0].module))); } -#line 4466 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4463 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 218: -#line 1603 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1600 "src/wast-parser.y" /* yacc.c:1646 */ { parser->script = (yyvsp[0].script); } -#line 4472 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4469 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; -#line 4476 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4473 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ default: break; } /* User semantic actions sometimes alter yychar, and that requires @@ -4707,7 +4704,7 @@ yyreturn: #endif return yyresult; } -#line 1606 "src/wast-parser.y" /* yacc.c:1906 */ +#line 1603 "src/wast-parser.y" /* yacc.c:1906 */ Result parse_const(Type type, @@ -4831,9 +4828,9 @@ void append_implicit_func_declaration(Location* loc, } void check_import_ordering(Location* loc, WastLexer* lexer, WastParser* parser, - Module* module, ModuleField* first) { - for (ModuleField* field = first; field; field = field->next) { - if (field->type == ModuleFieldType::Import) { + Module* module, const ModuleFieldList& fields) { + for (const ModuleField& field: fields) { + if (field.type == ModuleFieldType::Import) { if (module->funcs.size() != module->num_func_imports || module->tables.size() != module->num_table_imports || module->memories.size() != module->num_memory_imports || @@ -4847,19 +4844,19 @@ void check_import_ordering(Location* loc, WastLexer* lexer, WastParser* parser, } } -void append_module_fields(Module* module, ModuleField* first) { - ModuleField* main_field = first; +void append_module_fields(Module* module, ModuleFieldList* fields) { + ModuleField* main_field = &fields->front(); Index main_index = kInvalidIndex; - for (ModuleField* field = first; field; field = field->next) { + for (ModuleField& field : *fields) { StringSlice* name = nullptr; BindingHash* bindings = nullptr; Index index = kInvalidIndex; - switch (field->type) { + switch (field.type) { case ModuleFieldType::Func: { - Func* func = cast<FuncModuleField>(field)->func; - append_implicit_func_declaration(&field->loc, module, &func->decl); + Func* func = cast<FuncModuleField>(&field)->func; + append_implicit_func_declaration(&field.loc, module, &func->decl); name = &func->name; bindings = &module->func_bindings; index = module->funcs.size(); @@ -4868,7 +4865,7 @@ void append_module_fields(Module* module, ModuleField* first) { } case ModuleFieldType::Global: { - Global* global = cast<GlobalModuleField>(field)->global; + Global* global = cast<GlobalModuleField>(&field)->global; name = &global->name; bindings = &module->global_bindings; index = module->globals.size(); @@ -4877,11 +4874,11 @@ void append_module_fields(Module* module, ModuleField* first) { } case ModuleFieldType::Import: { - Import* import = cast<ImportModuleField>(field)->import; + Import* import = cast<ImportModuleField>(&field)->import; switch (import->kind) { case ExternalKind::Func: - append_implicit_func_declaration(&field->loc, module, + append_implicit_func_declaration(&field.loc, module, &import->func->decl); name = &import->func->name; bindings = &module->func_bindings; @@ -4923,8 +4920,8 @@ void append_module_fields(Module* module, ModuleField* first) { } case ModuleFieldType::Export: { - Export* export_ = cast<ExportModuleField>(field)->export_; - if (field != main_field) { + Export* export_ = cast<ExportModuleField>(&field)->export_; + if (&field != main_field) { // If this is not the main field, it must be an inline export. export_->var.type = VarType::Index; export_->var.index = main_index; @@ -4937,7 +4934,7 @@ void append_module_fields(Module* module, ModuleField* first) { } case ModuleFieldType::FuncType: { - FuncType* func_type = cast<FuncTypeModuleField>(field)->func_type; + FuncType* func_type = cast<FuncTypeModuleField>(&field)->func_type; name = &func_type->name; bindings = &module->func_type_bindings; index = module->func_types.size(); @@ -4946,7 +4943,7 @@ void append_module_fields(Module* module, ModuleField* first) { } case ModuleFieldType::Table: { - Table* table = cast<TableModuleField>(field)->table; + Table* table = cast<TableModuleField>(&field)->table; name = &table->name; bindings = &module->table_bindings; index = module->tables.size(); @@ -4956,8 +4953,8 @@ void append_module_fields(Module* module, ModuleField* first) { case ModuleFieldType::ElemSegment: { ElemSegment* elem_segment = - cast<ElemSegmentModuleField>(field)->elem_segment; - if (field != main_field) { + cast<ElemSegmentModuleField>(&field)->elem_segment; + if (&field != main_field) { // If this is not the main field, it must be an inline elem segment. elem_segment->table_var.type = VarType::Index; elem_segment->table_var.index = main_index; @@ -4967,7 +4964,7 @@ void append_module_fields(Module* module, ModuleField* first) { } case ModuleFieldType::Memory: { - Memory* memory = cast<MemoryModuleField>(field)->memory; + Memory* memory = cast<MemoryModuleField>(&field)->memory; name = &memory->name; bindings = &module->memory_bindings; index = module->memories.size(); @@ -4977,8 +4974,8 @@ void append_module_fields(Module* module, ModuleField* first) { case ModuleFieldType::DataSegment: { DataSegment* data_segment = - cast<DataSegmentModuleField>(field)->data_segment; - if (field != main_field) { + cast<DataSegmentModuleField>(&field)->data_segment; + if (&field != main_field) { // If this is not the main field, it must be an inline data segment. data_segment->memory_var.type = VarType::Index; data_segment->memory_var.index = main_index; @@ -4988,7 +4985,7 @@ void append_module_fields(Module* module, ModuleField* first) { } case ModuleFieldType::Except: { - Exception* except = cast<ExceptionModuleField>(field)->except; + Exception* except = cast<ExceptionModuleField>(&field)->except; name = &except->name; bindings = &module->except_bindings; index = module->excepts.size(); @@ -4997,28 +4994,24 @@ void append_module_fields(Module* module, ModuleField* first) { } case ModuleFieldType::Start: - module->start = &cast<StartModuleField>(field)->start; + module->start = &cast<StartModuleField>(&field)->start; break; } - if (field == main_field) + if (&field == main_field) main_index = index; - if (module->last_field) - module->last_field->next = field; - else - module->first_field = field; - module->last_field = field; - if (name && bindings) { // Exported names are allowed to be empty; other names aren't. if (bindings == &module->export_bindings || !string_slice_is_empty(name)) { bindings->emplace(string_slice_to_string(*name), - Binding(field->loc, index)); + Binding(field.loc, index)); } } } + + module->fields.splice(module->fields.end(), *fields); } Result parse_wast(WastLexer* lexer, Script** out_script, diff --git a/src/validator.cc b/src/validator.cc index ba2cfb79..0373ac1c 100644 --- a/src/validator.cc +++ b/src/validator.cc @@ -753,8 +753,8 @@ void Validator::CheckTable(const Location* loc, const Table* table) { } void Validator::CheckElemSegments(const Module* module) { - for (ModuleField* field = module->first_field; field; field = field->next) { - if (auto elem_segment_field = dyn_cast<ElemSegmentModuleField>(field)) { + for (const ModuleField& field : module->fields) { + if (auto elem_segment_field = dyn_cast<ElemSegmentModuleField>(&field)) { ElemSegment* elem_segment = elem_segment_field->elem_segment; const Table* table; if (!Succeeded(CheckTableVar(&elem_segment->table_var, &table))) @@ -765,7 +765,7 @@ void Validator::CheckElemSegments(const Module* module) { continue; } - CheckConstInitExpr(&field->loc, elem_segment->offset, Type::I32, + CheckConstInitExpr(&field.loc, elem_segment->offset, Type::I32, "elem segment offset"); } } @@ -778,14 +778,14 @@ void Validator::CheckMemory(const Location* loc, const Memory* memory) { } void Validator::CheckDataSegments(const Module* module) { - for (ModuleField* field = module->first_field; field; field = field->next) { - if (auto data_segment_field = dyn_cast<DataSegmentModuleField>(field)) { + for (const ModuleField& field : module->fields) { + if (auto data_segment_field = dyn_cast<DataSegmentModuleField>(&field)) { DataSegment* data_segment = data_segment_field->data_segment; const Memory* memory; if (!Succeeded(CheckMemoryVar(&data_segment->memory_var, &memory))) continue; - CheckConstInitExpr(&field->loc, data_segment->offset, Type::I32, + CheckConstInitExpr(&field.loc, data_segment->offset, Type::I32, "data segment offset"); } } @@ -866,32 +866,32 @@ Result Validator::CheckModule(const Module* module) { num_imported_globals_ = 0; current_except_index_ = 0; - for (ModuleField* field = module->first_field; field; field = field->next) { - switch (field->type) { + for (const ModuleField& field : module->fields) { + switch (field.type) { case ModuleFieldType::Except: ++current_except_index_; - CheckExcept(&field->loc, cast<ExceptionModuleField>(field)->except); + CheckExcept(&field.loc, cast<ExceptionModuleField>(&field)->except); break; case ModuleFieldType::Func: - CheckFunc(&field->loc, cast<FuncModuleField>(field)->func); + CheckFunc(&field.loc, cast<FuncModuleField>(&field)->func); break; case ModuleFieldType::Global: - CheckGlobal(&field->loc, cast<GlobalModuleField>(field)->global); + CheckGlobal(&field.loc, cast<GlobalModuleField>(&field)->global); current_global_index_++; break; case ModuleFieldType::Import: - CheckImport(&field->loc, cast<ImportModuleField>(field)->import); + CheckImport(&field.loc, cast<ImportModuleField>(&field)->import); break; case ModuleFieldType::Export: - CheckExport(&field->loc, cast<ExportModuleField>(field)->export_); + CheckExport(&field.loc, cast<ExportModuleField>(&field)->export_); break; case ModuleFieldType::Table: - CheckTable(&field->loc, cast<TableModuleField>(field)->table); + CheckTable(&field.loc, cast<TableModuleField>(&field)->table); current_table_index_++; break; @@ -900,7 +900,7 @@ Result Validator::CheckModule(const Module* module) { break; case ModuleFieldType::Memory: - CheckMemory(&field->loc, cast<MemoryModuleField>(field)->memory); + CheckMemory(&field.loc, cast<MemoryModuleField>(&field)->memory); current_memory_index_++; break; @@ -913,18 +913,18 @@ Result Validator::CheckModule(const Module* module) { case ModuleFieldType::Start: { if (seen_start) { - PrintError(&field->loc, "only one start function allowed"); + PrintError(&field.loc, "only one start function allowed"); } const Func* start_func = nullptr; - CheckFuncVar(&cast<StartModuleField>(field)->start, &start_func); + CheckFuncVar(&cast<StartModuleField>(&field)->start, &start_func); if (start_func) { if (start_func->GetNumParams() != 0) { - PrintError(&field->loc, "start function must be nullary"); + PrintError(&field.loc, "start function must be nullary"); } if (start_func->GetNumResults() != 0) { - PrintError(&field->loc, "start function must not return anything"); + PrintError(&field.loc, "start function must not return anything"); } } seen_start = true; diff --git a/src/wast-parser-lexer-shared.cc b/src/wast-parser-lexer-shared.cc index 22111c41..ae334f64 100644 --- a/src/wast-parser-lexer-shared.cc +++ b/src/wast-parser-lexer-shared.cc @@ -77,13 +77,4 @@ void destroy_text_list(TextList* text_list) { } } -void destroy_module_field_list(ModuleFieldList* fields) { - ModuleField* field = fields->first; - while (field) { - ModuleField* next = field->next; - delete field; - field = next; - } -} - } // namespace wabt diff --git a/src/wast-parser-lexer-shared.h b/src/wast-parser-lexer-shared.h index fa36bd4d..b7666b5d 100644 --- a/src/wast-parser-lexer-shared.h +++ b/src/wast-parser-lexer-shared.h @@ -42,11 +42,6 @@ struct TextList { TextListNode* last; }; -struct ModuleFieldList { - ModuleField* first; - ModuleField* last; -}; - union Token { /* terminals */ StringSlice text; @@ -81,7 +76,7 @@ union Token { Memory* memory; Module* module; ModuleField* module_field; - ModuleFieldList module_fields; + ModuleFieldList* module_fields; ScriptModule* script_module; Script* script; Table* table; diff --git a/src/wast-parser.y b/src/wast-parser.y index c85fa7b6..2202ea97 100644 --- a/src/wast-parser.y +++ b/src/wast-parser.y @@ -132,8 +132,8 @@ static void check_import_ordering(Location* loc, WastLexer* lexer, WastParser* parser, Module* module, - ModuleField* first); -static void append_module_fields(Module*, ModuleField*); + const ModuleFieldList&); +static void append_module_fields(Module*, ModuleFieldList*); class BinaryErrorHandlerModule : public BinaryErrorHandler { public: @@ -232,7 +232,7 @@ class BinaryErrorHandlerModule : public BinaryErrorHandler { %destructor { delete $$; } <export_> %destructor { delete $$; } <expr> %destructor { delete $$; } <expr_list> -%destructor { destroy_module_field_list(&$$); } <module_fields> +%destructor { delete $$; } <module_fields> %destructor { delete $$; } <func> %destructor { delete $$; } <func_sig> %destructor { delete $$; } <global> @@ -848,7 +848,7 @@ exception_field : func : LPAR FUNC bind_var_opt func_fields RPAR { $$ = $4; - ModuleField* main_field = $$.first; + ModuleField* main_field = &$$->front(); main_field->loc = @2; if (auto func_field = dyn_cast<FuncModuleField>(main_field)) { func_field->func->name = $3; @@ -864,11 +864,10 @@ func_fields : field->func->decl.has_func_type = true; field->func->decl.type_var = std::move(*$1); delete $1; - $$.first = $$.last = field; + $$ = new ModuleFieldList(field); } | func_fields_body { - auto field = new FuncModuleField($1); - $$.first = $$.last = field; + $$ = new ModuleFieldList(new FuncModuleField($1)); } | inline_import type_use func_fields_import { auto field = new ImportModuleField($1, @1); @@ -877,19 +876,19 @@ func_fields : field->import->func->decl.has_func_type = true; field->import->func->decl.type_var = std::move(*$2); delete $2; - $$.first = $$.last = field; + $$ = new ModuleFieldList(field); } | inline_import func_fields_import { auto field = new ImportModuleField($1, @1); field->import->kind = ExternalKind::Func; field->import->func = $2; - $$.first = $$.last = field; + $$ = new ModuleFieldList(field); } | inline_export func_fields { auto field = new ExportModuleField($1, @1); field->export_->kind = ExternalKind::Func; - $$.first = $2.first; - $$.last = $2.last->next = field; + $$ = $2; + $$->push_back(field); } ; @@ -1024,7 +1023,7 @@ elem : table : LPAR TABLE bind_var_opt table_fields RPAR { $$ = $4; - ModuleField* main_field = $$.first; + ModuleField* main_field = &$$->front(); main_field->loc = @2; if (auto table_field = dyn_cast<TableModuleField>(main_field)) { table_field->table->name = $3; @@ -1036,27 +1035,25 @@ table : table_fields : table_sig { - auto field = new TableModuleField($1); - $$.first = $$.last = field; + $$ = new ModuleFieldList(new TableModuleField($1)); } | inline_import table_sig { auto field = new ImportModuleField($1); field->import->kind = ExternalKind::Table; field->import->table = $2; - $$.first = $$.last = field; + $$ = new ModuleFieldList(field); } | inline_export table_fields { auto field = new ExportModuleField($1, @1); field->export_->kind = ExternalKind::Table; - $$.first = $2.first; - $$.last = $2.last->next = field; + $$ = $2; + $$->push_back(field); } | elem_type LPAR ELEM var_list RPAR { auto table = new Table(); table->elem_limits.initial = $4->size(); table->elem_limits.max = $4->size(); table->elem_limits.has_max = true; - auto table_field = new TableModuleField(table); auto elem_segment = new ElemSegment(); elem_segment->table_var = Var(kInvalidIndex); @@ -1064,9 +1061,10 @@ table_fields : elem_segment->offset.back().loc = @3; elem_segment->vars = std::move(*$4); delete $4; - auto elem_field = new ElemSegmentModuleField(elem_segment, @3); - $$.first = table_field; - $$.last = table_field->next = elem_field; + + $$ = new ModuleFieldList(); + $$->push_back(new TableModuleField(table)); + $$->push_back(new ElemSegmentModuleField(elem_segment, @3)); } ; @@ -1097,7 +1095,7 @@ data : memory : LPAR MEMORY bind_var_opt memory_fields RPAR { $$ = $4; - ModuleField* main_field = $$.first; + ModuleField* main_field = &$$->front(); main_field->loc = @2; if (auto memory_field = dyn_cast<MemoryModuleField>(main_field)) { memory_field->memory->name = $3; @@ -1109,20 +1107,19 @@ memory : memory_fields : memory_sig { - auto field = new MemoryModuleField($1); - $$.first = $$.last = field; + $$ = new ModuleFieldList(new MemoryModuleField($1)); } | inline_import memory_sig { auto field = new ImportModuleField($1); field->import->kind = ExternalKind::Memory; field->import->memory = $2; - $$.first = $$.last = field; + $$ = new ModuleFieldList(field); } | inline_export memory_fields { auto field = new ExportModuleField($1, @1); field->export_->kind = ExternalKind::Memory; - $$.first = $2.first; - $$.last = $2.last->next = field; + $$ = $2; + $$->push_back(field); } | LPAR DATA text_list_opt RPAR { auto data_segment = new DataSegment(); @@ -1131,7 +1128,6 @@ memory_fields : data_segment->offset.back().loc = @2; dup_text_list(&$3, &data_segment->data, &data_segment->size); destroy_text_list(&$3); - auto data_field = new DataSegmentModuleField(data_segment, @2); uint32_t byte_size = WABT_ALIGN_UP_TO_PAGE(data_segment->size); uint32_t page_size = WABT_BYTES_TO_PAGES(byte_size); @@ -1140,16 +1136,17 @@ memory_fields : memory->page_limits.initial = page_size; memory->page_limits.max = page_size; memory->page_limits.has_max = true; - auto memory_field = new MemoryModuleField(memory); - $$.first = memory_field; - $$.last = memory_field->next = data_field; + + $$ = new ModuleFieldList(); + $$->push_back(new MemoryModuleField(memory)); + $$->push_back(new DataSegmentModuleField(data_segment, @2)); } ; global : LPAR GLOBAL bind_var_opt global_fields RPAR { $$ = $4; - ModuleField* main_field = $$.first; + ModuleField* main_field = &$$->front(); main_field->loc = @2; if (auto global_field = dyn_cast<GlobalModuleField>(main_field)) { global_field->global->name = $3; @@ -1164,19 +1161,19 @@ global_fields : auto field = new GlobalModuleField($1); field->global->init_expr = std::move(*$2); delete $2; - $$.first = $$.last = field; + $$ = new ModuleFieldList(field); } | inline_import global_type { auto field = new ImportModuleField($1); field->import->kind = ExternalKind::Global; field->import->global = $2; - $$.first = $$.last = field; + $$ = new ModuleFieldList(field); } | inline_export global_fields { auto field = new ExportModuleField($1, @1); field->export_->kind = ExternalKind::Global; - $$.first = $2.first; - $$.last = $2.last->next = field; + $$ = $2; + $$->push_back(field); } ; @@ -1316,17 +1313,17 @@ start : ; module_field : - type_def { $$.first = $$.last = $1; } + type_def { $$ = new ModuleFieldList($1); } | global | table | memory | func - | elem { $$.first = $$.last = $1; } - | data { $$.first = $$.last = $1; } - | start { $$.first = $$.last = $1; } - | import { $$.first = $$.last = $1; } - | export { $$.first = $$.last = $1; } - | exception_field { $$.first = $$.last = $1; } + | elem { $$ = new ModuleFieldList($1); } + | data { $$ = new ModuleFieldList($1); } + | start { $$ = new ModuleFieldList($1); } + | import { $$ = new ModuleFieldList($1); } + | export { $$ = new ModuleFieldList($1); } + | exception_field { $$ = new ModuleFieldList($1); } ; module_fields_opt : @@ -1337,13 +1334,15 @@ module_fields_opt : module_fields : module_field { $$ = new Module(); - check_import_ordering(&@1, lexer, parser, $$, $1.first); - append_module_fields($$, $1.first); + check_import_ordering(&@1, lexer, parser, $$, *$1); + append_module_fields($$, $1); + delete $1; } | module_fields module_field { $$ = $1; - check_import_ordering(&@2, lexer, parser, $$, $2.first); - append_module_fields($$, $2.first); + check_import_ordering(&@2, lexer, parser, $$, *$2); + append_module_fields($$, $2); + delete $2; } ; @@ -1724,9 +1723,9 @@ void append_implicit_func_declaration(Location* loc, } void check_import_ordering(Location* loc, WastLexer* lexer, WastParser* parser, - Module* module, ModuleField* first) { - for (ModuleField* field = first; field; field = field->next) { - if (field->type == ModuleFieldType::Import) { + Module* module, const ModuleFieldList& fields) { + for (const ModuleField& field: fields) { + if (field.type == ModuleFieldType::Import) { if (module->funcs.size() != module->num_func_imports || module->tables.size() != module->num_table_imports || module->memories.size() != module->num_memory_imports || @@ -1740,19 +1739,19 @@ void check_import_ordering(Location* loc, WastLexer* lexer, WastParser* parser, } } -void append_module_fields(Module* module, ModuleField* first) { - ModuleField* main_field = first; +void append_module_fields(Module* module, ModuleFieldList* fields) { + ModuleField* main_field = &fields->front(); Index main_index = kInvalidIndex; - for (ModuleField* field = first; field; field = field->next) { + for (ModuleField& field : *fields) { StringSlice* name = nullptr; BindingHash* bindings = nullptr; Index index = kInvalidIndex; - switch (field->type) { + switch (field.type) { case ModuleFieldType::Func: { - Func* func = cast<FuncModuleField>(field)->func; - append_implicit_func_declaration(&field->loc, module, &func->decl); + Func* func = cast<FuncModuleField>(&field)->func; + append_implicit_func_declaration(&field.loc, module, &func->decl); name = &func->name; bindings = &module->func_bindings; index = module->funcs.size(); @@ -1761,7 +1760,7 @@ void append_module_fields(Module* module, ModuleField* first) { } case ModuleFieldType::Global: { - Global* global = cast<GlobalModuleField>(field)->global; + Global* global = cast<GlobalModuleField>(&field)->global; name = &global->name; bindings = &module->global_bindings; index = module->globals.size(); @@ -1770,11 +1769,11 @@ void append_module_fields(Module* module, ModuleField* first) { } case ModuleFieldType::Import: { - Import* import = cast<ImportModuleField>(field)->import; + Import* import = cast<ImportModuleField>(&field)->import; switch (import->kind) { case ExternalKind::Func: - append_implicit_func_declaration(&field->loc, module, + append_implicit_func_declaration(&field.loc, module, &import->func->decl); name = &import->func->name; bindings = &module->func_bindings; @@ -1816,8 +1815,8 @@ void append_module_fields(Module* module, ModuleField* first) { } case ModuleFieldType::Export: { - Export* export_ = cast<ExportModuleField>(field)->export_; - if (field != main_field) { + Export* export_ = cast<ExportModuleField>(&field)->export_; + if (&field != main_field) { // If this is not the main field, it must be an inline export. export_->var.type = VarType::Index; export_->var.index = main_index; @@ -1830,7 +1829,7 @@ void append_module_fields(Module* module, ModuleField* first) { } case ModuleFieldType::FuncType: { - FuncType* func_type = cast<FuncTypeModuleField>(field)->func_type; + FuncType* func_type = cast<FuncTypeModuleField>(&field)->func_type; name = &func_type->name; bindings = &module->func_type_bindings; index = module->func_types.size(); @@ -1839,7 +1838,7 @@ void append_module_fields(Module* module, ModuleField* first) { } case ModuleFieldType::Table: { - Table* table = cast<TableModuleField>(field)->table; + Table* table = cast<TableModuleField>(&field)->table; name = &table->name; bindings = &module->table_bindings; index = module->tables.size(); @@ -1849,8 +1848,8 @@ void append_module_fields(Module* module, ModuleField* first) { case ModuleFieldType::ElemSegment: { ElemSegment* elem_segment = - cast<ElemSegmentModuleField>(field)->elem_segment; - if (field != main_field) { + cast<ElemSegmentModuleField>(&field)->elem_segment; + if (&field != main_field) { // If this is not the main field, it must be an inline elem segment. elem_segment->table_var.type = VarType::Index; elem_segment->table_var.index = main_index; @@ -1860,7 +1859,7 @@ void append_module_fields(Module* module, ModuleField* first) { } case ModuleFieldType::Memory: { - Memory* memory = cast<MemoryModuleField>(field)->memory; + Memory* memory = cast<MemoryModuleField>(&field)->memory; name = &memory->name; bindings = &module->memory_bindings; index = module->memories.size(); @@ -1870,8 +1869,8 @@ void append_module_fields(Module* module, ModuleField* first) { case ModuleFieldType::DataSegment: { DataSegment* data_segment = - cast<DataSegmentModuleField>(field)->data_segment; - if (field != main_field) { + cast<DataSegmentModuleField>(&field)->data_segment; + if (&field != main_field) { // If this is not the main field, it must be an inline data segment. data_segment->memory_var.type = VarType::Index; data_segment->memory_var.index = main_index; @@ -1881,7 +1880,7 @@ void append_module_fields(Module* module, ModuleField* first) { } case ModuleFieldType::Except: { - Exception* except = cast<ExceptionModuleField>(field)->except; + Exception* except = cast<ExceptionModuleField>(&field)->except; name = &except->name; bindings = &module->except_bindings; index = module->excepts.size(); @@ -1890,28 +1889,24 @@ void append_module_fields(Module* module, ModuleField* first) { } case ModuleFieldType::Start: - module->start = &cast<StartModuleField>(field)->start; + module->start = &cast<StartModuleField>(&field)->start; break; } - if (field == main_field) + if (&field == main_field) main_index = index; - if (module->last_field) - module->last_field->next = field; - else - module->first_field = field; - module->last_field = field; - if (name && bindings) { // Exported names are allowed to be empty; other names aren't. if (bindings == &module->export_bindings || !string_slice_is_empty(name)) { bindings->emplace(string_slice_to_string(*name), - Binding(field->loc, index)); + Binding(field.loc, index)); } } } + + module->fields.splice(module->fields.end(), *fields); } Result parse_wast(WastLexer* lexer, Script** out_script, diff --git a/src/wat-writer.cc b/src/wat-writer.cc index 2fd2bbc5..4f81b539 100644 --- a/src/wat-writer.cc +++ b/src/wat-writer.cc @@ -1147,41 +1147,40 @@ Result WatWriter::WriteModule(const Module* module) { module_ = module; BuildExportMap(); WriteOpenNewline("module"); - for (const ModuleField* field = module->first_field; field; - field = field->next) { - switch (field->type) { + for (const ModuleField& field : module->fields) { + switch (field.type) { case ModuleFieldType::Func: - WriteFunc(module, cast<FuncModuleField>(field)->func); + WriteFunc(module, cast<FuncModuleField>(&field)->func); break; case ModuleFieldType::Global: - WriteGlobal(cast<GlobalModuleField>(field)->global); + WriteGlobal(cast<GlobalModuleField>(&field)->global); break; case ModuleFieldType::Import: - WriteImport(cast<ImportModuleField>(field)->import); + WriteImport(cast<ImportModuleField>(&field)->import); break; case ModuleFieldType::Except: - WriteException(cast<ExceptionModuleField>(field)->except); + WriteException(cast<ExceptionModuleField>(&field)->except); break; case ModuleFieldType::Export: - WriteExport(cast<ExportModuleField>(field)->export_); + WriteExport(cast<ExportModuleField>(&field)->export_); break; case ModuleFieldType::Table: - WriteTable(cast<TableModuleField>(field)->table); + WriteTable(cast<TableModuleField>(&field)->table); break; case ModuleFieldType::ElemSegment: - WriteElemSegment(cast<ElemSegmentModuleField>(field)->elem_segment); + WriteElemSegment(cast<ElemSegmentModuleField>(&field)->elem_segment); break; case ModuleFieldType::Memory: - WriteMemory(cast<MemoryModuleField>(field)->memory); + WriteMemory(cast<MemoryModuleField>(&field)->memory); break; case ModuleFieldType::DataSegment: - WriteDataSegment(cast<DataSegmentModuleField>(field)->data_segment); + WriteDataSegment(cast<DataSegmentModuleField>(&field)->data_segment); break; case ModuleFieldType::FuncType: - WriteFuncType(cast<FuncTypeModuleField>(field)->func_type); + WriteFuncType(cast<FuncTypeModuleField>(&field)->func_type); break; case ModuleFieldType::Start: - WriteStartFunction(&cast<StartModuleField>(field)->start); + WriteStartFunction(&cast<StartModuleField>(&field)->start); break; } } |