diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/apply-names.cc | 26 | ||||
-rw-r--r-- | src/binary-reader-interpreter.cc | 2 | ||||
-rw-r--r-- | src/binary-reader-ir.cc | 24 | ||||
-rw-r--r-- | src/binary-writer-spec.cc | 18 | ||||
-rw-r--r-- | src/binary-writer.cc | 69 | ||||
-rw-r--r-- | src/binding-hash.cc | 8 | ||||
-rw-r--r-- | src/binding-hash.h | 14 | ||||
-rw-r--r-- | src/generate-names.cc | 8 | ||||
-rw-r--r-- | src/interpreter.cc | 2 | ||||
-rw-r--r-- | src/ir.cc | 295 | ||||
-rw-r--r-- | src/ir.h | 186 | ||||
-rw-r--r-- | src/prebuilt/wast-parser-gen.cc | 838 | ||||
-rw-r--r-- | src/resolve-names.cc | 10 | ||||
-rw-r--r-- | src/tools/wast-desugar.cc | 2 | ||||
-rw-r--r-- | src/tools/wast2wasm.cc | 2 | ||||
-rw-r--r-- | src/validator.cc | 36 | ||||
-rw-r--r-- | src/wast-parser-lexer-shared.h | 2 | ||||
-rw-r--r-- | src/wast-parser.y | 124 | ||||
-rw-r--r-- | src/wat-writer.cc | 30 |
19 files changed, 880 insertions, 816 deletions
diff --git a/src/apply-names.cc b/src/apply-names.cc index acfd511b..b1c77299 100644 --- a/src/apply-names.cc +++ b/src/apply-names.cc @@ -119,7 +119,7 @@ void NameApplier::UseNameForVar(StringSlice* name, Var* var) { } Result NameApplier::UseNameForFuncTypeVar(Module* module, Var* var) { - FuncType* func_type = get_func_type_by_var(module, var); + FuncType* func_type = module->GetFuncType(*var); if (!func_type) return Result::Error; UseNameForVar(&func_type->name, var); @@ -127,7 +127,7 @@ Result NameApplier::UseNameForFuncTypeVar(Module* module, Var* var) { } Result NameApplier::UseNameForFuncVar(Module* module, Var* var) { - Func* func = get_func_by_var(module, var); + Func* func = module->GetFunc(*var); if (!func) return Result::Error; UseNameForVar(&func->name, var); @@ -135,7 +135,7 @@ Result NameApplier::UseNameForFuncVar(Module* module, Var* var) { } Result NameApplier::UseNameForGlobalVar(Module* module, Var* var) { - Global* global = get_global_by_var(module, var); + Global* global = module->GetGlobal(*var); if (!global) return Result::Error; UseNameForVar(&global->name, var); @@ -143,7 +143,7 @@ Result NameApplier::UseNameForGlobalVar(Module* module, Var* var) { } Result NameApplier::UseNameForTableVar(Module* module, Var* var) { - Table* table = get_table_by_var(module, var); + Table* table = module->GetTable(*var); if (!table) return Result::Error; UseNameForVar(&table->name, var); @@ -151,7 +151,7 @@ Result NameApplier::UseNameForTableVar(Module* module, Var* var) { } Result NameApplier::UseNameForMemoryVar(Module* module, Var* var) { - Memory* memory = get_memory_by_var(module, var); + Memory* memory = module->GetMemory(*var); if (!memory) return Result::Error; UseNameForVar(&memory->name, var); @@ -159,11 +159,11 @@ Result NameApplier::UseNameForMemoryVar(Module* module, Var* var) { } Result NameApplier::UseNameForParamAndLocalVar(Func* func, Var* var) { - Index local_index = get_local_index_by_var(func, var); - if (local_index >= get_num_params_and_locals(func)) + Index local_index = func->GetLocalIndex(*var); + if (local_index >= func->GetNumParamsAndLocals()) return Result::Error; - Index num_params = get_num_params(func); + Index num_params = func->GetNumParams(); std::string* name; if (local_index < num_params) { /* param */ @@ -280,15 +280,15 @@ Result NameApplier::OnTeeLocalExpr(Expr* expr) { Result NameApplier::VisitFunc(Index func_index, Func* func) { current_func_ = func; - if (decl_has_func_type(&func->decl)) { + if (func->decl.has_func_type) { CHECK_RESULT(UseNameForFuncTypeVar(module_, &func->decl.type_var)); } - make_type_binding_reverse_mapping( - func->decl.sig.param_types, func->param_bindings, ¶m_index_to_name_); + MakeTypeBindingReverseMapping(func->decl.sig.param_types, + func->param_bindings, ¶m_index_to_name_); - make_type_binding_reverse_mapping(func->local_types, func->local_bindings, - &local_index_to_name_); + MakeTypeBindingReverseMapping(func->local_types, func->local_bindings, + &local_index_to_name_); CHECK_RESULT(visitor_.VisitFunc(func)); current_func_ = nullptr; diff --git a/src/binary-reader-interpreter.cc b/src/binary-reader-interpreter.cc index c912ba51..52fcc32e 100644 --- a/src/binary-reader-interpreter.cc +++ b/src/binary-reader-interpreter.cc @@ -649,7 +649,7 @@ wabt::Result BinaryReaderInterpreter::AppendExport(Module* module, ExternalKind kind, Index item_index, StringSlice name) { - if (module->export_bindings.FindIndex(name) != -1) { + if (module->export_bindings.FindIndex(name) != kInvalidIndex) { PrintError("duplicate export \"" PRIstringslice "\"", WABT_PRINTF_STRING_SLICE_ARG(name)); return wabt::Result::Error; diff --git a/src/binary-reader-ir.cc b/src/binary-reader-ir.cc index b741244d..029cb3fc 100644 --- a/src/binary-reader-ir.cc +++ b/src/binary-reader-ir.cc @@ -278,7 +278,7 @@ Result BinaryReaderIR::OnType(Index index, Type* param_types, Index result_count, Type* result_types) { - ModuleField* field = append_module_field(module); + ModuleField* field = module->AppendField(); field->type = ModuleFieldType::FuncType; field->func_type = new FuncType(); @@ -297,7 +297,7 @@ Result BinaryReaderIR::OnImportCount(Index count) { Result BinaryReaderIR::OnImport(Index index, StringSlice module_name, StringSlice field_name) { - ModuleField* field = append_module_field(module); + ModuleField* field = module->AppendField(); field->type = ModuleFieldType::Import; field->import = new Import(); @@ -382,7 +382,7 @@ Result BinaryReaderIR::OnFunctionCount(Index count) { } Result BinaryReaderIR::OnFunction(Index index, Index sig_index) { - ModuleField* field = append_module_field(module); + ModuleField* field = module->AppendField(); field->type = ModuleFieldType::Func; field->func = new Func(); @@ -404,7 +404,7 @@ Result BinaryReaderIR::OnTableCount(Index count) { Result BinaryReaderIR::OnTable(Index index, Type elem_type, const Limits* elem_limits) { - ModuleField* field = append_module_field(module); + ModuleField* field = module->AppendField(); field->type = ModuleFieldType::Table; field->table = new Table(); field->table->elem_limits = *elem_limits; @@ -418,7 +418,7 @@ Result BinaryReaderIR::OnMemoryCount(Index count) { } Result BinaryReaderIR::OnMemory(Index index, const Limits* page_limits) { - ModuleField* field = append_module_field(module); + ModuleField* field = module->AppendField(); field->type = ModuleFieldType::Memory; field->memory = new Memory(); field->memory->page_limits = *page_limits; @@ -432,7 +432,7 @@ Result BinaryReaderIR::OnGlobalCount(Index count) { } Result BinaryReaderIR::BeginGlobal(Index index, Type type, bool mutable_) { - ModuleField* field = append_module_field(module); + ModuleField* field = module->AppendField(); field->type = ModuleFieldType::Global; field->global = new Global(); field->global->type = type; @@ -462,7 +462,7 @@ Result BinaryReaderIR::OnExport(Index index, ExternalKind kind, Index item_index, StringSlice name) { - ModuleField* field = append_module_field(module); + ModuleField* field = module->AppendField(); field->type = ModuleFieldType::Export; field->export_ = new Export(); @@ -490,7 +490,7 @@ Result BinaryReaderIR::OnExport(Index index, } Result BinaryReaderIR::OnStartFunction(Index func_index) { - ModuleField* field = append_module_field(module); + ModuleField* field = module->AppendField(); field->type = ModuleFieldType::Start; field->start.type = VarType::Index; @@ -727,7 +727,7 @@ Result BinaryReaderIR::OnElemSegmentCount(Index count) { } Result BinaryReaderIR::BeginElemSegment(Index index, Index table_index) { - ModuleField* field = append_module_field(module); + ModuleField* field = module->AppendField(); field->type = ModuleFieldType::ElemSegment; field->elem_segment = new ElemSegment(); field->elem_segment->table_var.type = VarType::Index; @@ -773,7 +773,7 @@ Result BinaryReaderIR::OnDataSegmentCount(Index count) { } Result BinaryReaderIR::BeginDataSegment(Index index, Index memory_index) { - ModuleField* field = append_module_field(module); + ModuleField* field = module->AppendField(); field->type = ModuleFieldType::DataSegment; field->data_segment = new DataSegment(); field->data_segment->memory_var.type = VarType::Index; @@ -829,7 +829,7 @@ Result BinaryReaderIR::OnFunctionName(Index index, StringSlice name) { Result BinaryReaderIR::OnLocalNameLocalCount(Index index, Index count) { assert(index < module->funcs.size()); Func* func = module->funcs[index]; - Index num_params_and_locals = get_num_params_and_locals(func); + Index num_params_and_locals = func->GetNumParamsAndLocals(); if (count > num_params_and_locals) { PrintError("expected local name count (%" PRIindex ") <= local count (%" PRIindex ")", @@ -872,7 +872,7 @@ Result BinaryReaderIR::OnLocalName(Index func_index, return Result::Ok; Func* func = module->funcs[func_index]; - Index num_params = get_num_params(func); + Index num_params = func->GetNumParams(); BindingHash* bindings; Index index; if (local_index < num_params) { diff --git a/src/binary-writer-spec.cc b/src/binary-writer-spec.cc index da6cb56e..3289bea5 100644 --- a/src/binary-writer-spec.cc +++ b/src/binary-writer-spec.cc @@ -307,24 +307,24 @@ void BinaryWriterSpec::WriteAction(const Action* action) { void BinaryWriterSpec::WriteActionResultType(Script* script, const Action* action) { - const Module* module = get_module_by_var(script, &action->module_var); + const Module* module = script->GetModule(action->module_var); const Export* export_; json_stream_.Writef("["); switch (action->type) { case ActionType::Invoke: { - export_ = get_export_by_name(module, &action->name); + export_ = module->GetExport(action->name); assert(export_->kind == ExternalKind::Func); - Func* func = get_func_by_var(module, &export_->var); - size_t num_results = get_num_results(func); - for (size_t i = 0; i < num_results; ++i) - WriteTypeObject(get_result_type(func, i)); + const Func* func = module->GetFunc(export_->var); + Index num_results = func->GetNumResults(); + for (Index i = 0; i < num_results; ++i) + WriteTypeObject(func->GetResultType(i)); break; } case ActionType::Get: { - export_ = get_export_by_name(module, &action->name); + export_ = module->GetExport(action->name); assert(export_->kind == ExternalKind::Global); - Global* global = get_global_by_var(module, &export_->var); + const Global* global = module->GetGlobal(export_->var); WriteTypeObject(global->type); break; } @@ -396,7 +396,7 @@ void BinaryWriterSpec::WriteInvalidModule(const ScriptModule* module, break; } - WriteLocation(get_script_module_location(module)); + WriteLocation(&module->GetLocation()); WriteSeparator(); char* filename = GetModuleFilename(extension); WriteKey("filename"); diff --git a/src/binary-writer.cc b/src/binary-writer.cc index 2e907b42..788b6d24 100644 --- a/src/binary-writer.cc +++ b/src/binary-writer.cc @@ -208,6 +208,7 @@ class BinaryWriter { void BeginSubsection(const char* name, size_t leb_size_guess); void EndSubsection(); Index GetLabelVarDepth(const Var* var); + Index GetLocalIndex(const Func* func, const Var& var); void AddReloc(RelocType reloc_type, Index index); void WriteU32Leb128WithReloc(Index index, const char* desc, @@ -396,6 +397,18 @@ void BinaryWriter::WriteU32Leb128WithReloc(Index index, } } +Index BinaryWriter::GetLocalIndex(const Func* func, const Var& var) { + // func can be nullptr when using get_local/set_local/tee_local in an + // init_expr. + if (func) { + return func->GetLocalIndex(var); + } else if (var.type == VarType::Index) { + return var.index; + } else { + return kInvalidIndex; + } +} + void BinaryWriter::WriteExpr(const Module* module, const Func* func, const Expr* expr) { @@ -432,13 +445,13 @@ void BinaryWriter::WriteExpr(const Module* module, break; } case ExprType::Call: { - int index = get_func_index_by_var(module, &expr->call.var); + Index index = module->GetFuncIndex(expr->call.var); write_opcode(&stream_, Opcode::Call); WriteU32Leb128WithReloc(index, "function index", RelocType::FuncIndexLEB); break; } case ExprType::CallIndirect: { - int index = get_func_type_index_by_var(module, &expr->call_indirect.var); + Index index = module->GetFuncTypeIndex(expr->call_indirect.var); write_opcode(&stream_, Opcode::CallIndirect); WriteU32Leb128WithReloc(index, "signature index", RelocType::TypeIndexLEB); write_u32_leb128(&stream_, 0, "call_indirect reserved"); @@ -489,13 +502,13 @@ void BinaryWriter::WriteExpr(const Module* module, write_opcode(&stream_, Opcode::Drop); break; case ExprType::GetGlobal: { - int index = get_global_index_by_var(module, &expr->get_global.var); + Index index = module->GetGlobalIndex(expr->get_global.var); write_opcode(&stream_, Opcode::GetGlobal); WriteU32Leb128WithReloc(index, "global index", RelocType::GlobalIndexLEB); break; } case ExprType::GetLocal: { - int index = get_local_index_by_var(func, &expr->get_local.var); + Index index = GetLocalIndex(func, expr->get_local.var); write_opcode(&stream_, Opcode::GetLocal); write_u32_leb128(&stream_, index, "local index"); break; @@ -541,13 +554,13 @@ void BinaryWriter::WriteExpr(const Module* module, write_opcode(&stream_, Opcode::Select); break; case ExprType::SetGlobal: { - int index = get_global_index_by_var(module, &expr->get_global.var); + Index index = module->GetGlobalIndex(expr->get_global.var); write_opcode(&stream_, Opcode::SetGlobal); WriteU32Leb128WithReloc(index, "global index", RelocType::GlobalIndexLEB); break; } case ExprType::SetLocal: { - int index = get_local_index_by_var(func, &expr->get_local.var); + Index index = GetLocalIndex(func, expr->get_local.var); write_opcode(&stream_, Opcode::SetLocal); write_u32_leb128(&stream_, index, "local index"); break; @@ -561,7 +574,7 @@ void BinaryWriter::WriteExpr(const Module* module, break; } case ExprType::TeeLocal: { - int index = get_local_index_by_var(func, &expr->get_local.var); + Index index = GetLocalIndex(func, expr->get_local.var); write_opcode(&stream_, Opcode::TeeLocal); write_u32_leb128(&stream_, index, "local index"); break; @@ -604,7 +617,7 @@ void BinaryWriter::WriteFuncLocals(const Module* module, return; } - Index num_params = get_num_params(func); + Index num_params = func->GetNumParams(); #define FIRST_LOCAL_INDEX (num_params) #define LAST_LOCAL_INDEX (num_params + local_types.size()) @@ -727,10 +740,9 @@ Result BinaryWriter::WriteModule(const Module* module) { stream_.WriteU8Enum(import->kind, "import kind"); switch (import->kind) { case ExternalKind::Func: - write_u32_leb128( - &stream_, - get_func_type_index_by_decl(module, &import->func->decl), - "import signature index"); + write_u32_leb128(&stream_, + module->GetFuncTypeIndex(import->func->decl), + "import signature index"); break; case ExternalKind::Table: WriteTable(import->table); @@ -757,8 +769,7 @@ Result BinaryWriter::WriteModule(const Module* module) { char desc[100]; wabt_snprintf(desc, sizeof(desc), "function %" PRIzd " signature index", i); - write_u32_leb128(&stream_, - get_func_type_index_by_decl(module, &func->decl), desc); + write_u32_leb128(&stream_, module->GetFuncTypeIndex(func->decl), desc); } EndSection(); } @@ -813,22 +824,22 @@ Result BinaryWriter::WriteModule(const Module* module) { stream_.WriteU8Enum(export_->kind, "export kind"); switch (export_->kind) { case ExternalKind::Func: { - int index = get_func_index_by_var(module, &export_->var); + Index index = module->GetFuncIndex(export_->var); write_u32_leb128(&stream_, index, "export func index"); break; } case ExternalKind::Table: { - int index = get_table_index_by_var(module, &export_->var); + Index index = module->GetTableIndex(export_->var); write_u32_leb128(&stream_, index, "export table index"); break; } case ExternalKind::Memory: { - int index = get_memory_index_by_var(module, &export_->var); + Index index = module->GetMemoryIndex(export_->var); write_u32_leb128(&stream_, index, "export memory index"); break; } case ExternalKind::Global: { - int index = get_global_index_by_var(module, &export_->var); + Index index = module->GetGlobalIndex(export_->var); write_u32_leb128(&stream_, index, "export global index"); break; } @@ -838,8 +849,8 @@ Result BinaryWriter::WriteModule(const Module* module) { } if (module->start) { - int start_func_index = get_func_index_by_var(module, module->start); - if (start_func_index != -1) { + Index start_func_index = module->GetFuncIndex(*module->start); + if (start_func_index != kInvalidIndex) { BeginKnownSection(BinarySection::Start, LEB_SECTION_SIZE_GUESS); write_u32_leb128(&stream_, start_func_index, "start func index"); EndSection(); @@ -852,13 +863,13 @@ Result BinaryWriter::WriteModule(const Module* module) { "num elem segments"); for (size_t i = 0; i < module->elem_segments.size(); ++i) { ElemSegment* segment = module->elem_segments[i]; - int table_index = get_table_index_by_var(module, &segment->table_var); + Index table_index = module->GetTableIndex(segment->table_var); WriteHeader("elem segment header", i); write_u32_leb128(&stream_, table_index, "table index"); WriteInitExpr(module, segment->offset); write_u32_leb128(&stream_, segment->vars.size(), "num function indices"); for (const Var& var : segment->vars) { - int index = get_func_index_by_var(module, &var); + Index index = module->GetFuncIndex(var); WriteU32Leb128WithReloc(index, "function index", RelocType::FuncIndexLEB); } @@ -892,7 +903,7 @@ Result BinaryWriter::WriteModule(const Module* module) { for (size_t i = 0; i < module->data_segments.size(); ++i) { const DataSegment* segment = module->data_segments[i]; WriteHeader("data segment header", i); - int memory_index = get_memory_index_by_var(module, &segment->memory_var); + Index memory_index = module->GetMemoryIndex(segment->memory_var); write_u32_leb128(&stream_, memory_index, "memory index"); WriteInitExpr(module, segment->offset); write_u32_leb128(&stream_, segment->size, "data segment size"); @@ -936,15 +947,15 @@ Result BinaryWriter::WriteModule(const Module* module) { write_u32_leb128(&stream_, module->funcs.size(), "num functions"); for (size_t i = 0; i < module->funcs.size(); ++i) { const Func* func = module->funcs[i]; - Index num_params = get_num_params(func); + Index num_params = func->GetNumParams(); Index num_locals = func->local_types.size(); - Index num_params_and_locals = get_num_params_and_locals(func); + Index num_params_and_locals = func->GetNumParamsAndLocals(); write_u32_leb128(&stream_, i, "function index"); write_u32_leb128(&stream_, num_params_and_locals, "num locals"); - make_type_binding_reverse_mapping(func->decl.sig.param_types, - func->param_bindings, &index_to_name); + MakeTypeBindingReverseMapping(func->decl.sig.param_types, + func->param_bindings, &index_to_name); for (size_t j = 0; j < num_params; ++j) { const std::string& name = index_to_name[j]; wabt_snprintf(desc, sizeof(desc), "local name %" PRIzd, j); @@ -952,8 +963,8 @@ Result BinaryWriter::WriteModule(const Module* module) { write_debug_name(&stream_, string_to_string_slice(name), desc); } - make_type_binding_reverse_mapping(func->local_types, func->local_bindings, - &index_to_name); + MakeTypeBindingReverseMapping(func->local_types, func->local_bindings, + &index_to_name); for (size_t j = 0; j < num_locals; ++j) { const std::string& name = index_to_name[j]; wabt_snprintf(desc, sizeof(desc), "local name %" PRIzd, num_params + j); diff --git a/src/binding-hash.cc b/src/binding-hash.cc index ec180603..d1297d92 100644 --- a/src/binding-hash.cc +++ b/src/binding-hash.cc @@ -19,6 +19,8 @@ #include <algorithm> #include <vector> +#include "ir.h" + namespace wabt { void BindingHash::FindDuplicates(DuplicateCallback callback) const { @@ -30,6 +32,12 @@ void BindingHash::FindDuplicates(DuplicateCallback callback) const { } } +Index BindingHash::FindIndex(const Var& var) const { + if (var.type == VarType::Name) + return FindIndex(var.name); + return var.index; +} + void BindingHash::CreateDuplicatesVector( ValueTypeVector* out_duplicates) const { // This relies on the fact that in an unordered_multimap, all values with the diff --git a/src/binding-hash.h b/src/binding-hash.h index 6222a254..3b4cd7eb 100644 --- a/src/binding-hash.h +++ b/src/binding-hash.h @@ -26,14 +26,16 @@ namespace wabt { +struct Var; + struct Binding { - explicit Binding(int index) : index(index) { + explicit Binding(Index index) : index(index) { WABT_ZERO_MEMORY(loc); } - Binding(const Location& loc, int index) : loc(loc), index(index) {} + Binding(const Location& loc, Index index) : loc(loc), index(index) {} Location loc; - int index; + Index index; }; // This class derives from a C++ container, which is usually not advisable @@ -46,11 +48,13 @@ class BindingHash : public std::unordered_multimap<std::string, Binding> { void FindDuplicates(DuplicateCallback callback) const; - int FindIndex(const StringSlice& name) const { + Index FindIndex(const Var&) const; + + Index FindIndex(const StringSlice& name) const { auto iter = find(string_slice_to_string(name)); if (iter != end()) return iter->second.index; - return -1; + return kInvalidIndex; } private: diff --git a/src/generate-names.cc b/src/generate-names.cc index a2b286d2..258d9b05 100644 --- a/src/generate-names.cc +++ b/src/generate-names.cc @@ -153,12 +153,12 @@ Result NameGenerator::VisitFunc(Index func_index, Func* func) { MaybeGenerateAndBindName(&module_->func_bindings, "$f", func_index, &func->name); - make_type_binding_reverse_mapping(func->decl.sig.param_types, - func->param_bindings, &index_to_name_); + MakeTypeBindingReverseMapping(func->decl.sig.param_types, + func->param_bindings, &index_to_name_); GenerateAndBindLocalNames(&func->param_bindings, "$p"); - make_type_binding_reverse_mapping(func->local_types, func->local_bindings, - &index_to_name_); + MakeTypeBindingReverseMapping(func->local_types, func->local_bindings, + &index_to_name_); GenerateAndBindLocalNames(&func->local_bindings, "$l"); label_count_ = 0; diff --git a/src/interpreter.cc b/src/interpreter.cc index 6b689627..bffec0ae 100644 --- a/src/interpreter.cc +++ b/src/interpreter.cc @@ -202,7 +202,7 @@ void Environment::ResetToMarkPoint(const MarkPoint& mark) { // so we have to iterate through the entire table to find entries to remove. auto iter = registered_module_bindings_.begin(); while (iter != registered_module_bindings_.end()) { - if (iter->second.index >= static_cast<int>(mark.modules_size)) + if (iter->second.index >= mark.modules_size) iter = registered_module_bindings_.erase(iter); else ++iter; @@ -21,129 +21,138 @@ namespace wabt { -Index get_index_from_var(const BindingHash* hash, const Var* var) { - if (var->type == VarType::Name) - return hash->FindIndex(var->name); - return var->index; +bool FuncSignature::operator==(const FuncSignature& rhs) const { + return param_types == rhs.param_types && result_types == rhs.result_types; } -Export* get_export_by_name(const Module* module, const StringSlice* name) { - Index index = module->export_bindings.FindIndex(*name); - if (index >= module->exports.size()) +const Export* Module::GetExport(const StringSlice& name) const { + Index index = export_bindings.FindIndex(name); + if (index >= exports.size()) return nullptr; - return module->exports[index]; + return exports[index]; } -Index get_func_index_by_var(const Module* module, const Var* var) { - return get_index_from_var(&module->func_bindings, var); +Index Module::GetFuncIndex(const Var& var) const { + return func_bindings.FindIndex(var); } -Index get_global_index_by_var(const Module* module, const Var* var) { - return get_index_from_var(&module->global_bindings, var); +Index Module::GetGlobalIndex(const Var& var) const { + return global_bindings.FindIndex(var); } -Index get_table_index_by_var(const Module* module, const Var* var) { - return get_index_from_var(&module->table_bindings, var); +Index Module::GetTableIndex(const Var& var) const { + return table_bindings.FindIndex(var); } -Index get_memory_index_by_var(const Module* module, const Var* var) { - return get_index_from_var(&module->memory_bindings, var); +Index Module::GetMemoryIndex(const Var& var) const { + return memory_bindings.FindIndex(var); } -Index get_func_type_index_by_var(const Module* module, const Var* var) { - return get_index_from_var(&module->func_type_bindings, var); +Index Module::GetFuncTypeIndex(const Var& var) const { + return func_type_bindings.FindIndex(var); } -Index get_local_index_by_var(const Func* func, const Var* var) { - if (var->type == VarType::Index) - return var->index; +Index Func::GetLocalIndex(const Var& var) const { + if (var.type == VarType::Index) + return var.index; - Index result = func->param_bindings.FindIndex(var->name); + Index result = param_bindings.FindIndex(var.name); if (result != kInvalidIndex) return result; - result = func->local_bindings.FindIndex(var->name); + result = local_bindings.FindIndex(var.name); if (result == kInvalidIndex) return result; - /* the locals start after all the params */ - return func->decl.sig.param_types.size() + result; + // The locals start after all the params. + return decl.GetNumParams() + result; } -Index get_module_index_by_var(const Script* script, const Var* var) { - return get_index_from_var(&script->module_bindings, var); +const Func* Module::GetFunc(const Var& var) const { + return const_cast<Module*>(this)->GetFunc(var); } -Func* get_func_by_var(const Module* module, const Var* var) { - Index index = get_index_from_var(&module->func_bindings, var); - if (index >= module->funcs.size()) +Func* Module::GetFunc(const Var& var) { + Index index = func_bindings.FindIndex(var); + if (index >= funcs.size()) return nullptr; - return module->funcs[index]; + return funcs[index]; } -Global* get_global_by_var(const Module* module, const Var* var) { - Index index = get_index_from_var(&module->global_bindings, var); - if (index >= module->globals.size()) +const Global* Module::GetGlobal(const Var& var) const { + return const_cast<Module*>(this)->GetGlobal(var); +} + +Global* Module::GetGlobal(const Var& var) { + Index index = global_bindings.FindIndex(var); + if (index >= globals.size()) return nullptr; - return module->globals[index]; + return globals[index]; } -Table* get_table_by_var(const Module* module, const Var* var) { - Index index = get_index_from_var(&module->table_bindings, var); - if (index >= module->tables.size()) +Table* Module::GetTable(const Var& var) { + Index index = table_bindings.FindIndex(var); + if (index >= tables.size()) return nullptr; - return module->tables[index]; + return tables[index]; } -Memory* get_memory_by_var(const Module* module, const Var* var) { - Index index = get_index_from_var(&module->memory_bindings, var); - if (index >= module->memories.size()) +Memory* Module::GetMemory(const Var& var) { + Index index = memory_bindings.FindIndex(var); + if (index >= memories.size()) return nullptr; - return module->memories[index]; + return memories[index]; +} + +const FuncType* Module::GetFuncType(const Var& var) const { + return const_cast<Module*>(this)->GetFuncType(var); } -FuncType* get_func_type_by_var(const Module* module, const Var* var) { - Index index = get_index_from_var(&module->func_type_bindings, var); - if (index >= module->func_types.size()) +FuncType* Module::GetFuncType(const Var& var) { + Index index = func_type_bindings.FindIndex(var); + if (index >= func_types.size()) return nullptr; - return module->func_types[index]; + return func_types[index]; } -Index get_func_type_index_by_sig(const Module* module, - const FuncSignature* sig) { - for (size_t i = 0; i < module->func_types.size(); ++i) - if (signatures_are_equal(&module->func_types[i]->sig, sig)) + +Index Module::GetFuncTypeIndex(const FuncSignature& sig) const { + for (size_t i = 0; i < func_types.size(); ++i) + if (func_types[i]->sig == sig) return i; return kInvalidIndex; } -Index get_func_type_index_by_decl(const Module* module, - const FuncDeclaration* decl) { - if (decl_has_func_type(decl)) { - return get_func_type_index_by_var(module, &decl->type_var); +Index Module::GetFuncTypeIndex(const FuncDeclaration& decl) const { + if (decl.has_func_type) { + return GetFuncTypeIndex(decl.type_var); } else { - return get_func_type_index_by_sig(module, &decl->sig); + return GetFuncTypeIndex(decl.sig); } } -Module* get_first_module(const Script* script) { - for (const std::unique_ptr<Command>& command : script->commands) { +const Module* Script::GetFirstModule() const { + return const_cast<Script*>(this)->GetFirstModule(); +} + +Module* Script::GetFirstModule() { + for (const std::unique_ptr<Command>& command : commands) { if (command->type == CommandType::Module) return command->module; } return nullptr; } -Module* get_module_by_var(const Script* script, const Var* var) { - Index index = get_index_from_var(&script->module_bindings, var); - if (index >= script->commands.size()) +const Module* Script::GetModule(const Var& var) const { + Index index = module_bindings.FindIndex(var); + if (index >= commands.size()) return nullptr; - const Command& command = *script->commands[index].get(); + const Command& command = *commands[index].get(); assert(command.type == CommandType::Module); return command.module; } -void make_type_binding_reverse_mapping( +void MakeTypeBindingReverseMapping( const TypeVector& types, const BindingHash& bindings, std::vector<std::string>* out_reverse_mapping) { @@ -156,35 +165,29 @@ void make_type_binding_reverse_mapping( } } -ModuleField* append_module_field(Module* module) { +ModuleField* Module::AppendField() { ModuleField* result = new ModuleField(); - if (!module->first_field) - module->first_field = result; - else if (module->last_field) - module->last_field->next = result; - module->last_field = result; + if (!first_field) + first_field = result; + else if (last_field) + last_field->next = result; + last_field = result; return result; } -FuncType* append_implicit_func_type(Location* loc, - Module* module, - FuncSignature* sig) { - ModuleField* field = append_module_field(module); - field->loc = *loc; +FuncType* Module::AppendImplicitFuncType(const Location& loc, + const FuncSignature& sig) { + ModuleField* field = AppendField(); + field->loc = loc; field->type = ModuleFieldType::FuncType; field->func_type = new FuncType(); - field->func_type->sig = *sig; + field->func_type->sig = sig; - module->func_types.push_back(field->func_type); + func_types.push_back(field->func_type); return field->func_type; } -void destroy_var(Var* var) { - if (var->type == VarType::Name) - destroy_string_slice(&var->name); -} - -void destroy_expr_list(Expr* first) { +void DestroyExprList(Expr* first) { Expr* expr = first; while (expr) { Expr* next = expr->next; @@ -193,7 +196,7 @@ void destroy_expr_list(Expr* first) { } } -Var::Var(int64_t index) : type(VarType::Index), index(index) { +Var::Var(Index index) : type(VarType::Index), index(index) { WABT_ZERO_MEMORY(loc); } @@ -201,6 +204,51 @@ Var::Var(const StringSlice& name) : type(VarType::Name), name(name) { WABT_ZERO_MEMORY(loc); } +Var::Var(Var&& rhs) : loc(rhs.loc), type(rhs.type) { + if (rhs.type == VarType::Index) { + index = rhs.index; + } else { + name = rhs.name; + rhs = Var(kInvalidIndex); + } +} + +Var::Var(const Var& rhs) : loc(rhs.loc), type(rhs.type) { + if (rhs.type == VarType::Index) { + index = rhs.index; + } else { + name = dup_string_slice(rhs.name); + } +} + +Var& Var::operator =(Var&& rhs) { + loc = rhs.loc; + type = rhs.type; + if (rhs.type == VarType::Index) { + index = rhs.index; + } else { + name = rhs.name; + rhs = Var(kInvalidIndex); + } + return *this; +} + +Var& Var::operator =(const Var& rhs) { + loc = rhs.loc; + type = rhs.type; + if (rhs.type == VarType::Index) { + index = rhs.index; + } else { + name = dup_string_slice(rhs.name); + } + return *this; +} + +Var::~Var() { + if (type == VarType::Name) + destroy_string_slice(&name); +} + Const::Const(I32, uint32_t value) : type(Type::I32), u32(value) { WABT_ZERO_MEMORY(loc); } @@ -227,7 +275,7 @@ Block::Block(Expr* first) : first(first) { Block::~Block() { destroy_string_slice(&label); - destroy_expr_list(first); + DestroyExprList(first); } Expr::Expr() : type(ExprType::Binary), next(nullptr) { @@ -245,59 +293,57 @@ Expr::~Expr() { delete block; break; case ExprType::Br: - destroy_var(&br.var); + br.var.~Var(); break; case ExprType::BrIf: - destroy_var(&br_if.var); + br_if.var.~Var(); break; case ExprType::BrTable: - for (Var& var : *br_table.targets) - destroy_var(&var); delete br_table.targets; - destroy_var(&br_table.default_target); + br_table.default_target.~Var(); break; case ExprType::Call: - destroy_var(&call.var); + call.var.~Var(); break; case ExprType::CallIndirect: - destroy_var(&call_indirect.var); + call_indirect.var.~Var(); break; case ExprType::Catch: case ExprType::CatchAll: - destroy_var(&catch_.var); - destroy_expr_list(catch_.first); + catch_.var.~Var(); + DestroyExprList(catch_.first); break; case ExprType::GetGlobal: - destroy_var(&get_global.var); + get_global.var.~Var(); break; case ExprType::GetLocal: - destroy_var(&get_local.var); + get_local.var.~Var(); break; case ExprType::If: delete if_.true_; - destroy_expr_list(if_.false_); + DestroyExprList(if_.false_); break; case ExprType::Loop: delete loop; break; case ExprType::Rethrow: - destroy_var(&rethrow_.var); + rethrow_.var.~Var(); break; case ExprType::SetGlobal: - destroy_var(&set_global.var); + set_global.var.~Var(); break; case ExprType::SetLocal: - destroy_var(&set_local.var); + set_local.var.~Var(); break; case ExprType::TeeLocal: - destroy_var(&tee_local.var); + tee_local.var.~Var(); break; case ExprType::Throw: - destroy_var(&throw_.var); + throw_.var.~Var(); break; case ExprType::TryBlock: delete try_block.block; - destroy_expr_list(try_block.first_catch); + DestroyExprList(try_block.first_catch); break; case ExprType::Binary: case ExprType::Compare: @@ -544,13 +590,10 @@ FuncType::~FuncType() { destroy_string_slice(&name); } -FuncDeclaration::FuncDeclaration() : has_func_type(false) { - WABT_ZERO_MEMORY(type_var); -} +FuncDeclaration::FuncDeclaration() + : has_func_type(false), type_var(kInvalidIndex) {} -FuncDeclaration::~FuncDeclaration() { - destroy_var(&type_var); -} +FuncDeclaration::~FuncDeclaration() {} Func::Func() : first_expr(nullptr) { WABT_ZERO_MEMORY(name); @@ -558,7 +601,7 @@ Func::Func() : first_expr(nullptr) { Func::~Func() { destroy_string_slice(&name); - destroy_expr_list(first_expr); + DestroyExprList(first_expr); } Global::Global() : type(Type::Void), mutable_(false), init_expr(nullptr) { @@ -567,7 +610,7 @@ Global::Global() : type(Type::Void), mutable_(false), init_expr(nullptr) { Global::~Global() { destroy_string_slice(&name); - destroy_expr_list(init_expr); + DestroyExprList(init_expr); } Table::Table() { @@ -579,25 +622,17 @@ Table::~Table() { destroy_string_slice(&name); } -ElemSegment::ElemSegment() : offset(nullptr) { - WABT_ZERO_MEMORY(table_var); -} +ElemSegment::ElemSegment() : table_var(kInvalidIndex), offset(nullptr) {} ElemSegment::~ElemSegment() { - destroy_var(&table_var); - destroy_expr_list(offset); - for (Var& var : vars) - destroy_var(&var); + DestroyExprList(offset); } -DataSegment::DataSegment() : offset(nullptr), data(nullptr), size(0) { - WABT_ZERO_MEMORY(memory_var); -} +DataSegment::DataSegment() : offset(nullptr), data(nullptr), size(0) {} DataSegment::~DataSegment() { - destroy_var(&memory_var); - destroy_expr_list(offset); - delete [] data; + DestroyExprList(offset); + delete[] data; } Memory::Memory() { @@ -635,12 +670,10 @@ Import::~Import() { Export::Export() { WABT_ZERO_MEMORY(name); - WABT_ZERO_MEMORY(var); } Export::~Export() { destroy_string_slice(&name); - destroy_var(&var); } void destroy_memory(Memory* memory) { @@ -653,9 +686,9 @@ void destroy_table(Table* table) { ModuleField::ModuleField() : ModuleField(ModuleFieldType::Start) {} -ModuleField::ModuleField(ModuleFieldType type) : type(type), next(nullptr) { +ModuleField::ModuleField(ModuleFieldType type) + : type(type), next(nullptr), start(kInvalidIndex) { WABT_ZERO_MEMORY(loc); - WABT_ZERO_MEMORY(start); } ModuleField::~ModuleField() { @@ -688,7 +721,7 @@ ModuleField::~ModuleField() { delete data_segment; break; case ModuleFieldType::Start: - destroy_var(&start); + start.~Var(); break; } } @@ -736,14 +769,12 @@ ScriptModule::~ScriptModule() { ActionInvoke::ActionInvoke() {} -Action::Action() : type(ActionType::Get) { +Action::Action() : type(ActionType::Get), module_var(kInvalidIndex) { WABT_ZERO_MEMORY(loc); - WABT_ZERO_MEMORY(module_var); WABT_ZERO_MEMORY(name); } Action::~Action() { - destroy_var(&module_var); destroy_string_slice(&name); switch (type) { case ActionType::Invoke: @@ -766,7 +797,7 @@ Command::~Command() { break; case CommandType::Register: destroy_string_slice(®ister_.module_name); - destroy_var(®ister_.var); + register_.var.~Var(); break; case CommandType::AssertMalformed: delete assert_malformed.module; @@ -36,10 +36,13 @@ enum class VarType { }; struct Var { - // Keep the default constructor trivial so it can be used as a union member. - Var() = default; - explicit Var(int64_t index); + explicit Var(Index index = kInvalidIndex); explicit Var(const StringSlice& name); + Var(Var&&); + Var(const Var&); + Var& operator =(const Var&); + Var& operator =(Var&&); + ~Var(); Location loc; VarType type; @@ -189,6 +192,13 @@ struct Expr { struct FuncSignature { TypeVector param_types; TypeVector result_types; + + Index GetNumParams() const { return param_types.size(); } + Index GetNumResults() const { return result_types.size(); } + Type GetParamType(Index index) const { return param_types[index]; } + Type GetResultType(Index index) const { return result_types[index]; } + + bool operator==(const FuncSignature&) const; }; struct FuncType { @@ -196,6 +206,11 @@ struct FuncType { FuncType(); ~FuncType(); + Index GetNumParams() const { return sig.GetNumParams(); } + Index GetNumResults() const { return sig.GetNumResults(); } + Type GetParamType(Index index) const { return sig.GetParamType(index); } + Type GetResultType(Index index) const { return sig.GetResultType(index); } + StringSlice name; FuncSignature sig; }; @@ -205,6 +220,11 @@ struct FuncDeclaration { FuncDeclaration(); ~FuncDeclaration(); + Index GetNumParams() const { return sig.GetNumParams(); } + Index GetNumResults() const { return sig.GetNumResults(); } + Type GetParamType(Index index) const { return sig.GetParamType(index); } + Type GetResultType(Index index) const { return sig.GetResultType(index); } + bool has_func_type; Var type_var; FuncSignature sig; @@ -215,6 +235,16 @@ struct Func { Func(); ~Func(); + Type GetParamType(Index index) const { return decl.GetParamType(index); } + Type GetResultType(Index index) const { return decl.GetResultType(index); } + Index GetNumParams() const { return decl.GetNumParams(); } + Index GetNumLocals() const { return local_types.size(); } + Index GetNumParamsAndLocals() const { + return GetNumParams() + GetNumLocals(); + } + Index GetNumResults() const { return decl.GetNumResults(); } + Index GetLocalIndex(const Var&) const; + StringSlice name; FuncDeclaration decl; TypeVector local_types; @@ -343,6 +373,26 @@ struct Module { Module(); ~Module(); + ModuleField* AppendField(); + FuncType* AppendImplicitFuncType(const Location&, const FuncSignature&); + + Index GetFuncTypeIndex(const Var&) const; + Index GetFuncTypeIndex(const FuncDeclaration&) const; + Index GetFuncTypeIndex(const FuncSignature&) const; + const FuncType* GetFuncType(const Var&) const; + FuncType* GetFuncType(const Var&); + Index GetFuncIndex(const Var&) const; + const Func* GetFunc(const Var&) const; + Func* GetFunc(const Var&); + Index GetTableIndex(const Var&) const; + Table* GetTable(const Var&); + Index GetMemoryIndex(const Var&) const; + Memory* GetMemory(const Var&); + Index GetGlobalIndex(const Var&) const; + const Global* GetGlobal(const Var&) const; + Global* GetGlobal(const Var&); + const Export* GetExport(const StringSlice&) const; + Location loc; StringSlice name; ModuleField* first_field; @@ -353,8 +403,8 @@ struct Module { Index num_memory_imports; Index num_global_imports; - /* cached for convenience; the pointers are shared with values that are - * stored in either ModuleField or Import. */ + // Cached for convenience; the pointers are shared with values that are + // stored in either ModuleField or Import. std::vector<Func*> funcs; std::vector<Global*> globals; std::vector<Import*> imports; @@ -387,7 +437,17 @@ struct ScriptModule { ScriptModule(); ~ScriptModule(); + const Location& GetLocation() const { + switch (type) { + case Type::Binary: return binary.loc; + case Type::Quoted: return quoted.loc; + default: assert(0); // Fallthrough. + case Type::Text: return text->loc; + } + } + Type type; + union { Module* text; struct { @@ -476,123 +536,21 @@ struct Script { WABT_DISALLOW_COPY_AND_ASSIGN(Script); Script(); + const Module* GetFirstModule() const; + Module* GetFirstModule(); + const Module* GetModule(const Var&) const; + CommandPtrVector commands; BindingHash module_bindings; }; -ModuleField* append_module_field(Module*); -/* ownership of the function signature is passed to the module */ -FuncType* append_implicit_func_type(Location*, Module*, FuncSignature*); - -/* destruction functions. not needed unless you're creating your own IR - elements */ -void destroy_expr_list(Expr*); -void destroy_var(Var*); - -/* convenience functions for looking through the IR */ -Index get_index_from_var(const BindingHash* bindings, const Var* var); -Index get_func_index_by_var(const Module* module, const Var* var); -Index get_global_index_by_var(const Module* func, const Var* var); -Index get_func_type_index_by_var(const Module* module, const Var* var); -Index get_func_type_index_by_sig(const Module* module, - const FuncSignature* sig); -Index get_func_type_index_by_decl(const Module* module, - const FuncDeclaration* decl); -Index get_table_index_by_var(const Module* module, const Var* var); -Index get_memory_index_by_var(const Module* module, const Var* var); -Index get_import_index_by_var(const Module* module, const Var* var); -Index get_local_index_by_var(const Func* func, const Var* var); -Index get_module_index_by_var(const Script* script, const Var* var); - -Func* get_func_by_var(const Module* module, const Var* var); -Global* get_global_by_var(const Module* func, const Var* var); -FuncType* get_func_type_by_var(const Module* module, const Var* var); -Table* get_table_by_var(const Module* module, const Var* var); -Memory* get_memory_by_var(const Module* module, const Var* var); -Import* get_import_by_var(const Module* module, const Var* var); -Export* get_export_by_name(const Module* module, const StringSlice* name); -Module* get_first_module(const Script* script); -Module* get_module_by_var(const Script* script, const Var* var); - -void make_type_binding_reverse_mapping( +void DestroyExprList(Expr*); + +void MakeTypeBindingReverseMapping( const TypeVector&, const BindingHash&, std::vector<std::string>* out_reverse_mapping); -static WABT_INLINE bool decl_has_func_type(const FuncDeclaration* decl) { - return decl->has_func_type; -} - -static WABT_INLINE bool signatures_are_equal(const FuncSignature* sig1, - const FuncSignature* sig2) { - return sig1->param_types == sig2->param_types && - sig1->result_types == sig2->result_types; -} - -static WABT_INLINE size_t get_num_params(const Func* func) { - return func->decl.sig.param_types.size(); -} - -static WABT_INLINE size_t get_num_results(const Func* func) { - return func->decl.sig.result_types.size(); -} - -static WABT_INLINE size_t get_num_locals(const Func* func) { - return func->local_types.size(); -} - -static WABT_INLINE size_t get_num_params_and_locals(const Func* func) { - return get_num_params(func) + get_num_locals(func); -} - -static WABT_INLINE Type get_param_type(const Func* func, Index index) { - assert(static_cast<size_t>(index) < func->decl.sig.param_types.size()); - return func->decl.sig.param_types[index]; -} - -static WABT_INLINE Type get_local_type(const Func* func, Index index) { - assert(static_cast<size_t>(index) < get_num_locals(func)); - return func->local_types[index]; -} - -static WABT_INLINE Type get_result_type(const Func* func, Index index) { - assert(static_cast<size_t>(index) < func->decl.sig.result_types.size()); - return func->decl.sig.result_types[index]; -} - -static WABT_INLINE Type get_func_type_param_type(const FuncType* func_type, - Index index) { - return func_type->sig.param_types[index]; -} - -static WABT_INLINE size_t get_func_type_num_params(const FuncType* func_type) { - return func_type->sig.param_types.size(); -} - -static WABT_INLINE Type get_func_type_result_type(const FuncType* func_type, - Index index) { - return func_type->sig.result_types[index]; -} - -static WABT_INLINE size_t get_func_type_num_results(const FuncType* func_type) { - return func_type->sig.result_types.size(); -} - -static WABT_INLINE const Location* get_script_module_location( - const ScriptModule* script) { - switch (script->type) { - case ScriptModule::Type::Text: - return &script->text->loc; - case ScriptModule::Type::Binary: - return &script->binary.loc; - case ScriptModule::Type::Quoted: - return &script->quoted.loc; - default: - assert(0); - return nullptr; - } -} - } // namespace wabt #endif /* WABT_IR_H_ */ diff --git a/src/prebuilt/wast-parser-gen.cc b/src/prebuilt/wast-parser-gen.cc index e866bbc3..d945322e 100644 --- a/src/prebuilt/wast-parser-gen.cc +++ b/src/prebuilt/wast-parser-gen.cc @@ -671,25 +671,25 @@ static const yytype_uint16 yyrline[] = { 0, 260, 260, 266, 276, 277, 281, 299, 300, 306, 309, 314, 322, 326, 327, 332, 341, 342, 350, 356, - 362, 367, 374, 380, 391, 395, 399, 406, 411, 418, - 419, 425, 426, 429, 433, 434, 438, 439, 455, 456, - 471, 472, 473, 477, 480, 483, 486, 489, 492, 495, - 498, 501, 504, 507, 510, 513, 516, 519, 522, 525, - 528, 541, 544, 547, 550, 553, 556, 559, 562, 568, - 573, 578, 583, 589, 597, 600, 605, 612, 616, 623, - 624, 630, 634, 637, 642, 647, 653, 661, 664, 670, - 678, 681, 685, 689, 693, 697, 701, 708, 713, 719, - 725, 726, 734, 735, 743, 748, 762, 769, 774, 784, - 792, 803, 810, 811, 817, 827, 828, 837, 844, 845, - 851, 861, 862, 871, 878, 882, 887, 899, 902, 906, - 915, 929, 943, 949, 957, 965, 984, 993, 1007, 1021, - 1026, 1034, 1042, 1065, 1079, 1085, 1093, 1106, 1114, 1122, - 1128, 1134, 1143, 1153, 1161, 1166, 1171, 1176, 1183, 1192, - 1202, 1209, 1220, 1228, 1229, 1230, 1231, 1232, 1233, 1234, - 1235, 1236, 1237, 1241, 1242, 1246, 1251, 1259, 1279, 1286, - 1291, 1299, 1319, 1327, 1338, 1348, 1358, 1364, 1370, 1376, - 1382, 1388, 1393, 1398, 1404, 1413, 1418, 1419, 1424, 1433, - 1437, 1444, 1456, 1457, 1464, 1467, 1527, 1539 + 362, 367, 374, 380, 391, 395, 399, 406, 410, 418, + 419, 426, 427, 430, 434, 435, 439, 440, 456, 457, + 472, 473, 474, 478, 481, 484, 487, 490, 494, 498, + 502, 505, 509, 513, 517, 521, 525, 529, 533, 536, + 539, 552, 555, 558, 561, 564, 567, 570, 574, 581, + 586, 591, 596, 602, 610, 613, 618, 625, 630, 638, + 639, 645, 649, 652, 657, 662, 668, 676, 679, 685, + 693, 696, 700, 704, 708, 712, 716, 723, 728, 734, + 740, 741, 749, 750, 758, 763, 777, 785, 790, 801, + 809, 820, 827, 828, 834, 844, 845, 854, 861, 862, + 868, 878, 879, 888, 895, 899, 904, 916, 919, 923, + 933, 947, 961, 967, 975, 983, 1003, 1013, 1027, 1041, + 1046, 1054, 1062, 1086, 1100, 1106, 1114, 1127, 1136, 1144, + 1150, 1156, 1165, 1175, 1183, 1189, 1195, 1201, 1209, 1218, + 1228, 1235, 1246, 1255, 1256, 1257, 1258, 1259, 1260, 1261, + 1262, 1263, 1264, 1268, 1269, 1273, 1278, 1286, 1306, 1313, + 1316, 1324, 1342, 1350, 1361, 1372, 1383, 1389, 1395, 1401, + 1407, 1413, 1418, 1423, 1429, 1438, 1443, 1444, 1449, 1459, + 1463, 1470, 1482, 1483, 1490, 1493, 1553, 1565 }; #endif @@ -1797,7 +1797,7 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio case 92: /* type_use */ #line 246 "src/wast-parser.y" /* yacc.c:1257 */ - { destroy_var(&((*yyvaluep).var)); } + { delete ((*yyvaluep).var); } #line 1802 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; @@ -1809,7 +1809,7 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio case 95: /* var */ #line 246 "src/wast-parser.y" /* yacc.c:1257 */ - { destroy_var(&((*yyvaluep).var)); } + { delete ((*yyvaluep).var); } #line 1814 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; @@ -1839,7 +1839,7 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio case 102: /* instr */ #line 234 "src/wast-parser.y" /* yacc.c:1257 */ - { destroy_expr_list(((*yyvaluep).expr_list).first); } + { DestroyExprList(((*yyvaluep).expr_list).first); } #line 1844 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; @@ -1869,61 +1869,61 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio case 107: /* catch_instr */ #line 234 "src/wast-parser.y" /* yacc.c:1257 */ - { destroy_expr_list(((*yyvaluep).expr_list).first); } + { DestroyExprList(((*yyvaluep).expr_list).first); } #line 1874 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 108: /* catch_instr_list */ #line 234 "src/wast-parser.y" /* yacc.c:1257 */ - { destroy_expr_list(((*yyvaluep).expr_list).first); } + { DestroyExprList(((*yyvaluep).expr_list).first); } #line 1880 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 109: /* expr */ #line 234 "src/wast-parser.y" /* yacc.c:1257 */ - { destroy_expr_list(((*yyvaluep).expr_list).first); } + { DestroyExprList(((*yyvaluep).expr_list).first); } #line 1886 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 110: /* expr1 */ #line 234 "src/wast-parser.y" /* yacc.c:1257 */ - { destroy_expr_list(((*yyvaluep).expr_list).first); } + { DestroyExprList(((*yyvaluep).expr_list).first); } #line 1892 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 111: /* catch_list */ #line 234 "src/wast-parser.y" /* yacc.c:1257 */ - { destroy_expr_list(((*yyvaluep).expr_list).first); } + { DestroyExprList(((*yyvaluep).expr_list).first); } #line 1898 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 112: /* if_block */ #line 234 "src/wast-parser.y" /* yacc.c:1257 */ - { destroy_expr_list(((*yyvaluep).expr_list).first); } + { DestroyExprList(((*yyvaluep).expr_list).first); } #line 1904 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 113: /* if_ */ #line 234 "src/wast-parser.y" /* yacc.c:1257 */ - { destroy_expr_list(((*yyvaluep).expr_list).first); } + { DestroyExprList(((*yyvaluep).expr_list).first); } #line 1910 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 117: /* instr_list */ #line 234 "src/wast-parser.y" /* yacc.c:1257 */ - { destroy_expr_list(((*yyvaluep).expr_list).first); } + { DestroyExprList(((*yyvaluep).expr_list).first); } #line 1916 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 118: /* expr_list */ #line 234 "src/wast-parser.y" /* yacc.c:1257 */ - { destroy_expr_list(((*yyvaluep).expr_list).first); } + { DestroyExprList(((*yyvaluep).expr_list).first); } #line 1922 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; case 119: /* const_expr */ #line 234 "src/wast-parser.y" /* yacc.c:1257 */ - { destroy_expr_list(((*yyvaluep).expr_list).first); } + { DestroyExprList(((*yyvaluep).expr_list).first); } #line 1928 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; @@ -1989,7 +1989,7 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio case 130: /* offset */ #line 234 "src/wast-parser.y" /* yacc.c:1257 */ - { destroy_expr_list(((*yyvaluep).expr_list).first); } + { DestroyExprList(((*yyvaluep).expr_list).first); } #line 1994 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; @@ -2085,7 +2085,7 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio case 152: /* script_var_opt */ #line 246 "src/wast-parser.y" /* yacc.c:1257 */ - { destroy_var(&((*yyvaluep).var)); } + { delete ((*yyvaluep).var); } #line 2090 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1257 */ break; @@ -2638,19 +2638,19 @@ yyreduce: case 27: #line 406 "src/wast-parser.y" /* yacc.c:1646 */ { - (yyval.var).loc = (yylsp[0]); - (yyval.var).type = VarType::Index; - (yyval.var).index = (yyvsp[0].u64); + (yyval.var) = new Var((yyvsp[0].u64)); + (yyval.var)->loc = (yylsp[0]); } -#line 2646 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2645 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 28: -#line 411 "src/wast-parser.y" /* yacc.c:1646 */ +#line 410 "src/wast-parser.y" /* yacc.c:1646 */ { - (yyval.var).loc = (yylsp[0]); - (yyval.var).type = VarType::Name; - DUPTEXT((yyval.var).name, (yyvsp[0].text)); + StringSlice name; + DUPTEXT(name, (yyvsp[0].text)); + (yyval.var) = new Var(name); + (yyval.var)->loc = (yylsp[0]); } #line 2656 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; @@ -2665,37 +2665,38 @@ yyreduce: #line 419 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.vars) = (yyvsp[-1].vars); - (yyval.vars)->push_back((yyvsp[0].var)); + (yyval.vars)->emplace_back(std::move(*(yyvsp[0].var))); + delete (yyvsp[0].var); } -#line 2671 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2672 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 31: -#line 425 "src/wast-parser.y" /* yacc.c:1646 */ +#line 426 "src/wast-parser.y" /* yacc.c:1646 */ { WABT_ZERO_MEMORY((yyval.text)); } -#line 2677 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2678 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 33: -#line 429 "src/wast-parser.y" /* yacc.c:1646 */ +#line 430 "src/wast-parser.y" /* yacc.c:1646 */ { DUPTEXT((yyval.text), (yyvsp[0].text)); } -#line 2683 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2684 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 34: -#line 433 "src/wast-parser.y" /* yacc.c:1646 */ +#line 434 "src/wast-parser.y" /* yacc.c:1646 */ { WABT_ZERO_MEMORY((yyval.text)); } -#line 2689 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2690 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 36: -#line 438 "src/wast-parser.y" /* yacc.c:1646 */ +#line 439 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.u64) = 0; } -#line 2695 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2696 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 37: -#line 439 "src/wast-parser.y" /* yacc.c:1646 */ +#line 440 "src/wast-parser.y" /* yacc.c:1646 */ { uint64_t offset64; if (WABT_FAILED(parse_int64((yyvsp[0].text).start, (yyvsp[0].text).start + (yyvsp[0].text).length, &offset64, @@ -2710,17 +2711,17 @@ yyreduce: } (yyval.u64) = static_cast<uint32_t>(offset64); } -#line 2714 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2715 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 38: -#line 455 "src/wast-parser.y" /* yacc.c:1646 */ +#line 456 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.u32) = USE_NATURAL_ALIGNMENT; } -#line 2720 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2721 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 39: -#line 456 "src/wast-parser.y" /* yacc.c:1646 */ +#line 457 "src/wast-parser.y" /* yacc.c:1646 */ { if (WABT_FAILED(parse_int32((yyvsp[0].text).start, (yyvsp[0].text).start + (yyvsp[0].text).length, &(yyval.u32), ParseIntType::UnsignedOnly))) { @@ -2733,159 +2734,169 @@ yyreduce: wast_parser_error(&(yylsp[0]), lexer, parser, "alignment must be power-of-two"); } } -#line 2737 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2738 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 40: -#line 471 "src/wast-parser.y" /* yacc.c:1646 */ +#line 472 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr_list) = join_exprs1(&(yylsp[0]), (yyvsp[0].expr)); } -#line 2743 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2744 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 41: -#line 472 "src/wast-parser.y" /* yacc.c:1646 */ +#line 473 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr_list) = join_exprs1(&(yylsp[0]), (yyvsp[0].expr)); } -#line 2749 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2750 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 43: -#line 477 "src/wast-parser.y" /* yacc.c:1646 */ +#line 478 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateUnreachable(); } -#line 2757 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2758 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 44: -#line 480 "src/wast-parser.y" /* yacc.c:1646 */ +#line 481 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateNop(); } -#line 2765 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2766 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 45: -#line 483 "src/wast-parser.y" /* yacc.c:1646 */ +#line 484 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateDrop(); } -#line 2773 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2774 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 46: -#line 486 "src/wast-parser.y" /* yacc.c:1646 */ +#line 487 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateSelect(); } -#line 2781 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2782 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 47: -#line 489 "src/wast-parser.y" /* yacc.c:1646 */ +#line 490 "src/wast-parser.y" /* yacc.c:1646 */ { - (yyval.expr) = Expr::CreateBr((yyvsp[0].var)); + (yyval.expr) = Expr::CreateBr(std::move(*(yyvsp[0].var))); + delete (yyvsp[0].var); } -#line 2789 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2791 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 48: -#line 492 "src/wast-parser.y" /* yacc.c:1646 */ +#line 494 "src/wast-parser.y" /* yacc.c:1646 */ { - (yyval.expr) = Expr::CreateBrIf((yyvsp[0].var)); + (yyval.expr) = Expr::CreateBrIf(std::move(*(yyvsp[0].var))); + delete (yyvsp[0].var); } -#line 2797 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2800 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 49: -#line 495 "src/wast-parser.y" /* yacc.c:1646 */ +#line 498 "src/wast-parser.y" /* yacc.c:1646 */ { - (yyval.expr) = Expr::CreateBrTable((yyvsp[-1].vars), (yyvsp[0].var)); + (yyval.expr) = Expr::CreateBrTable((yyvsp[-1].vars), std::move(*(yyvsp[0].var))); + delete (yyvsp[0].var); } -#line 2805 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2809 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 50: -#line 498 "src/wast-parser.y" /* yacc.c:1646 */ +#line 502 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateReturn(); } -#line 2813 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2817 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 51: -#line 501 "src/wast-parser.y" /* yacc.c:1646 */ +#line 505 "src/wast-parser.y" /* yacc.c:1646 */ { - (yyval.expr) = Expr::CreateCall((yyvsp[0].var)); + (yyval.expr) = Expr::CreateCall(std::move(*(yyvsp[0].var))); + delete (yyvsp[0].var); } -#line 2821 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2826 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 52: -#line 504 "src/wast-parser.y" /* yacc.c:1646 */ +#line 509 "src/wast-parser.y" /* yacc.c:1646 */ { - (yyval.expr) = Expr::CreateCallIndirect((yyvsp[0].var)); + (yyval.expr) = Expr::CreateCallIndirect(std::move(*(yyvsp[0].var))); + delete (yyvsp[0].var); } -#line 2829 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2835 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 53: -#line 507 "src/wast-parser.y" /* yacc.c:1646 */ +#line 513 "src/wast-parser.y" /* yacc.c:1646 */ { - (yyval.expr) = Expr::CreateGetLocal((yyvsp[0].var)); + (yyval.expr) = Expr::CreateGetLocal(std::move(*(yyvsp[0].var))); + delete (yyvsp[0].var); } -#line 2837 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2844 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 54: -#line 510 "src/wast-parser.y" /* yacc.c:1646 */ +#line 517 "src/wast-parser.y" /* yacc.c:1646 */ { - (yyval.expr) = Expr::CreateSetLocal((yyvsp[0].var)); + (yyval.expr) = Expr::CreateSetLocal(std::move(*(yyvsp[0].var))); + delete (yyvsp[0].var); } -#line 2845 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2853 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 55: -#line 513 "src/wast-parser.y" /* yacc.c:1646 */ +#line 521 "src/wast-parser.y" /* yacc.c:1646 */ { - (yyval.expr) = Expr::CreateTeeLocal((yyvsp[0].var)); + (yyval.expr) = Expr::CreateTeeLocal(std::move(*(yyvsp[0].var))); + delete (yyvsp[0].var); } -#line 2853 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2862 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 56: -#line 516 "src/wast-parser.y" /* yacc.c:1646 */ +#line 525 "src/wast-parser.y" /* yacc.c:1646 */ { - (yyval.expr) = Expr::CreateGetGlobal((yyvsp[0].var)); + (yyval.expr) = Expr::CreateGetGlobal(std::move(*(yyvsp[0].var))); + delete (yyvsp[0].var); } -#line 2861 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2871 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 57: -#line 519 "src/wast-parser.y" /* yacc.c:1646 */ +#line 529 "src/wast-parser.y" /* yacc.c:1646 */ { - (yyval.expr) = Expr::CreateSetGlobal((yyvsp[0].var)); + (yyval.expr) = Expr::CreateSetGlobal(std::move(*(yyvsp[0].var))); + delete (yyvsp[0].var); } -#line 2869 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2880 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 58: -#line 522 "src/wast-parser.y" /* yacc.c:1646 */ +#line 533 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateLoad((yyvsp[-2].opcode), (yyvsp[0].u32), (yyvsp[-1].u64)); } -#line 2877 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2888 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 59: -#line 525 "src/wast-parser.y" /* yacc.c:1646 */ +#line 536 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateStore((yyvsp[-2].opcode), (yyvsp[0].u32), (yyvsp[-1].u64)); } -#line 2885 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2896 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 60: -#line 528 "src/wast-parser.y" /* yacc.c:1646 */ +#line 539 "src/wast-parser.y" /* yacc.c:1646 */ { Const const_; WABT_ZERO_MEMORY(const_); @@ -2899,248 +2910,252 @@ yyreduce: delete [] (yyvsp[0].literal).text.start; (yyval.expr) = Expr::CreateConst(const_); } -#line 2903 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2914 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 61: -#line 541 "src/wast-parser.y" /* yacc.c:1646 */ +#line 552 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateUnary((yyvsp[0].opcode)); } -#line 2911 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2922 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 62: -#line 544 "src/wast-parser.y" /* yacc.c:1646 */ +#line 555 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateBinary((yyvsp[0].opcode)); } -#line 2919 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2930 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 63: -#line 547 "src/wast-parser.y" /* yacc.c:1646 */ +#line 558 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateCompare((yyvsp[0].opcode)); } -#line 2927 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2938 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 64: -#line 550 "src/wast-parser.y" /* yacc.c:1646 */ +#line 561 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateConvert((yyvsp[0].opcode)); } -#line 2935 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2946 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 65: -#line 553 "src/wast-parser.y" /* yacc.c:1646 */ +#line 564 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateCurrentMemory(); } -#line 2943 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2954 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 66: -#line 556 "src/wast-parser.y" /* yacc.c:1646 */ +#line 567 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateGrowMemory(); } -#line 2951 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2962 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 67: -#line 559 "src/wast-parser.y" /* yacc.c:1646 */ +#line 570 "src/wast-parser.y" /* yacc.c:1646 */ { - (yyval.expr) = Expr::CreateThrow((yyvsp[0].var)); + (yyval.expr) = Expr::CreateThrow(std::move(*(yyvsp[0].var))); + delete (yyvsp[0].var); } -#line 2959 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2971 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 68: -#line 562 "src/wast-parser.y" /* yacc.c:1646 */ +#line 574 "src/wast-parser.y" /* yacc.c:1646 */ { - (yyval.expr) = Expr::CreateRethrow((yyvsp[0].var)); + (yyval.expr) = Expr::CreateRethrow(std::move(*(yyvsp[0].var))); + delete (yyvsp[0].var); } -#line 2967 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2980 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 69: -#line 568 "src/wast-parser.y" /* yacc.c:1646 */ +#line 581 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateBlock((yyvsp[-2].block)); (yyval.expr)->block->label = (yyvsp[-3].text); CHECK_END_LABEL((yylsp[0]), (yyval.expr)->block->label, (yyvsp[0].text)); } -#line 2977 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 2990 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 70: -#line 573 "src/wast-parser.y" /* yacc.c:1646 */ +#line 586 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateLoop((yyvsp[-2].block)); (yyval.expr)->loop->label = (yyvsp[-3].text); CHECK_END_LABEL((yylsp[0]), (yyval.expr)->loop->label, (yyvsp[0].text)); } -#line 2987 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3000 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 71: -#line 578 "src/wast-parser.y" /* yacc.c:1646 */ +#line 591 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateIf((yyvsp[-2].block), nullptr); (yyval.expr)->if_.true_->label = (yyvsp[-3].text); CHECK_END_LABEL((yylsp[0]), (yyval.expr)->if_.true_->label, (yyvsp[0].text)); } -#line 2997 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3010 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 72: -#line 583 "src/wast-parser.y" /* yacc.c:1646 */ +#line 596 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr) = Expr::CreateIf((yyvsp[-5].block), (yyvsp[-2].expr_list).first); (yyval.expr)->if_.true_->label = (yyvsp[-6].text); CHECK_END_LABEL((yylsp[-3]), (yyval.expr)->if_.true_->label, (yyvsp[-3].text)); CHECK_END_LABEL((yylsp[0]), (yyval.expr)->if_.true_->label, (yyvsp[0].text)); } -#line 3008 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3021 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 73: -#line 589 "src/wast-parser.y" /* yacc.c:1646 */ +#line 602 "src/wast-parser.y" /* yacc.c:1646 */ { (yyvsp[-3].block)->label = (yyvsp[-4].text); (yyval.expr) = Expr::CreateTry((yyvsp[-3].block), (yyvsp[-2].expr_list).first); CHECK_END_LABEL((yylsp[0]), (yyvsp[-3].block)->label, (yyvsp[0].text)); } -#line 3018 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3031 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 74: -#line 597 "src/wast-parser.y" /* yacc.c:1646 */ +#line 610 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.types) = (yyvsp[-1].types); } -#line 3024 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3037 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 75: -#line 600 "src/wast-parser.y" /* yacc.c:1646 */ +#line 613 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.block) = (yyvsp[0].block); (yyval.block)->sig.insert((yyval.block)->sig.end(), (yyvsp[-1].types)->begin(), (yyvsp[-1].types)->end()); delete (yyvsp[-1].types); } -#line 3034 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3047 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 76: -#line 605 "src/wast-parser.y" /* yacc.c:1646 */ +#line 618 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.block) = new Block(); (yyval.block)->first = (yyvsp[0].expr_list).first; } -#line 3043 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3056 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 77: -#line 612 "src/wast-parser.y" /* yacc.c:1646 */ +#line 625 "src/wast-parser.y" /* yacc.c:1646 */ { - Expr* expr = Expr::CreateCatch((yyvsp[-1].var), (yyvsp[0].expr_list).first); + Expr* expr = Expr::CreateCatch(std::move(*(yyvsp[-1].var)), (yyvsp[0].expr_list).first); + delete (yyvsp[-1].var); (yyval.expr_list) = join_exprs1(&(yylsp[-2]), expr); } -#line 3052 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3066 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 78: -#line 616 "src/wast-parser.y" /* yacc.c:1646 */ +#line 630 "src/wast-parser.y" /* yacc.c:1646 */ { - Expr* expr = Expr::CreateCatchAll((yyvsp[-1].var), (yyvsp[0].expr_list).first); + Expr* expr = Expr::CreateCatchAll(std::move(*(yyvsp[-1].var)), (yyvsp[0].expr_list).first); + delete (yyvsp[-1].var); (yyval.expr_list) = join_exprs1(&(yylsp[-2]), expr); } -#line 3061 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3076 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 80: -#line 624 "src/wast-parser.y" /* yacc.c:1646 */ +#line 639 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr_list) = join_expr_lists(&(yyvsp[-1].expr_list), &(yyvsp[0].expr_list)); } -#line 3069 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3084 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 81: -#line 630 "src/wast-parser.y" /* yacc.c:1646 */ +#line 645 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr_list) = (yyvsp[-1].expr_list); } -#line 3075 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3090 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 82: -#line 634 "src/wast-parser.y" /* yacc.c:1646 */ +#line 649 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr_list) = join_exprs2(&(yylsp[-1]), &(yyvsp[0].expr_list), (yyvsp[-1].expr)); } -#line 3083 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3098 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 83: -#line 637 "src/wast-parser.y" /* yacc.c:1646 */ +#line 652 "src/wast-parser.y" /* yacc.c:1646 */ { Expr* expr = Expr::CreateBlock((yyvsp[0].block)); expr->block->label = (yyvsp[-1].text); (yyval.expr_list) = join_exprs1(&(yylsp[-2]), expr); } -#line 3093 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3108 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 84: -#line 642 "src/wast-parser.y" /* yacc.c:1646 */ +#line 657 "src/wast-parser.y" /* yacc.c:1646 */ { Expr* expr = Expr::CreateLoop((yyvsp[0].block)); expr->loop->label = (yyvsp[-1].text); (yyval.expr_list) = join_exprs1(&(yylsp[-2]), expr); } -#line 3103 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3118 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 85: -#line 647 "src/wast-parser.y" /* yacc.c:1646 */ +#line 662 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr_list) = (yyvsp[0].expr_list); Expr* if_ = (yyvsp[0].expr_list).last; assert(if_->type == ExprType::If); if_->if_.true_->label = (yyvsp[-1].text); } -#line 3114 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3129 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 86: -#line 653 "src/wast-parser.y" /* yacc.c:1646 */ +#line 668 "src/wast-parser.y" /* yacc.c:1646 */ { (yyvsp[-2].block)->label = (yyvsp[-3].text); Expr* try_ = Expr::CreateTry((yyvsp[-2].block), (yyvsp[0].expr_list).first); (yyval.expr_list) = join_exprs1(&(yylsp[-6]), try_); } -#line 3124 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3139 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 87: -#line 661 "src/wast-parser.y" /* yacc.c:1646 */ +#line 676 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr_list) = (yyvsp[-1].expr_list); } -#line 3132 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3147 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 88: -#line 664 "src/wast-parser.y" /* yacc.c:1646 */ +#line 679 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr_list) = join_expr_lists(&(yyvsp[-2].expr_list), &(yyvsp[0].expr_list)); } -#line 3140 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3155 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 89: -#line 670 "src/wast-parser.y" /* yacc.c:1646 */ +#line 685 "src/wast-parser.y" /* yacc.c:1646 */ { Expr* if_ = (yyvsp[0].expr_list).last; assert(if_->type == ExprType::If); @@ -3149,123 +3164,123 @@ yyreduce: true_->sig.insert(true_->sig.end(), (yyvsp[-1].types)->begin(), (yyvsp[-1].types)->end()); delete (yyvsp[-1].types); } -#line 3153 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3168 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 91: -#line 681 "src/wast-parser.y" /* yacc.c:1646 */ +#line 696 "src/wast-parser.y" /* yacc.c:1646 */ { Expr* expr = Expr::CreateIf(new Block((yyvsp[-5].expr_list).first), (yyvsp[-1].expr_list).first); (yyval.expr_list) = join_exprs1(&(yylsp[-7]), expr); } -#line 3162 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3177 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 92: -#line 685 "src/wast-parser.y" /* yacc.c:1646 */ +#line 700 "src/wast-parser.y" /* yacc.c:1646 */ { Expr* expr = Expr::CreateIf(new Block((yyvsp[-1].expr_list).first), nullptr); (yyval.expr_list) = join_exprs1(&(yylsp[-3]), expr); } -#line 3171 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3186 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 93: -#line 689 "src/wast-parser.y" /* yacc.c:1646 */ +#line 704 "src/wast-parser.y" /* yacc.c:1646 */ { Expr* expr = Expr::CreateIf(new Block((yyvsp[-5].expr_list).first), (yyvsp[-1].expr_list).first); (yyval.expr_list) = join_exprs2(&(yylsp[-8]), &(yyvsp[-8].expr_list), expr); } -#line 3180 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3195 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 94: -#line 693 "src/wast-parser.y" /* yacc.c:1646 */ +#line 708 "src/wast-parser.y" /* yacc.c:1646 */ { Expr* expr = Expr::CreateIf(new Block((yyvsp[-1].expr_list).first), nullptr); (yyval.expr_list) = join_exprs2(&(yylsp[-4]), &(yyvsp[-4].expr_list), expr); } -#line 3189 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3204 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 95: -#line 697 "src/wast-parser.y" /* yacc.c:1646 */ +#line 712 "src/wast-parser.y" /* yacc.c:1646 */ { Expr* expr = Expr::CreateIf(new Block((yyvsp[-1].expr_list).first), (yyvsp[0].expr_list).first); (yyval.expr_list) = join_exprs2(&(yylsp[-2]), &(yyvsp[-2].expr_list), expr); } -#line 3198 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3213 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 96: -#line 701 "src/wast-parser.y" /* yacc.c:1646 */ +#line 716 "src/wast-parser.y" /* yacc.c:1646 */ { Expr* expr = Expr::CreateIf(new Block((yyvsp[0].expr_list).first), nullptr); (yyval.expr_list) = join_exprs2(&(yylsp[-1]), &(yyvsp[-1].expr_list), expr); } -#line 3207 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3222 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 97: -#line 708 "src/wast-parser.y" /* yacc.c:1646 */ +#line 723 "src/wast-parser.y" /* yacc.c:1646 */ { CHECK_ALLOW_EXCEPTIONS(&(yylsp[0]), "rethrow"); } -#line 3215 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3230 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 98: -#line 713 "src/wast-parser.y" /* yacc.c:1646 */ +#line 728 "src/wast-parser.y" /* yacc.c:1646 */ { CHECK_ALLOW_EXCEPTIONS(&(yylsp[0]), "throw"); } -#line 3223 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3238 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 99: -#line 719 "src/wast-parser.y" /* yacc.c:1646 */ +#line 734 "src/wast-parser.y" /* yacc.c:1646 */ { CHECK_ALLOW_EXCEPTIONS(&(yylsp[0]), "try"); } -#line 3231 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3246 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 100: -#line 725 "src/wast-parser.y" /* yacc.c:1646 */ +#line 740 "src/wast-parser.y" /* yacc.c:1646 */ { WABT_ZERO_MEMORY((yyval.expr_list)); } -#line 3237 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3252 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 101: -#line 726 "src/wast-parser.y" /* yacc.c:1646 */ +#line 741 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr_list).first = (yyvsp[-1].expr_list).first; (yyvsp[-1].expr_list).last->next = (yyvsp[0].expr_list).first; (yyval.expr_list).last = (yyvsp[0].expr_list).last ? (yyvsp[0].expr_list).last : (yyvsp[-1].expr_list).last; (yyval.expr_list).size = (yyvsp[-1].expr_list).size + (yyvsp[0].expr_list).size; } -#line 3248 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3263 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 102: -#line 734 "src/wast-parser.y" /* yacc.c:1646 */ +#line 749 "src/wast-parser.y" /* yacc.c:1646 */ { WABT_ZERO_MEMORY((yyval.expr_list)); } -#line 3254 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3269 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 103: -#line 735 "src/wast-parser.y" /* yacc.c:1646 */ +#line 750 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr_list).first = (yyvsp[-1].expr_list).first; (yyvsp[-1].expr_list).last->next = (yyvsp[0].expr_list).first; (yyval.expr_list).last = (yyvsp[0].expr_list).last ? (yyvsp[0].expr_list).last : (yyvsp[-1].expr_list).last; (yyval.expr_list).size = (yyvsp[-1].expr_list).size + (yyvsp[0].expr_list).size; } -#line 3265 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3280 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 105: -#line 748 "src/wast-parser.y" /* yacc.c:1646 */ +#line 763 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_fields) = (yyvsp[-1].module_fields); ModuleField* main = (yyval.module_fields).first; @@ -3277,33 +3292,34 @@ yyreduce: main->import->func->name = (yyvsp[-2].text); } } -#line 3281 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3296 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 106: -#line 762 "src/wast-parser.y" /* yacc.c:1646 */ +#line 777 "src/wast-parser.y" /* yacc.c:1646 */ { ModuleField* field = new ModuleField(ModuleFieldType::Func); field->func = (yyvsp[0].func); field->func->decl.has_func_type = true; - field->func->decl.type_var = (yyvsp[-1].var); + field->func->decl.type_var = std::move(*(yyvsp[-1].var)); + delete (yyvsp[-1].var); (yyval.module_fields).first = (yyval.module_fields).last = field; } -#line 3293 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3309 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 107: -#line 769 "src/wast-parser.y" /* yacc.c:1646 */ +#line 785 "src/wast-parser.y" /* yacc.c:1646 */ { ModuleField* field = new ModuleField(ModuleFieldType::Func); field->func = (yyvsp[0].func); (yyval.module_fields).first = (yyval.module_fields).last = field; } -#line 3303 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3319 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 108: -#line 774 "src/wast-parser.y" /* yacc.c:1646 */ +#line 790 "src/wast-parser.y" /* yacc.c:1646 */ { ModuleField* field = new ModuleField(ModuleFieldType::Import); field->loc = (yylsp[-2]); @@ -3311,14 +3327,15 @@ yyreduce: field->import->kind = ExternalKind::Func; field->import->func = (yyvsp[0].func); field->import->func->decl.has_func_type = true; - field->import->func->decl.type_var = (yyvsp[-1].var); + field->import->func->decl.type_var = std::move(*(yyvsp[-1].var)); + delete (yyvsp[-1].var); (yyval.module_fields).first = (yyval.module_fields).last = field; } -#line 3318 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3335 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 109: -#line 784 "src/wast-parser.y" /* yacc.c:1646 */ +#line 801 "src/wast-parser.y" /* yacc.c:1646 */ { ModuleField* field = new ModuleField(ModuleFieldType::Import); field->loc = (yylsp[-1]); @@ -3327,11 +3344,11 @@ yyreduce: field->import->func = (yyvsp[0].func); (yyval.module_fields).first = (yyval.module_fields).last = field; } -#line 3331 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3348 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 110: -#line 792 "src/wast-parser.y" /* yacc.c:1646 */ +#line 809 "src/wast-parser.y" /* yacc.c:1646 */ { ModuleField* field = new ModuleField(ModuleFieldType::Export); field->loc = (yylsp[-1]); @@ -3340,31 +3357,31 @@ yyreduce: (yyval.module_fields).first = (yyvsp[0].module_fields).first; (yyval.module_fields).last = (yyvsp[0].module_fields).last->next = field; } -#line 3344 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3361 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 111: -#line 803 "src/wast-parser.y" /* yacc.c:1646 */ +#line 820 "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 3353 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3370 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 113: -#line 811 "src/wast-parser.y" /* yacc.c:1646 */ +#line 828 "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 3364 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3381 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 114: -#line 817 "src/wast-parser.y" /* yacc.c:1646 */ +#line 834 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.func) = (yyvsp[0].func); (yyval.func)->param_bindings.emplace(string_slice_to_string((yyvsp[-3].text)), @@ -3372,48 +3389,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 3376 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3393 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 115: -#line 827 "src/wast-parser.y" /* yacc.c:1646 */ +#line 844 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.func) = new Func(); } -#line 3382 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3399 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 116: -#line 828 "src/wast-parser.y" /* yacc.c:1646 */ +#line 845 "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 3393 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3410 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 117: -#line 837 "src/wast-parser.y" /* yacc.c:1646 */ +#line 854 "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 3402 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3419 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 119: -#line 845 "src/wast-parser.y" /* yacc.c:1646 */ +#line 862 "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 3413 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3430 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 120: -#line 851 "src/wast-parser.y" /* yacc.c:1646 */ +#line 868 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.func) = (yyvsp[0].func); (yyval.func)->param_bindings.emplace(string_slice_to_string((yyvsp[-3].text)), @@ -3421,50 +3438,50 @@ 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 3425 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3442 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 122: -#line 862 "src/wast-parser.y" /* yacc.c:1646 */ +#line 879 "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 3436 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3453 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 123: -#line 871 "src/wast-parser.y" /* yacc.c:1646 */ +#line 888 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.func) = (yyvsp[0].func); reverse_bindings(&(yyval.func)->local_types, &(yyval.func)->local_bindings); } -#line 3445 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3462 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 124: -#line 878 "src/wast-parser.y" /* yacc.c:1646 */ +#line 895 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.func) = new Func(); (yyval.func)->first_expr = (yyvsp[0].expr_list).first; } -#line 3454 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3471 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 125: -#line 882 "src/wast-parser.y" /* yacc.c:1646 */ +#line 899 "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 3464 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3481 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 126: -#line 887 "src/wast-parser.y" /* yacc.c:1646 */ +#line 904 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.func) = (yyvsp[0].func); (yyval.func)->local_bindings.emplace(string_slice_to_string((yyvsp[-3].text)), @@ -3472,33 +3489,34 @@ yyreduce: destroy_string_slice(&(yyvsp[-3].text)); (yyval.func)->local_types.insert((yyval.func)->local_types.begin(), (yyvsp[-2].type)); } -#line 3476 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3493 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 127: -#line 899 "src/wast-parser.y" /* yacc.c:1646 */ +#line 916 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.expr_list) = (yyvsp[-1].expr_list); } -#line 3484 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3501 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 129: -#line 906 "src/wast-parser.y" /* yacc.c:1646 */ +#line 923 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_field) = new ModuleField(ModuleFieldType::ElemSegment); (yyval.module_field)->loc = (yylsp[-4]); (yyval.module_field)->elem_segment = new ElemSegment(); - (yyval.module_field)->elem_segment->table_var = (yyvsp[-3].var); + (yyval.module_field)->elem_segment->table_var = std::move(*(yyvsp[-3].var)); + delete (yyvsp[-3].var); (yyval.module_field)->elem_segment->offset = (yyvsp[-2].expr_list).first; (yyval.module_field)->elem_segment->vars = std::move(*(yyvsp[-1].vars)); delete (yyvsp[-1].vars); } -#line 3498 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3516 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 130: -#line 915 "src/wast-parser.y" /* yacc.c:1646 */ +#line 933 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_field) = new ModuleField(ModuleFieldType::ElemSegment); (yyval.module_field)->loc = (yylsp[-3]); @@ -3510,11 +3528,11 @@ yyreduce: (yyval.module_field)->elem_segment->vars = std::move(*(yyvsp[-1].vars)); delete (yyvsp[-1].vars); } -#line 3514 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3532 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 131: -#line 929 "src/wast-parser.y" /* yacc.c:1646 */ +#line 947 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_fields) = (yyvsp[-1].module_fields); ModuleField* main = (yyval.module_fields).first; @@ -3526,22 +3544,22 @@ yyreduce: main->import->table->name = (yyvsp[-2].text); } } -#line 3530 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3548 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 132: -#line 943 "src/wast-parser.y" /* yacc.c:1646 */ +#line 961 "src/wast-parser.y" /* yacc.c:1646 */ { ModuleField* field = new ModuleField(ModuleFieldType::Table); field->loc = (yylsp[0]); field->table = (yyvsp[0].table); (yyval.module_fields).first = (yyval.module_fields).last = field; } -#line 3541 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3559 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 133: -#line 949 "src/wast-parser.y" /* yacc.c:1646 */ +#line 967 "src/wast-parser.y" /* yacc.c:1646 */ { ModuleField* field = new ModuleField(ModuleFieldType::Import); field->loc = (yylsp[-1]); @@ -3550,11 +3568,11 @@ yyreduce: field->import->table = (yyvsp[0].table); (yyval.module_fields).first = (yyval.module_fields).last = field; } -#line 3554 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3572 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 134: -#line 957 "src/wast-parser.y" /* yacc.c:1646 */ +#line 975 "src/wast-parser.y" /* yacc.c:1646 */ { ModuleField* field = new ModuleField(ModuleFieldType::Export); field->loc = (yylsp[-1]); @@ -3563,11 +3581,11 @@ yyreduce: (yyval.module_fields).first = (yyvsp[0].module_fields).first; (yyval.module_fields).last = (yyvsp[0].module_fields).last->next = field; } -#line 3567 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3585 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 135: -#line 965 "src/wast-parser.y" /* yacc.c:1646 */ +#line 983 "src/wast-parser.y" /* yacc.c:1646 */ { ModuleField* table_field = new ModuleField(ModuleFieldType::Table); Table* table = table_field->table = new Table(); @@ -3577,6 +3595,7 @@ yyreduce: ModuleField* elem_field = new ModuleField(ModuleFieldType::ElemSegment); elem_field->loc = (yylsp[-2]); ElemSegment* elem_segment = elem_field->elem_segment = new ElemSegment(); + elem_segment->table_var = Var(kInvalidIndex); elem_segment->offset = Expr::CreateConst(Const(Const::I32(), 0)); elem_segment->offset->loc = (yylsp[-2]); elem_segment->vars = std::move(*(yyvsp[-1].vars)); @@ -3584,25 +3603,26 @@ yyreduce: (yyval.module_fields).first = table_field; (yyval.module_fields).last = table_field->next = elem_field; } -#line 3588 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3607 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 136: -#line 984 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1003 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_field) = new ModuleField(ModuleFieldType::DataSegment); (yyval.module_field)->loc = (yylsp[-4]); (yyval.module_field)->data_segment = new DataSegment(); - (yyval.module_field)->data_segment->memory_var = (yyvsp[-3].var); + (yyval.module_field)->data_segment->memory_var = std::move(*(yyvsp[-3].var)); + delete (yyvsp[-3].var); (yyval.module_field)->data_segment->offset = (yyvsp[-2].expr_list).first; dup_text_list(&(yyvsp[-1].text_list), &(yyval.module_field)->data_segment->data, &(yyval.module_field)->data_segment->size); destroy_text_list(&(yyvsp[-1].text_list)); } -#line 3602 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3622 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 137: -#line 993 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1013 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_field) = new ModuleField(ModuleFieldType::DataSegment); (yyval.module_field)->loc = (yylsp[-3]); @@ -3614,11 +3634,11 @@ yyreduce: dup_text_list(&(yyvsp[-1].text_list), &(yyval.module_field)->data_segment->data, &(yyval.module_field)->data_segment->size); destroy_text_list(&(yyvsp[-1].text_list)); } -#line 3618 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3638 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 138: -#line 1007 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1027 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_fields) = (yyvsp[-1].module_fields); ModuleField* main = (yyval.module_fields).first; @@ -3630,21 +3650,21 @@ yyreduce: main->import->memory->name = (yyvsp[-2].text); } } -#line 3634 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3654 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 139: -#line 1021 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1041 "src/wast-parser.y" /* yacc.c:1646 */ { ModuleField* field = new ModuleField(ModuleFieldType::Memory); field->memory = (yyvsp[0].memory); (yyval.module_fields).first = (yyval.module_fields).last = field; } -#line 3644 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3664 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 140: -#line 1026 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1046 "src/wast-parser.y" /* yacc.c:1646 */ { ModuleField* field = new ModuleField(ModuleFieldType::Import); field->loc = (yylsp[-1]); @@ -3653,11 +3673,11 @@ yyreduce: field->import->memory = (yyvsp[0].memory); (yyval.module_fields).first = (yyval.module_fields).last = field; } -#line 3657 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3677 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 141: -#line 1034 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1054 "src/wast-parser.y" /* yacc.c:1646 */ { ModuleField* field = new ModuleField(ModuleFieldType::Export); field->loc = (yylsp[-1]); @@ -3666,15 +3686,16 @@ yyreduce: (yyval.module_fields).first = (yyvsp[0].module_fields).first; (yyval.module_fields).last = (yyvsp[0].module_fields).last->next = field; } -#line 3670 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3690 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 142: -#line 1042 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1062 "src/wast-parser.y" /* yacc.c:1646 */ { ModuleField* data_field = new ModuleField(ModuleFieldType::DataSegment); data_field->loc = (yylsp[-2]); DataSegment* data_segment = data_field->data_segment = new DataSegment(); + data_segment->memory_var = Var(kInvalidIndex); data_segment->offset = Expr::CreateConst(Const(Const::I32(), 0)); data_segment->offset->loc = (yylsp[-2]); dup_text_list(&(yyvsp[-1].text_list), &data_segment->data, &data_segment->size); @@ -3691,11 +3712,11 @@ yyreduce: (yyval.module_fields).first = memory_field; (yyval.module_fields).last = memory_field->next = data_field; } -#line 3695 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3716 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 143: -#line 1065 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1086 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_fields) = (yyvsp[-1].module_fields); ModuleField* main = (yyval.module_fields).first; @@ -3707,22 +3728,22 @@ yyreduce: main->import->global->name = (yyvsp[-2].text); } } -#line 3711 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3732 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 144: -#line 1079 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1100 "src/wast-parser.y" /* yacc.c:1646 */ { ModuleField* field = new ModuleField(ModuleFieldType::Global); field->global = (yyvsp[-1].global); field->global->init_expr = (yyvsp[0].expr_list).first; (yyval.module_fields).first = (yyval.module_fields).last = field; } -#line 3722 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3743 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 145: -#line 1085 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1106 "src/wast-parser.y" /* yacc.c:1646 */ { ModuleField* field = new ModuleField(ModuleFieldType::Import); field->loc = (yylsp[-1]); @@ -3731,11 +3752,11 @@ yyreduce: field->import->global = (yyvsp[0].global); (yyval.module_fields).first = (yyval.module_fields).last = field; } -#line 3735 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3756 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 146: -#line 1093 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1114 "src/wast-parser.y" /* yacc.c:1646 */ { ModuleField* field = new ModuleField(ModuleFieldType::Export); field->loc = (yylsp[-1]); @@ -3744,24 +3765,25 @@ yyreduce: (yyval.module_fields).first = (yyvsp[0].module_fields).first; (yyval.module_fields).last = (yyvsp[0].module_fields).last->next = field; } -#line 3748 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3769 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 147: -#line 1106 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1127 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.import) = new Import(); (yyval.import)->kind = ExternalKind::Func; (yyval.import)->func = new Func(); (yyval.import)->func->name = (yyvsp[-2].text); (yyval.import)->func->decl.has_func_type = true; - (yyval.import)->func->decl.type_var = (yyvsp[-1].var); + (yyval.import)->func->decl.type_var = std::move(*(yyvsp[-1].var)); + delete (yyvsp[-1].var); } -#line 3761 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3783 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 148: -#line 1114 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1136 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.import) = new Import(); (yyval.import)->kind = ExternalKind::Func; @@ -3770,44 +3792,44 @@ yyreduce: (yyval.import)->func->decl.sig = std::move(*(yyvsp[-1].func_sig)); delete (yyvsp[-1].func_sig); } -#line 3774 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3796 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 149: -#line 1122 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1144 "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 3785 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3807 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 150: -#line 1128 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1150 "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 3796 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3818 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 151: -#line 1134 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1156 "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 3807 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3829 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 152: -#line 1143 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1165 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_field) = new ModuleField(ModuleFieldType::Import); (yyval.module_field)->loc = (yylsp[-4]); @@ -3815,81 +3837,85 @@ yyreduce: (yyval.module_field)->import->module_name = (yyvsp[-3].text); (yyval.module_field)->import->field_name = (yyvsp[-2].text); } -#line 3819 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3841 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 153: -#line 1153 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1175 "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 3829 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3851 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 154: -#line 1161 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1183 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.export_) = new Export(); (yyval.export_)->kind = ExternalKind::Func; - (yyval.export_)->var = (yyvsp[-1].var); + (yyval.export_)->var = std::move(*(yyvsp[-1].var)); + delete (yyvsp[-1].var); } -#line 3839 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3862 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 155: -#line 1166 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1189 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.export_) = new Export(); (yyval.export_)->kind = ExternalKind::Table; - (yyval.export_)->var = (yyvsp[-1].var); + (yyval.export_)->var = std::move(*(yyvsp[-1].var)); + delete (yyvsp[-1].var); } -#line 3849 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3873 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 156: -#line 1171 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1195 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.export_) = new Export(); (yyval.export_)->kind = ExternalKind::Memory; - (yyval.export_)->var = (yyvsp[-1].var); + (yyval.export_)->var = std::move(*(yyvsp[-1].var)); + delete (yyvsp[-1].var); } -#line 3859 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3884 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 157: -#line 1176 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1201 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.export_) = new Export(); (yyval.export_)->kind = ExternalKind::Global; - (yyval.export_)->var = (yyvsp[-1].var); + (yyval.export_)->var = std::move(*(yyvsp[-1].var)); + delete (yyvsp[-1].var); } -#line 3869 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3895 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 158: -#line 1183 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1209 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_field) = new ModuleField(ModuleFieldType::Export); (yyval.module_field)->loc = (yylsp[-3]); (yyval.module_field)->export_ = (yyvsp[-1].export_); (yyval.module_field)->export_->name = (yyvsp[-2].text); } -#line 3880 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3906 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 159: -#line 1192 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1218 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.export_) = new Export(); (yyval.export_)->name = (yyvsp[-1].text); } -#line 3889 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3915 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 160: -#line 1202 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1228 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_field) = new ModuleField(ModuleFieldType::FuncType); (yyval.module_field)->loc = (yylsp[-2]); @@ -3897,11 +3923,11 @@ yyreduce: (yyval.module_field)->func_type->sig = std::move(*(yyvsp[-1].func_sig)); delete (yyvsp[-1].func_sig); } -#line 3901 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3927 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 161: -#line 1209 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1235 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_field) = new ModuleField(ModuleFieldType::FuncType); (yyval.module_field)->loc = (yylsp[-3]); @@ -3910,83 +3936,84 @@ yyreduce: (yyval.module_field)->func_type->sig = std::move(*(yyvsp[-1].func_sig)); delete (yyvsp[-1].func_sig); } -#line 3914 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3940 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 162: -#line 1220 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1246 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_field) = new ModuleField(ModuleFieldType::Start); (yyval.module_field)->loc = (yylsp[-2]); - (yyval.module_field)->start = (yyvsp[-1].var); + (yyval.module_field)->start = std::move(*(yyvsp[-1].var)); + delete (yyvsp[-1].var); } -#line 3924 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3951 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 163: -#line 1228 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1255 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_fields).first = (yyval.module_fields).last = (yyvsp[0].module_field); } -#line 3930 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3957 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 168: -#line 1233 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1260 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_fields).first = (yyval.module_fields).last = (yyvsp[0].module_field); } -#line 3936 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3963 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 169: -#line 1234 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1261 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_fields).first = (yyval.module_fields).last = (yyvsp[0].module_field); } -#line 3942 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3969 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 170: -#line 1235 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1262 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_fields).first = (yyval.module_fields).last = (yyvsp[0].module_field); } -#line 3948 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3975 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 171: -#line 1236 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1263 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_fields).first = (yyval.module_fields).last = (yyvsp[0].module_field); } -#line 3954 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3981 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 172: -#line 1237 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1264 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module_fields).first = (yyval.module_fields).last = (yyvsp[0].module_field); } -#line 3960 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3987 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 173: -#line 1241 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1268 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.module) = new Module(); } -#line 3966 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 3993 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 175: -#line 1246 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1273 "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); } -#line 3976 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4003 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 176: -#line 1251 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1278 "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); } -#line 3986 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4013 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 177: -#line 1259 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1286 "src/wast-parser.y" /* yacc.c:1646 */ { if ((yyvsp[0].script_module)->type == ScriptModule::Type::Text) { (yyval.module) = (yyvsp[0].script_module)->text; @@ -4004,31 +4031,29 @@ yyreduce: } delete (yyvsp[0].script_module); } -#line 4008 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4035 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 179: -#line 1286 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1313 "src/wast-parser.y" /* yacc.c:1646 */ { - WABT_ZERO_MEMORY((yyval.var)); - (yyval.var).type = VarType::Index; - (yyval.var).index = kInvalidIndex; + (yyval.var) = new Var(kInvalidIndex); } -#line 4018 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4043 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 180: -#line 1291 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1316 "src/wast-parser.y" /* yacc.c:1646 */ { - WABT_ZERO_MEMORY((yyval.var)); - (yyval.var).type = VarType::Name; - DUPTEXT((yyval.var).name, (yyvsp[0].text)); + StringSlice name; + DUPTEXT(name, (yyvsp[0].text)); + (yyval.var) = new Var(name); } -#line 4028 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4053 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 181: -#line 1299 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1324 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.script_module) = new ScriptModule(); (yyval.script_module)->type = ScriptModule::Type::Text; @@ -4039,21 +4064,19 @@ yyreduce: // Resolve func type variables where the signature was not specified // explicitly. for (Func* func: (yyvsp[-1].module)->funcs) { - if (decl_has_func_type(&func->decl) && - is_empty_signature(&func->decl.sig)) { - FuncType* func_type = - get_func_type_by_var((yyvsp[-1].module), &func->decl.type_var); + if (func->decl.has_func_type && is_empty_signature(&func->decl.sig)) { + FuncType* func_type = (yyvsp[-1].module)->GetFuncType(func->decl.type_var); if (func_type) { func->decl.sig = func_type->sig; } } } } -#line 4053 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4076 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 182: -#line 1319 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1342 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.script_module) = new ScriptModule(); (yyval.script_module)->type = ScriptModule::Type::Binary; @@ -4062,11 +4085,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 4066 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4089 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 183: -#line 1327 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1350 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.script_module) = new ScriptModule(); (yyval.script_module)->type = ScriptModule::Type::Quoted; @@ -4075,185 +4098,188 @@ 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 4079 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4102 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 184: -#line 1338 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1361 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.action) = new Action(); (yyval.action)->loc = (yylsp[-4]); - (yyval.action)->module_var = (yyvsp[-3].var); + (yyval.action)->module_var = std::move(*(yyvsp[-3].var)); + delete (yyvsp[-3].var); (yyval.action)->type = ActionType::Invoke; (yyval.action)->name = (yyvsp[-2].text); (yyval.action)->invoke = new ActionInvoke(); (yyval.action)->invoke->args = std::move(*(yyvsp[-1].consts)); delete (yyvsp[-1].consts); } -#line 4094 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4118 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 185: -#line 1348 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1372 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.action) = new Action(); (yyval.action)->loc = (yylsp[-3]); - (yyval.action)->module_var = (yyvsp[-2].var); + (yyval.action)->module_var = std::move(*(yyvsp[-2].var)); + delete (yyvsp[-2].var); (yyval.action)->type = ActionType::Get; (yyval.action)->name = (yyvsp[-1].text); } -#line 4106 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4131 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 186: -#line 1358 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1383 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new Command(); (yyval.command)->type = CommandType::AssertMalformed; (yyval.command)->assert_malformed.module = (yyvsp[-2].script_module); (yyval.command)->assert_malformed.text = (yyvsp[-1].text); } -#line 4117 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4142 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 187: -#line 1364 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1389 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new Command(); (yyval.command)->type = CommandType::AssertInvalid; (yyval.command)->assert_invalid.module = (yyvsp[-2].script_module); (yyval.command)->assert_invalid.text = (yyvsp[-1].text); } -#line 4128 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4153 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 188: -#line 1370 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1395 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new Command(); (yyval.command)->type = CommandType::AssertUnlinkable; (yyval.command)->assert_unlinkable.module = (yyvsp[-2].script_module); (yyval.command)->assert_unlinkable.text = (yyvsp[-1].text); } -#line 4139 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4164 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 189: -#line 1376 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1401 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new Command(); (yyval.command)->type = CommandType::AssertUninstantiable; (yyval.command)->assert_uninstantiable.module = (yyvsp[-2].script_module); (yyval.command)->assert_uninstantiable.text = (yyvsp[-1].text); } -#line 4150 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4175 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 190: -#line 1382 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1407 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new Command(); (yyval.command)->type = CommandType::AssertReturn; (yyval.command)->assert_return.action = (yyvsp[-2].action); (yyval.command)->assert_return.expected = (yyvsp[-1].consts); } -#line 4161 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4186 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 191: -#line 1388 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1413 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new Command(); (yyval.command)->type = CommandType::AssertReturnCanonicalNan; (yyval.command)->assert_return_canonical_nan.action = (yyvsp[-1].action); } -#line 4171 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4196 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 192: -#line 1393 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1418 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new Command(); (yyval.command)->type = CommandType::AssertReturnArithmeticNan; (yyval.command)->assert_return_arithmetic_nan.action = (yyvsp[-1].action); } -#line 4181 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4206 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 193: -#line 1398 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1423 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new Command(); (yyval.command)->type = CommandType::AssertTrap; (yyval.command)->assert_trap.action = (yyvsp[-2].action); (yyval.command)->assert_trap.text = (yyvsp[-1].text); } -#line 4192 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4217 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 194: -#line 1404 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1429 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new Command(); (yyval.command)->type = CommandType::AssertExhaustion; (yyval.command)->assert_trap.action = (yyvsp[-2].action); (yyval.command)->assert_trap.text = (yyvsp[-1].text); } -#line 4203 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4228 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 195: -#line 1413 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1438 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new Command(); (yyval.command)->type = CommandType::Action; (yyval.command)->action = (yyvsp[0].action); } -#line 4213 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4238 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 197: -#line 1419 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1444 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new Command(); (yyval.command)->type = CommandType::Module; (yyval.command)->module = (yyvsp[0].module); } -#line 4223 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4248 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 198: -#line 1424 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1449 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.command) = new Command(); (yyval.command)->type = CommandType::Register; (yyval.command)->register_.module_name = (yyvsp[-2].text); - (yyval.command)->register_.var = (yyvsp[-1].var); + (yyval.command)->register_.var = std::move(*(yyvsp[-1].var)); + delete (yyvsp[-1].var); (yyval.command)->register_.var.loc = (yylsp[-1]); } -#line 4235 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4261 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 199: -#line 1433 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1459 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.commands) = new CommandPtrVector(); (yyval.commands)->emplace_back((yyvsp[0].command)); } -#line 4244 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4270 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 200: -#line 1437 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1463 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.commands) = (yyvsp[-1].commands); (yyval.commands)->emplace_back((yyvsp[0].command)); } -#line 4253 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4279 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 201: -#line 1444 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1470 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.const_).loc = (yylsp[-2]); if (WABT_FAILED(parse_const((yyvsp[-2].type), (yyvsp[-1].literal).type, (yyvsp[-1].literal).text.start, @@ -4264,34 +4290,34 @@ yyreduce: } delete [] (yyvsp[-1].literal).text.start; } -#line 4268 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4294 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 202: -#line 1456 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1482 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.consts) = new ConstVector(); } -#line 4274 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4300 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 203: -#line 1457 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1483 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.consts) = (yyvsp[-1].consts); (yyval.consts)->push_back((yyvsp[0].const_)); } -#line 4283 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4309 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 204: -#line 1464 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1490 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.script) = new Script(); } -#line 4291 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4317 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 205: -#line 1467 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1493 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.script) = new Script(); (yyval.script)->commands = std::move(*(yyvsp[0].commands)); @@ -4352,11 +4378,11 @@ yyreduce: } } } -#line 4356 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4382 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 206: -#line 1527 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1553 "src/wast-parser.y" /* yacc.c:1646 */ { (yyval.script) = new Script(); Command* command = new Command(); @@ -4364,17 +4390,17 @@ yyreduce: command->module = (yyvsp[0].module); (yyval.script)->commands.emplace_back(command); } -#line 4368 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4394 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; case 207: -#line 1539 "src/wast-parser.y" /* yacc.c:1646 */ +#line 1565 "src/wast-parser.y" /* yacc.c:1646 */ { parser->script = (yyvsp[0].script); } -#line 4374 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4400 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ break; -#line 4378 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ +#line 4404 "src/prebuilt/wast-parser-gen.cc" /* yacc.c:1646 */ default: break; } /* User semantic actions sometimes alter yychar, and that requires @@ -4609,7 +4635,7 @@ yyreturn: #endif return yyresult; } -#line 1542 "src/wast-parser.y" /* yacc.c:1906 */ +#line 1568 "src/wast-parser.y" /* yacc.c:1906 */ void append_expr_list(ExprList* expr_list, ExprList* expr) { @@ -4766,12 +4792,12 @@ bool is_empty_signature(const FuncSignature* sig) { void append_implicit_func_declaration(Location* loc, Module* module, FuncDeclaration* decl) { - if (decl_has_func_type(decl)) + if (decl->has_func_type) return; - int sig_index = get_func_type_index_by_decl(module, decl); + int sig_index = module->GetFuncTypeIndex(*decl); if (sig_index == -1) { - append_implicit_func_type(loc, module, &decl->sig); + module->AppendImplicitFuncType(*loc, decl->sig); } else { decl->sig = module->func_types[sig_index]->sig; } diff --git a/src/resolve-names.cc b/src/resolve-names.cc index 69f9a727..5e2959ea 100644 --- a/src/resolve-names.cc +++ b/src/resolve-names.cc @@ -148,8 +148,8 @@ void NameResolver::ResolveVar(const BindingHash* bindings, Var* var, const char* desc) { if (var->type == VarType::Name) { - int index = get_index_from_var(bindings, var); - if (index == -1) { + Index index = bindings->FindIndex(*var); + if (index == kInvalidIndex) { PrintError(&var->loc, "undefined %s variable \"" PRIstringslice "\"", desc, WABT_PRINTF_STRING_SLICE_ARG(var->name)); return; @@ -186,8 +186,8 @@ void NameResolver::ResolveLocalVar(Var* var) { if (!current_func_) return; - int index = get_local_index_by_var(current_func_, var); - if (index == -1) { + Index index = current_func_->GetLocalIndex(*var); + if (index == kInvalidIndex) { PrintError(&var->loc, "undefined local variable \"" PRIstringslice "\"", WABT_PRINTF_STRING_SLICE_ARG(var->name)); return; @@ -283,7 +283,7 @@ Result NameResolver::OnTeeLocalExpr(Expr* expr) { void NameResolver::VisitFunc(Func* func) { current_func_ = func; - if (decl_has_func_type(&func->decl)) + if (func->decl.has_func_type) ResolveFuncTypeVar(&func->decl.type_var); CheckDuplicateBindings(&func->param_bindings, "parameter"); diff --git a/src/tools/wast-desugar.cc b/src/tools/wast-desugar.cc index 3d36d6cc..441a928b 100644 --- a/src/tools/wast-desugar.cc +++ b/src/tools/wast-desugar.cc @@ -145,7 +145,7 @@ int ProgramMain(int argc, char** argv) { Result result = parse_wast(lexer.get(), &script, &error_handler); if (WABT_SUCCEEDED(result)) { - Module* module = get_first_module(script); + Module* module = script->GetFirstModule(); if (!module) WABT_FATAL("no module in file.\n"); diff --git a/src/tools/wast2wasm.cc b/src/tools/wast2wasm.cc index 6c84d66c..eb5ea041 100644 --- a/src/tools/wast2wasm.cc +++ b/src/tools/wast2wasm.cc @@ -237,7 +237,7 @@ int ProgramMain(int argc, char** argv) { &s_write_binary_spec_options); } else { MemoryWriter writer; - Module* module = get_first_module(script); + const Module* module = script->GetFirstModule(); if (module) { result = write_binary_module(&writer, module, &s_write_binary_options); diff --git a/src/validator.cc b/src/validator.cc index 4ab48d51..690d3943 100644 --- a/src/validator.cc +++ b/src/validator.cc @@ -267,13 +267,13 @@ Result Validator::CheckMemoryVar(const Var* var, const Memory** out_memory) { Result Validator::CheckLocalVar(const Var* var, Type* out_type) { const Func* func = current_func_; - Index max_index = get_num_params_and_locals(func); - Index index = get_local_index_by_var(func, var); + Index max_index = func->GetNumParamsAndLocals(); + Index index = func->GetLocalIndex(*var); if (index < max_index) { if (out_type) { - Index num_params = get_num_params(func); + Index num_params = func->GetNumParams(); if (index < num_params) { - *out_type = get_param_type(func, index); + *out_type = func->GetParamType(index); } else { *out_type = current_func_->local_types[index - num_params]; } @@ -599,12 +599,12 @@ void Validator::CheckFuncSignatureMatchesFuncType(const Location* loc, void Validator::CheckFunc(const Location* loc, const Func* func) { current_func_ = func; - if (get_num_results(func) > 1) { + if (func->GetNumResults() > 1) { PrintError(loc, "multiple result values not currently supported."); // Don't run any other checks, the won't test the result_type properly. return; } - if (decl_has_func_type(&func->decl)) { + if (func->decl.has_func_type) { const FuncType* func_type; if (WABT_SUCCEEDED(CheckFuncTypeVar(&func->decl.type_var, &func_type))) { CheckFuncSignatureMatchesFuncType(loc, func->decl.sig, func_type); @@ -750,7 +750,7 @@ void Validator::CheckDataSegments(const Module* module) { void Validator::CheckImport(const Location* loc, const Import* import) { switch (import->kind) { case ExternalKind::Func: - if (decl_has_func_type(&import->func->decl)) + if (import->func->decl.has_func_type) CheckFuncTypeVar(&import->func->decl.type_var, nullptr); break; case ExternalKind::Table: @@ -862,11 +862,11 @@ void Validator::CheckModule(const Module* module) { const Func* start_func = nullptr; CheckFuncVar(&field->start, &start_func); if (start_func) { - if (get_num_params(start_func) != 0) { + if (start_func->GetNumParams() != 0) { PrintError(&field->loc, "start function must be nullary"); } - if (get_num_results(start_func) != 0) { + if (start_func->GetNumResults() != 0) { PrintError(&field->loc, "start function must not return anything"); } } @@ -886,27 +886,27 @@ void Validator::CheckModule(const Module* module) { // should be ignored. const TypeVector* Validator::CheckInvoke(const Action* action) { const ActionInvoke* invoke = action->invoke; - const Module* module = get_module_by_var(script_, &action->module_var); + const Module* module = script_->GetModule(action->module_var); if (!module) { PrintError(&action->loc, "unknown module"); return nullptr; } - Export* export_ = get_export_by_name(module, &action->name); + const Export* export_ = module->GetExport(action->name); if (!export_) { PrintError(&action->loc, "unknown function export \"" PRIstringslice "\"", WABT_PRINTF_STRING_SLICE_ARG(action->name)); return nullptr; } - Func* func = get_func_by_var(module, &export_->var); + const Func* func = module->GetFunc(export_->var); if (!func) { // This error will have already been reported, just skip it. return nullptr; } size_t actual_args = invoke->args.size(); - size_t expected_args = get_num_params(func); + size_t expected_args = func->GetNumParams(); if (expected_args != actual_args) { PrintError(&action->loc, "too %s parameters to function. got %" PRIzd ", expected %" PRIzd, @@ -916,28 +916,28 @@ const TypeVector* Validator::CheckInvoke(const Action* action) { } for (size_t i = 0; i < actual_args; ++i) { const Const* const_ = &invoke->args[i]; - CheckTypeIndex(&const_->loc, const_->type, get_param_type(func, i), - "invoke", i, "argument"); + CheckTypeIndex(&const_->loc, const_->type, func->GetParamType(i), "invoke", + i, "argument"); } return &func->decl.sig.result_types; } Result Validator::CheckGet(const Action* action, Type* out_type) { - const Module* module = get_module_by_var(script_, &action->module_var); + const Module* module = script_->GetModule(action->module_var); if (!module) { PrintError(&action->loc, "unknown module"); return Result::Error; } - Export* export_ = get_export_by_name(module, &action->name); + const Export* export_ = module->GetExport(action->name); if (!export_) { PrintError(&action->loc, "unknown global export \"" PRIstringslice "\"", WABT_PRINTF_STRING_SLICE_ARG(action->name)); return Result::Error; } - Global* global = get_global_by_var(module, &export_->var); + const Global* global = module->GetGlobal(export_->var); if (!global) { // This error will have already been reported, just skip it. return Result::Error; diff --git a/src/wast-parser-lexer-shared.h b/src/wast-parser-lexer-shared.h index 309f9bcb..69ef6530 100644 --- a/src/wast-parser-lexer-shared.h +++ b/src/wast-parser-lexer-shared.h @@ -91,7 +91,7 @@ union Token { TypeVector* types; uint32_t u32; uint64_t u64; - Var var; + Var* var; VarVector* vars; }; diff --git a/src/wast-parser.y b/src/wast-parser.y index 913900db..277942ec 100644 --- a/src/wast-parser.y +++ b/src/wast-parser.y @@ -231,7 +231,7 @@ class BinaryErrorHandlerModule : public BinaryErrorHandler { %destructor { delete $$; } <consts> %destructor { delete $$; } <export_> %destructor { delete $$; } <expr> -%destructor { destroy_expr_list($$.first); } <expr_list> +%destructor { DestroyExprList($$.first); } <expr_list> %destructor { destroy_module_field_list(&$$); } <module_fields> %destructor { delete $$; } <func> %destructor { delete $$; } <func_sig> @@ -243,7 +243,7 @@ class BinaryErrorHandlerModule : public BinaryErrorHandler { %destructor { delete $$; } <script> %destructor { destroy_text_list(&$$); } <text_list> %destructor { delete $$; } <types> -%destructor { destroy_var(&$$); } <var> +%destructor { delete $$; } <var> %destructor { delete $$; } <vars> @@ -404,21 +404,22 @@ literal : var : nat { - $$.loc = @1; - $$.type = VarType::Index; - $$.index = $1; + $$ = new Var($1); + $$->loc = @1; } | VAR { - $$.loc = @1; - $$.type = VarType::Name; - DUPTEXT($$.name, $1); + StringSlice name; + DUPTEXT(name, $1); + $$ = new Var(name); + $$->loc = @1; } ; var_list : /* empty */ { $$ = new VarVector(); } | var_list var { $$ = $1; - $$->push_back($2); + $$->emplace_back(std::move(*$2)); + delete $2; } ; bind_var_opt : @@ -487,37 +488,47 @@ plain_instr : $$ = Expr::CreateSelect(); } | BR var { - $$ = Expr::CreateBr($2); + $$ = Expr::CreateBr(std::move(*$2)); + delete $2; } | BR_IF var { - $$ = Expr::CreateBrIf($2); + $$ = Expr::CreateBrIf(std::move(*$2)); + delete $2; } | BR_TABLE var_list var { - $$ = Expr::CreateBrTable($2, $3); + $$ = Expr::CreateBrTable($2, std::move(*$3)); + delete $3; } | RETURN { $$ = Expr::CreateReturn(); } | CALL var { - $$ = Expr::CreateCall($2); + $$ = Expr::CreateCall(std::move(*$2)); + delete $2; } | CALL_INDIRECT var { - $$ = Expr::CreateCallIndirect($2); + $$ = Expr::CreateCallIndirect(std::move(*$2)); + delete $2; } | GET_LOCAL var { - $$ = Expr::CreateGetLocal($2); + $$ = Expr::CreateGetLocal(std::move(*$2)); + delete $2; } | SET_LOCAL var { - $$ = Expr::CreateSetLocal($2); + $$ = Expr::CreateSetLocal(std::move(*$2)); + delete $2; } | TEE_LOCAL var { - $$ = Expr::CreateTeeLocal($2); + $$ = Expr::CreateTeeLocal(std::move(*$2)); + delete $2; } | GET_GLOBAL var { - $$ = Expr::CreateGetGlobal($2); + $$ = Expr::CreateGetGlobal(std::move(*$2)); + delete $2; } | SET_GLOBAL var { - $$ = Expr::CreateSetGlobal($2); + $$ = Expr::CreateSetGlobal(std::move(*$2)); + delete $2; } | LOAD offset_opt align_opt { $$ = Expr::CreateLoad($1, $3, $2); @@ -557,10 +568,12 @@ plain_instr : $$ = Expr::CreateGrowMemory(); } | throw_check var { - $$ = Expr::CreateThrow($2); + $$ = Expr::CreateThrow(std::move(*$2)); + delete $2; } | rethrow_check var { - $$ = Expr::CreateRethrow($2); + $$ = Expr::CreateRethrow(std::move(*$2)); + delete $2; } ; @@ -610,11 +623,13 @@ block : catch_instr : CATCH var instr_list { - Expr* expr = Expr::CreateCatch($2, $3.first); + Expr* expr = Expr::CreateCatch(std::move(*$2), $3.first); + delete $2; $$ = join_exprs1(&@1, expr); } | CATCH_ALL var instr_list { - Expr* expr = Expr::CreateCatchAll($2, $3.first); + Expr* expr = Expr::CreateCatchAll(std::move(*$2), $3.first); + delete $2; $$ = join_exprs1(&@1, expr); } ; @@ -763,7 +778,8 @@ func_fields : ModuleField* field = new ModuleField(ModuleFieldType::Func); field->func = $2; field->func->decl.has_func_type = true; - field->func->decl.type_var = $1; + field->func->decl.type_var = std::move(*$1); + delete $1; $$.first = $$.last = field; } | func_fields_body { @@ -778,7 +794,8 @@ func_fields : field->import->kind = ExternalKind::Func; field->import->func = $3; field->import->func->decl.has_func_type = true; - field->import->func->decl.type_var = $2; + field->import->func->decl.type_var = std::move(*$2); + delete $2; $$.first = $$.last = field; } | inline_import func_fields_import { @@ -907,7 +924,8 @@ elem : $$ = new ModuleField(ModuleFieldType::ElemSegment); $$->loc = @2; $$->elem_segment = new ElemSegment(); - $$->elem_segment->table_var = $3; + $$->elem_segment->table_var = std::move(*$3); + delete $3; $$->elem_segment->offset = $4.first; $$->elem_segment->vars = std::move(*$5); delete $5; @@ -971,6 +989,7 @@ table_fields : ModuleField* elem_field = new ModuleField(ModuleFieldType::ElemSegment); elem_field->loc = @3; ElemSegment* elem_segment = elem_field->elem_segment = new ElemSegment(); + elem_segment->table_var = Var(kInvalidIndex); elem_segment->offset = Expr::CreateConst(Const(Const::I32(), 0)); elem_segment->offset->loc = @3; elem_segment->vars = std::move(*$4); @@ -985,7 +1004,8 @@ data : $$ = new ModuleField(ModuleFieldType::DataSegment); $$->loc = @2; $$->data_segment = new DataSegment(); - $$->data_segment->memory_var = $3; + $$->data_segment->memory_var = std::move(*$3); + delete $3; $$->data_segment->offset = $4.first; dup_text_list(&$5, &$$->data_segment->data, &$$->data_segment->size); destroy_text_list(&$5); @@ -1043,6 +1063,7 @@ memory_fields : ModuleField* data_field = new ModuleField(ModuleFieldType::DataSegment); data_field->loc = @2; DataSegment* data_segment = data_field->data_segment = new DataSegment(); + data_segment->memory_var = Var(kInvalidIndex); data_segment->offset = Expr::CreateConst(Const(Const::I32(), 0)); data_segment->offset->loc = @2; dup_text_list(&$3, &data_segment->data, &data_segment->size); @@ -1109,7 +1130,8 @@ import_desc : $$->func = new Func(); $$->func->name = $3; $$->func->decl.has_func_type = true; - $$->func->decl.type_var = $4; + $$->func->decl.type_var = std::move(*$4); + delete $4; } | LPAR FUNC bind_var_opt func_sig RPAR { $$ = new Import(); @@ -1161,22 +1183,26 @@ export_desc : LPAR FUNC var RPAR { $$ = new Export(); $$->kind = ExternalKind::Func; - $$->var = $3; + $$->var = std::move(*$3); + delete $3; } | LPAR TABLE var RPAR { $$ = new Export(); $$->kind = ExternalKind::Table; - $$->var = $3; + $$->var = std::move(*$3); + delete $3; } | LPAR MEMORY var RPAR { $$ = new Export(); $$->kind = ExternalKind::Memory; - $$->var = $3; + $$->var = std::move(*$3); + delete $3; } | LPAR GLOBAL var RPAR { $$ = new Export(); $$->kind = ExternalKind::Global; - $$->var = $3; + $$->var = std::move(*$3); + delete $3; } ; export : @@ -1220,7 +1246,8 @@ start : LPAR START var RPAR { $$ = new ModuleField(ModuleFieldType::Start); $$->loc = @2; - $$->start = $3; + $$->start = std::move(*$3); + delete $3; } ; @@ -1284,14 +1311,12 @@ inline_module : script_var_opt : /* empty */ { - WABT_ZERO_MEMORY($$); - $$.type = VarType::Index; - $$.index = kInvalidIndex; + $$ = new Var(kInvalidIndex); } | VAR { - WABT_ZERO_MEMORY($$); - $$.type = VarType::Name; - DUPTEXT($$.name, $1); + StringSlice name; + DUPTEXT(name, $1); + $$ = new Var(name); } ; @@ -1306,10 +1331,8 @@ script_module : // Resolve func type variables where the signature was not specified // explicitly. for (Func* func: $4->funcs) { - if (decl_has_func_type(&func->decl) && - is_empty_signature(&func->decl.sig)) { - FuncType* func_type = - get_func_type_by_var($4, &func->decl.type_var); + if (func->decl.has_func_type && is_empty_signature(&func->decl.sig)) { + FuncType* func_type = $4->GetFuncType(func->decl.type_var); if (func_type) { func->decl.sig = func_type->sig; } @@ -1338,7 +1361,8 @@ action : LPAR INVOKE script_var_opt quoted_text const_list RPAR { $$ = new Action(); $$->loc = @2; - $$->module_var = $3; + $$->module_var = std::move(*$3); + delete $3; $$->type = ActionType::Invoke; $$->name = $4; $$->invoke = new ActionInvoke(); @@ -1348,7 +1372,8 @@ action : | LPAR GET script_var_opt quoted_text RPAR { $$ = new Action(); $$->loc = @2; - $$->module_var = $3; + $$->module_var = std::move(*$3); + delete $3; $$->type = ActionType::Get; $$->name = $4; } @@ -1425,7 +1450,8 @@ cmd : $$ = new Command(); $$->type = CommandType::Register; $$->register_.module_name = $3; - $$->register_.var = $4; + $$->register_.var = std::move(*$4); + delete $4; $$->register_.var.loc = @4; } ; @@ -1695,12 +1721,12 @@ bool is_empty_signature(const FuncSignature* sig) { void append_implicit_func_declaration(Location* loc, Module* module, FuncDeclaration* decl) { - if (decl_has_func_type(decl)) + if (decl->has_func_type) return; - int sig_index = get_func_type_index_by_decl(module, decl); + int sig_index = module->GetFuncTypeIndex(*decl); if (sig_index == -1) { - append_implicit_func_type(loc, module, &decl->sig); + module->AppendImplicitFuncType(*loc, decl->sig); } else { decl->sig = module->func_types[sig_index]->sig; } diff --git a/src/wat-writer.cc b/src/wat-writer.cc index 0d94e76a..6e1e1954 100644 --- a/src/wat-writer.cc +++ b/src/wat-writer.cc @@ -637,23 +637,23 @@ Index WatWriter::GetLabelArity(const Var* var) { } Index WatWriter::GetFuncParamCount(const Var* var) { - Func* func = get_func_by_var(module_, var); - return func ? get_num_params(func) : 0; + const Func* func = module_->GetFunc(*var); + return func ? func->GetNumParams() : 0; } Index WatWriter::GetFuncResultCount(const Var* var) { - Func* func = get_func_by_var(module_, var); - return func ? get_num_results(func) : 0; + const Func* func = module_->GetFunc(*var); + return func ? func->GetNumResults() : 0; } Index WatWriter::GetFuncSigParamCount(const Var* var) { - FuncType* func_type = get_func_type_by_var(module_, var); - return func_type ? get_func_type_num_params(func_type) : 0; + const FuncType* func_type = module_->GetFuncType(*var); + return func_type ? func_type->GetNumParams() : 0; } Index WatWriter::GetFuncSigResultCount(const Var* var) { - FuncType* func_type = get_func_type_by_var(module_, var); - return func_type ? get_func_type_num_results(func_type) : 0; + const FuncType* func_type = module_->GetFuncType(*var); + return func_type ? func_type->GetNumResults() : 0; } void WatWriter::WriteFoldedExpr(const Expr* expr) { @@ -838,7 +838,7 @@ void WatWriter::WriteTypeBindings(const char* prefix, const Func* func, const TypeVector& types, const BindingHash& bindings) { - make_type_binding_reverse_mapping(types, bindings, &index_to_name_); + MakeTypeBindingReverseMapping(types, bindings, &index_to_name_); /* named params/locals must be specified by themselves, but nameless * params/locals can be compressed, e.g.: @@ -869,7 +869,7 @@ void WatWriter::WriteFunc(const Module* module, const Func* func) { WriteOpenSpace("func"); WriteNameOrIndex(&func->name, func_index_, NextChar::Space); WriteInlineExport(func_to_export_map_[func_index_]); - if (decl_has_func_type(&func->decl)) { + if (func->decl.has_func_type) { WriteOpenSpace("type"); WriteVar(&func->decl.type_var, NextChar::None); WriteCloseSpace(); @@ -965,7 +965,7 @@ void WatWriter::WriteImport(const Import* import) { case ExternalKind::Func: WriteOpenSpace("func"); WriteNameOrIndex(&import->func->name, func_index_++, NextChar::Space); - if (decl_has_func_type(&import->func->decl)) { + if (import->func->decl.has_func_type) { WriteOpenSpace("type"); WriteVar(&import->func->decl.type_var, NextChar::None); WriteCloseSpace(); @@ -1074,28 +1074,28 @@ void WatWriter::BuildExportMaps() { for (Export* export_ : module_->exports) { switch (export_->kind) { case ExternalKind::Func: { - Index func_index = get_func_index_by_var(module_, &export_->var); + Index func_index = module_->GetFuncIndex(export_->var); if (func_index != kInvalidIndex) func_to_export_map_[func_index] = export_; break; } case ExternalKind::Table: { - Index table_index = get_table_index_by_var(module_, &export_->var); + Index table_index = module_->GetTableIndex(export_->var); if (table_index != kInvalidIndex) table_to_export_map_[table_index] = export_; break; } case ExternalKind::Memory: { - Index memory_index = get_memory_index_by_var(module_, &export_->var); + Index memory_index = module_->GetMemoryIndex(export_->var); if (memory_index != kInvalidIndex) memory_to_export_map_[memory_index] = export_; break; } case ExternalKind::Global: { - Index global_index = get_global_index_by_var(module_, &export_->var); + Index global_index = module_->GetGlobalIndex(export_->var); if (global_index != kInvalidIndex) global_to_export_map_[global_index] = export_; break; |