summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/apply-names.cc26
-rw-r--r--src/binary-reader-interpreter.cc2
-rw-r--r--src/binary-reader-ir.cc24
-rw-r--r--src/binary-writer-spec.cc18
-rw-r--r--src/binary-writer.cc69
-rw-r--r--src/binding-hash.cc8
-rw-r--r--src/binding-hash.h14
-rw-r--r--src/generate-names.cc8
-rw-r--r--src/interpreter.cc2
-rw-r--r--src/ir.cc295
-rw-r--r--src/ir.h186
-rw-r--r--src/prebuilt/wast-parser-gen.cc838
-rw-r--r--src/resolve-names.cc10
-rw-r--r--src/tools/wast-desugar.cc2
-rw-r--r--src/tools/wast2wasm.cc2
-rw-r--r--src/validator.cc36
-rw-r--r--src/wast-parser-lexer-shared.h2
-rw-r--r--src/wast-parser.y124
-rw-r--r--src/wat-writer.cc30
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, &param_index_to_name_);
+ MakeTypeBindingReverseMapping(func->decl.sig.param_types,
+ func->param_bindings, &param_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;
diff --git a/src/ir.cc b/src/ir.cc
index 653636fa..9fdf4164 100644
--- a/src/ir.cc
+++ b/src/ir.cc
@@ -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(&register_.module_name);
- destroy_var(&register_.var);
+ register_.var.~Var();
break;
case CommandType::AssertMalformed:
delete assert_malformed.module;
diff --git a/src/ir.h b/src/ir.h
index 76411da9..abd5e5ad 100644
--- a/src/ir.h
+++ b/src/ir.h
@@ -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;