diff options
Diffstat (limited to 'src/ast.cc')
-rw-r--r-- | src/ast.cc | 645 |
1 files changed, 422 insertions, 223 deletions
@@ -27,11 +27,11 @@ int get_index_from_var(const BindingHash* hash, const Var* var) { return static_cast<int>(var->index); } -ExportPtr get_export_by_name(const Module* module, const StringSlice* name) { +Export* get_export_by_name(const Module* module, const StringSlice* name) { int index = module->export_bindings.find_index(*name); if (index == -1) return nullptr; - return module->exports.data[index]; + return module->exports[index]; } int get_func_index_by_var(const Module* module, const Var* var) { @@ -67,51 +67,51 @@ int get_local_index_by_var(const Func* func, const Var* var) { return result; /* the locals start after all the params */ - return func->decl.sig.param_types.size + result; + return func->decl.sig.param_types.size() + result; } int get_module_index_by_var(const Script* script, const Var* var) { return get_index_from_var(&script->module_bindings, var); } -FuncPtr get_func_by_var(const Module* module, const Var* var) { +Func* get_func_by_var(const Module* module, const Var* var) { int index = get_index_from_var(&module->func_bindings, var); - if (index < 0 || static_cast<size_t>(index) >= module->funcs.size) + if (index < 0 || static_cast<size_t>(index) >= module->funcs.size()) return nullptr; - return module->funcs.data[index]; + return module->funcs[index]; } -GlobalPtr get_global_by_var(const Module* module, const Var* var) { +Global* get_global_by_var(const Module* module, const Var* var) { int index = get_index_from_var(&module->global_bindings, var); - if (index < 0 || static_cast<size_t>(index) >= module->globals.size) + if (index < 0 || static_cast<size_t>(index) >= module->globals.size()) return nullptr; - return module->globals.data[index]; + return module->globals[index]; } -TablePtr get_table_by_var(const Module* module, const Var* var) { +Table* get_table_by_var(const Module* module, const Var* var) { int index = get_index_from_var(&module->table_bindings, var); - if (index < 0 || static_cast<size_t>(index) >= module->tables.size) + if (index < 0 || static_cast<size_t>(index) >= module->tables.size()) return nullptr; - return module->tables.data[index]; + return module->tables[index]; } -MemoryPtr get_memory_by_var(const Module* module, const Var* var) { +Memory* get_memory_by_var(const Module* module, const Var* var) { int index = get_index_from_var(&module->memory_bindings, var); - if (index < 0 || static_cast<size_t>(index) >= module->memories.size) + if (index < 0 || static_cast<size_t>(index) >= module->memories.size()) return nullptr; - return module->memories.data[index]; + return module->memories[index]; } -FuncTypePtr get_func_type_by_var(const Module* module, const Var* var) { +FuncType* get_func_type_by_var(const Module* module, const Var* var) { int index = get_index_from_var(&module->func_type_bindings, var); - if (index < 0 || static_cast<size_t>(index) >= module->func_types.size) + if (index < 0 || static_cast<size_t>(index) >= module->func_types.size()) return nullptr; - return module->func_types.data[index]; + return module->func_types[index]; } int 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.data[i]->sig, sig)) + for (size_t i = 0; i < module->func_types.size(); ++i) + if (signatures_are_equal(&module->func_types[i]->sig, sig)) return i; return -1; } @@ -126,8 +126,7 @@ int get_func_type_index_by_decl(const Module* module, } Module* get_first_module(const Script* script) { - for (size_t i = 0; i < script->commands.size; ++i) { - Command* command = &script->commands.data[i]; + for (const std::unique_ptr<Command>& command : script->commands) { if (command->type == CommandType::Module) return command->module; } @@ -136,11 +135,11 @@ Module* get_first_module(const Script* script) { Module* get_module_by_var(const Script* script, const Var* var) { int index = get_index_from_var(&script->module_bindings, var); - if (index < 0 || static_cast<size_t>(index) >= script->commands.size) + if (index < 0 || static_cast<size_t>(index) >= script->commands.size()) return nullptr; - Command* command = &script->commands.data[index]; - assert(command->type == CommandType::Module); - return command->module; + const Command& command = *script->commands[index].get(); + assert(command.type == CommandType::Module); + return command.module; } void make_type_binding_reverse_mapping( @@ -148,11 +147,11 @@ void make_type_binding_reverse_mapping( const BindingHash& bindings, std::vector<std::string>* out_reverse_mapping) { out_reverse_mapping->clear(); - out_reverse_mapping->resize(types.size); - for (auto iter: bindings) { - assert(static_cast<size_t>(iter.second.index) < + out_reverse_mapping->resize(types.size()); + for (const auto& pair : bindings) { + assert(static_cast<size_t>(pair.second.index) < out_reverse_mapping->size()); - (*out_reverse_mapping)[iter.second.index] = iter.first; + (*out_reverse_mapping)[pair.second.index] = pair.first; } } @@ -172,122 +171,117 @@ FuncType* append_implicit_func_type(Location* loc, ModuleField* field = append_module_field(module); field->loc = *loc; field->type = ModuleFieldType::FuncType; - field->func_type.sig = *sig; - - FuncType* func_type_ptr = &field->func_type; - append_func_type_ptr_value(&module->func_types, &func_type_ptr); - return func_type_ptr; -} - -#define FOREACH_EXPR_TYPE(V) \ - V(ExprType::Binary, binary) \ - V(ExprType::Block, block) \ - V(ExprType::Br, br) \ - V(ExprType::BrIf, br_if) \ - V(ExprType::BrTable, br_table) \ - V(ExprType::Call, call) \ - V(ExprType::CallIndirect, call_indirect) \ - V(ExprType::Compare, compare) \ - V(ExprType::Const, const) \ - V(ExprType::Convert, convert) \ - V(ExprType::GetGlobal, get_global) \ - V(ExprType::GetLocal, get_local) \ - V(ExprType::If, if) \ - V(ExprType::Load, load) \ - V(ExprType::Loop, loop) \ - V(ExprType::SetGlobal, set_global) \ - V(ExprType::SetLocal, set_local) \ - V(ExprType::Store, store) \ - V(ExprType::TeeLocal, tee_local) \ - V(ExprType::Unary, unary) \ - V(ExprType::CurrentMemory, current_memory) \ - V(ExprType::Drop, drop) \ - V(ExprType::GrowMemory, grow_memory) \ - V(ExprType::Nop, nop) \ - V(ExprType::Return, return ) \ - V(ExprType::Select, select) \ - V(ExprType::Unreachable, unreachable) - -#define DEFINE_NEW_EXPR(type_, name) \ - Expr* new_##name##_expr(void) { \ - Expr* result = new Expr(); \ - result->type = type_; \ - return result; \ - } -FOREACH_EXPR_TYPE(DEFINE_NEW_EXPR) -#undef DEFINE_NEW_EXPR + field->func_type = new FuncType(); + field->func_type->sig = *sig; + + module->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_var_vector_and_elements(VarVector* vars) { - WABT_DESTROY_VECTOR_AND_ELEMENTS(*vars, var); -} - -void destroy_func_signature(FuncSignature* sig) { - destroy_type_vector(&sig->param_types); - destroy_type_vector(&sig->result_types); -} - void destroy_expr_list(Expr* first) { Expr* expr = first; while (expr) { Expr* next = expr->next; - destroy_expr(expr); + delete expr; expr = next; } } -void destroy_block(Block* block) { - destroy_string_slice(&block->label); - destroy_type_vector(&block->sig); - destroy_expr_list(block->first); +Var::Var(int64_t index) : type(VarType::Index), index(index) { + WABT_ZERO_MEMORY(loc); } -void destroy_expr(Expr* expr) { - switch (expr->type) { +Var::Var(const StringSlice& name) : type(VarType::Name), name(name) { + WABT_ZERO_MEMORY(loc); +} + +Const::Const(I32, uint32_t value) : type(Type::I32), u32(value) { + WABT_ZERO_MEMORY(loc); +} + +Const::Const(I64, uint64_t value) : type(Type::I64), u64(value) { + WABT_ZERO_MEMORY(loc); +} + +Const::Const(F32, uint32_t value) : type(Type::F32), f32_bits(value) { + WABT_ZERO_MEMORY(loc); +} + +Const::Const(F64, uint64_t value) : type(Type::F64), f64_bits(value) { + WABT_ZERO_MEMORY(loc); +} + +Block::Block(): first(nullptr) { + WABT_ZERO_MEMORY(label); +} + +Block::Block(Expr* first) : first(first) { + WABT_ZERO_MEMORY(label); +} + +Block::~Block() { + destroy_string_slice(&label); + destroy_expr_list(first); +} + +Expr::Expr() : type(ExprType::Binary), next(nullptr) { + WABT_ZERO_MEMORY(loc); + binary.opcode = Opcode::Nop; +} + +Expr::Expr(ExprType type) : type(type), next(nullptr) { + WABT_ZERO_MEMORY(loc); +} + +Expr::~Expr() { + switch (type) { case ExprType::Block: - destroy_block(&expr->block); + delete block; break; case ExprType::Br: - destroy_var(&expr->br.var); + destroy_var(&br.var); break; case ExprType::BrIf: - destroy_var(&expr->br_if.var); + destroy_var(&br_if.var); break; case ExprType::BrTable: - WABT_DESTROY_VECTOR_AND_ELEMENTS(expr->br_table.targets, var); - destroy_var(&expr->br_table.default_target); + for (Var& var : *br_table.targets) + destroy_var(&var); + delete br_table.targets; + destroy_var(&br_table.default_target); break; case ExprType::Call: - destroy_var(&expr->call.var); + destroy_var(&call.var); break; case ExprType::CallIndirect: - destroy_var(&expr->call_indirect.var); + destroy_var(&call_indirect.var); break; case ExprType::GetGlobal: - destroy_var(&expr->get_global.var); + destroy_var(&get_global.var); break; case ExprType::GetLocal: - destroy_var(&expr->get_local.var); + destroy_var(&get_local.var); break; case ExprType::If: - destroy_block(&expr->if_.true_); - destroy_expr_list(expr->if_.false_); + delete if_.true_; + destroy_expr_list(if_.false_); break; case ExprType::Loop: - destroy_block(&expr->loop); + delete loop; break; case ExprType::SetGlobal: - destroy_var(&expr->set_global.var); + destroy_var(&set_global.var); break; case ExprType::SetLocal: - destroy_var(&expr->set_local.var); + destroy_var(&set_local.var); break; case ExprType::TeeLocal: - destroy_var(&expr->tee_local.var); + destroy_var(&tee_local.var); break; case ExprType::Binary: @@ -306,66 +300,294 @@ void destroy_expr(Expr* expr) { case ExprType::Unreachable: break; } - delete expr; } -void destroy_func_declaration(FuncDeclaration* decl) { - destroy_var(&decl->type_var); - if (!(decl->flags & WABT_FUNC_DECLARATION_FLAG_SHARED_SIGNATURE)) - destroy_func_signature(&decl->sig); +// static +Expr* Expr::CreateBinary(Opcode opcode) { + Expr* expr = new Expr(ExprType::Binary); + expr->binary.opcode = opcode; + return expr; +} + +// static +Expr* Expr::CreateBlock(Block* block) { + Expr* expr = new Expr(ExprType::Block); + expr->block = block; + return expr; +} + +// static +Expr* Expr::CreateBr(Var var) { + Expr* expr = new Expr(ExprType::Br); + expr->br.var = var; + return expr; +} + +// static +Expr* Expr::CreateBrIf(Var var) { + Expr* expr = new Expr(ExprType::BrIf); + expr->br_if.var = var; + return expr; +} + +// static +Expr* Expr::CreateBrTable(VarVector* targets, Var default_target) { + Expr* expr = new Expr(ExprType::BrTable); + expr->br_table.targets = targets; + expr->br_table.default_target = default_target; + return expr; +} + +// static +Expr* Expr::CreateCall(Var var) { + Expr* expr = new Expr(ExprType::Call); + expr->call.var = var; + return expr; +} + +// static +Expr* Expr::CreateCallIndirect(Var var) { + Expr* expr = new Expr(ExprType::CallIndirect); + expr->call_indirect.var = var; + return expr; +} + +// static +Expr* Expr::CreateCompare(Opcode opcode) { + Expr* expr = new Expr(ExprType::Compare); + expr->compare.opcode = opcode; + return expr; +} + +// static +Expr* Expr::CreateConst(const Const& const_) { + Expr* expr = new Expr(ExprType::Const); + expr->const_ = const_; + return expr; +} + +// static +Expr* Expr::CreateConvert(Opcode opcode) { + Expr* expr = new Expr(ExprType::Convert); + expr->convert.opcode = opcode; + return expr; +} + +// static +Expr* Expr::CreateCurrentMemory() { + return new Expr(ExprType::CurrentMemory); +} + +// static +Expr* Expr::CreateDrop() { + return new Expr(ExprType::Drop); +} + +// static +Expr* Expr::CreateGetGlobal(Var var) { + Expr* expr = new Expr(ExprType::GetGlobal); + expr->get_global.var = var; + return expr; +} + +// static +Expr* Expr::CreateGetLocal(Var var) { + Expr* expr = new Expr(ExprType::GetLocal); + expr->get_local.var = var; + return expr; +} + +// static +Expr* Expr::CreateGrowMemory() { + return new Expr(ExprType::GrowMemory); +} + +// static +Expr* Expr::CreateIf(Block* true_, Expr* false_) { + Expr* expr = new Expr(ExprType::If); + expr->if_.true_ = true_; + expr->if_.false_ = false_; + return expr; +} + +// static +Expr* Expr::CreateLoad(Opcode opcode, uint32_t align, uint64_t offset) { + Expr* expr = new Expr(ExprType::Load); + expr->load.opcode = opcode; + expr->load.align = align; + expr->load.offset = offset; + return expr; +} + +// static +Expr* Expr::CreateLoop(Block* block) { + Expr* expr = new Expr(ExprType::Loop); + expr->loop = block; + return expr; +} + +// static +Expr* Expr::CreateNop() { + return new Expr(ExprType::Nop); +} + +// static +Expr* Expr::CreateReturn() { + return new Expr(ExprType::Return); +} + +// static +Expr* Expr::CreateSelect() { + return new Expr(ExprType::Select); +} + +// static +Expr* Expr::CreateSetGlobal(Var var) { + Expr* expr = new Expr(ExprType::SetGlobal); + expr->set_global.var = var; + return expr; +} + +// static +Expr* Expr::CreateSetLocal(Var var) { + Expr* expr = new Expr(ExprType::SetLocal); + expr->set_local.var = var; + return expr; +} + +// static +Expr* Expr::CreateStore(Opcode opcode, uint32_t align, uint64_t offset) { + Expr* expr = new Expr(ExprType::Store); + expr->store.opcode = opcode; + expr->store.align = align; + expr->store.offset = offset; + return expr; +} + +// static +Expr* Expr::CreateTeeLocal(Var var) { + Expr* expr = new Expr(ExprType::TeeLocal); + expr->tee_local.var = var; + return expr; +} + +// static +Expr* Expr::CreateUnary(Opcode opcode) { + Expr* expr = new Expr(ExprType::Unary); + expr->unary.opcode = opcode; + return expr; +} + +// static +Expr* Expr::CreateUnreachable() { + return new Expr(ExprType::Unreachable); +} + +FuncType::FuncType() { + WABT_ZERO_MEMORY(name); +} + +FuncType::~FuncType() { + destroy_string_slice(&name); +} + +FuncDeclaration::FuncDeclaration() : has_func_type(false) { + WABT_ZERO_MEMORY(type_var); +} + +FuncDeclaration::~FuncDeclaration() { + destroy_var(&type_var); } Func::Func() : first_expr(nullptr) { WABT_ZERO_MEMORY(name); - WABT_ZERO_MEMORY(decl); - WABT_ZERO_MEMORY(local_types); } Func::~Func() { destroy_string_slice(&name); - destroy_func_declaration(&decl); - destroy_type_vector(&local_types); destroy_expr_list(first_expr); } -void destroy_global(Global* global) { - destroy_string_slice(&global->name); - destroy_expr_list(global->init_expr); +Global::Global() : type(Type::Void), mutable_(false), init_expr(nullptr) { + WABT_ZERO_MEMORY(name); +} + +Global::~Global() { + destroy_string_slice(&name); + destroy_expr_list(init_expr); +} + +Table::Table() { + WABT_ZERO_MEMORY(name); + WABT_ZERO_MEMORY(elem_limits); } -void destroy_import(Import* import) { - destroy_string_slice(&import->module_name); - destroy_string_slice(&import->field_name); - switch (import->kind) { +Table::~Table() { + destroy_string_slice(&name); +} + +ElemSegment::ElemSegment() : offset(nullptr) { + WABT_ZERO_MEMORY(table_var); +} + +ElemSegment::~ElemSegment() { + destroy_var(&table_var); + destroy_expr_list(offset); + for (Var& var : vars) + destroy_var(&var); +} + +DataSegment::DataSegment() : offset(nullptr), data(nullptr), size(0) { + WABT_ZERO_MEMORY(memory_var); +} + +DataSegment::~DataSegment() { + destroy_var(&memory_var); + destroy_expr_list(offset); + delete [] data; +} + +Memory::Memory() { + WABT_ZERO_MEMORY(name); + WABT_ZERO_MEMORY(page_limits); +} + +Memory::~Memory() { + destroy_string_slice(&name); +} + +Import::Import() : kind(ExternalKind::Func), func(nullptr) { + WABT_ZERO_MEMORY(module_name); + WABT_ZERO_MEMORY(field_name); +} + +Import::~Import() { + destroy_string_slice(&module_name); + destroy_string_slice(&field_name); + switch (kind) { case ExternalKind::Func: - delete import->func; + delete func; break; case ExternalKind::Table: - destroy_table(&import->table); + delete table; break; case ExternalKind::Memory: - destroy_memory(&import->memory); + delete memory; break; case ExternalKind::Global: - destroy_global(&import->global); + delete global; break; } } -void destroy_export(Export* export_) { - destroy_string_slice(&export_->name); - destroy_var(&export_->var); -} - -void destroy_func_type(FuncType* func_type) { - destroy_string_slice(&func_type->name); - destroy_func_signature(&func_type->sig); +Export::Export() { + WABT_ZERO_MEMORY(name); + WABT_ZERO_MEMORY(var); } -void destroy_data_segment(DataSegment* data) { - destroy_var(&data->memory_var); - destroy_expr_list(data->offset); - delete [] data->data; +Export::~Export() { + destroy_string_slice(&name); + destroy_var(&var); } void destroy_memory(Memory* memory) { @@ -376,38 +598,42 @@ void destroy_table(Table* table) { destroy_string_slice(&table->name); } -static void destroy_module_field(ModuleField* field) { - switch (field->type) { +ModuleField::ModuleField() : type(ModuleFieldType::Start), next(nullptr) { + WABT_ZERO_MEMORY(loc); + WABT_ZERO_MEMORY(start); +} + +ModuleField::~ModuleField() { + switch (type) { case ModuleFieldType::Func: - delete field->func; + delete func; break; case ModuleFieldType::Global: - destroy_global(&field->global); + delete global; break; case ModuleFieldType::Import: - destroy_import(field->import); - delete field->import; + delete import; break; case ModuleFieldType::Export: - destroy_export(&field->export_); + delete export_; break; case ModuleFieldType::FuncType: - destroy_func_type(&field->func_type); + delete func_type; break; case ModuleFieldType::Table: - destroy_table(&field->table); + delete table; break; case ModuleFieldType::ElemSegment: - destroy_elem_segment(&field->elem_segment); + delete elem_segment; break; case ModuleFieldType::Memory: - destroy_memory(&field->memory); + delete memory; break; case ModuleFieldType::DataSegment: - destroy_data_segment(&field->data_segment); + delete data_segment; break; case ModuleFieldType::Start: - destroy_var(&field->start); + destroy_var(&start); break; } } @@ -422,15 +648,6 @@ Module::Module() start(0) { WABT_ZERO_MEMORY(loc); WABT_ZERO_MEMORY(name); - WABT_ZERO_MEMORY(funcs); - WABT_ZERO_MEMORY(globals); - WABT_ZERO_MEMORY(imports); - WABT_ZERO_MEMORY(exports); - WABT_ZERO_MEMORY(func_types); - WABT_ZERO_MEMORY(tables); - WABT_ZERO_MEMORY(elem_segments); - WABT_ZERO_MEMORY(memories); - WABT_ZERO_MEMORY(data_segments); } Module::~Module() { @@ -439,107 +656,89 @@ Module::~Module() { ModuleField* field = first_field; while (field) { ModuleField* next_field = field->next; - destroy_module_field(field); delete field; field = next_field; } +} - /* everything that follows shares data with the module fields above, so we - only need to destroy the containing vectors */ - destroy_func_ptr_vector(&funcs); - destroy_global_ptr_vector(&globals); - destroy_import_ptr_vector(&imports); - destroy_export_ptr_vector(&exports); - destroy_func_type_ptr_vector(&func_types); - destroy_table_ptr_vector(&tables); - destroy_elem_segment_ptr_vector(&elem_segments); - destroy_memory_ptr_vector(&memories); - destroy_data_segment_ptr_vector(&data_segments); -} - -void destroy_raw_module(RawModule* raw) { - if (raw->type == RawModuleType::Text) { - delete raw->text; +RawModule::RawModule() : type(RawModuleType::Text), text(nullptr) {} + +RawModule::~RawModule() { + if (type == RawModuleType::Text) { + delete text; } else { - destroy_string_slice(&raw->binary.name); - delete [] raw->binary.data; + destroy_string_slice(&binary.name); + delete [] binary.data; } } -void destroy_action(Action* action) { - destroy_var(&action->module_var); - switch (action->type) { +ActionInvoke::ActionInvoke() {} + +Action::Action() : type(ActionType::Get) { + 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: - destroy_string_slice(&action->invoke.name); - destroy_const_vector(&action->invoke.args); + delete invoke; break; case ActionType::Get: - destroy_string_slice(&action->get.name); break; } } -void destroy_command(Command* command) { - switch (command->type) { +Command::Command() : type(CommandType::Module), module(nullptr) {} + +Command::~Command() { + switch (type) { case CommandType::Module: - delete command->module; + delete module; break; case CommandType::Action: - destroy_action(&command->action); + delete action; break; case CommandType::Register: - destroy_string_slice(&command->register_.module_name); - destroy_var(&command->register_.var); + destroy_string_slice(®ister_.module_name); + destroy_var(®ister_.var); break; case CommandType::AssertMalformed: - destroy_raw_module(&command->assert_malformed.module); - destroy_string_slice(&command->assert_malformed.text); + delete assert_malformed.module; + destroy_string_slice(&assert_malformed.text); break; case CommandType::AssertInvalid: case CommandType::AssertInvalidNonBinary: - destroy_raw_module(&command->assert_invalid.module); - destroy_string_slice(&command->assert_invalid.text); + delete assert_invalid.module; + destroy_string_slice(&assert_invalid.text); break; case CommandType::AssertUnlinkable: - destroy_raw_module(&command->assert_unlinkable.module); - destroy_string_slice(&command->assert_unlinkable.text); + delete assert_unlinkable.module; + destroy_string_slice(&assert_unlinkable.text); break; case CommandType::AssertUninstantiable: - destroy_raw_module(&command->assert_uninstantiable.module); - destroy_string_slice(&command->assert_uninstantiable.text); + delete assert_uninstantiable.module; + destroy_string_slice(&assert_uninstantiable.text); break; case CommandType::AssertReturn: - destroy_action(&command->assert_return.action); - destroy_const_vector(&command->assert_return.expected); + delete assert_return.action; + delete assert_return.expected; break; case CommandType::AssertReturnNan: - destroy_action(&command->assert_return_nan.action); + delete assert_return_nan.action; break; case CommandType::AssertTrap: case CommandType::AssertExhaustion: - destroy_action(&command->assert_trap.action); - destroy_string_slice(&command->assert_trap.text); + delete assert_trap.action; + destroy_string_slice(&assert_trap.text); break; } } -void destroy_command_vector_and_elements(CommandVector* commands) { - WABT_DESTROY_VECTOR_AND_ELEMENTS(*commands, command); -} - -void destroy_elem_segment(ElemSegment* elem) { - destroy_var(&elem->table_var); - destroy_expr_list(elem->offset); - WABT_DESTROY_VECTOR_AND_ELEMENTS(elem->vars, var); -} - -Script::Script() { - WABT_ZERO_MEMORY(commands); -} - -Script::~Script() { - WABT_DESTROY_VECTOR_AND_ELEMENTS(commands, command); -} +Script::Script() {} #define CHECK_RESULT(expr) \ do { \ @@ -568,7 +767,7 @@ static Result visit_expr(Expr* expr, ExprVisitor* visitor) { case ExprType::Block: CALLBACK(begin_block_expr); - CHECK_RESULT(visit_expr_list(expr->block.first, visitor)); + CHECK_RESULT(visit_expr_list(expr->block->first, visitor)); CALLBACK(end_block_expr); break; @@ -626,7 +825,7 @@ static Result visit_expr(Expr* expr, ExprVisitor* visitor) { case ExprType::If: CALLBACK(begin_if_expr); - CHECK_RESULT(visit_expr_list(expr->if_.true_.first, visitor)); + CHECK_RESULT(visit_expr_list(expr->if_.true_->first, visitor)); CALLBACK(after_if_true_expr); CHECK_RESULT(visit_expr_list(expr->if_.false_, visitor)); CALLBACK(end_if_expr); @@ -638,7 +837,7 @@ static Result visit_expr(Expr* expr, ExprVisitor* visitor) { case ExprType::Loop: CALLBACK(begin_loop_expr); - CHECK_RESULT(visit_expr_list(expr->loop.first, visitor)); + CHECK_RESULT(visit_expr_list(expr->loop->first, visitor)); CALLBACK(end_loop_expr); break; |