summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/binary-reader-ir.cc22
-rw-r--r--src/ir.cc23
-rw-r--r--src/ir.h9
-rw-r--r--src/prebuilt/wast-parser-gen.cc583
-rw-r--r--src/validator.cc38
-rw-r--r--src/wast-parser-lexer-shared.cc9
-rw-r--r--src/wast-parser-lexer-shared.h7
-rw-r--r--src/wast-parser.y151
-rw-r--r--src/wat-writer.cc27
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;
}
diff --git a/src/ir.cc b/src/ir.cc
index cd6e4d90..9ae3a8ed 100644
--- a/src/ir.cc
+++ b/src/ir.cc
@@ -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) {}
diff --git a/src/ir.h b/src/ir.h
index b77f28b3..cdd0908f 100644
--- a/src/ir.h
+++ b/src/ir.h
@@ -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;
}
}