diff options
Diffstat (limited to 'src/binary-reader-ast.cc')
-rw-r--r-- | src/binary-reader-ast.cc | 447 |
1 files changed, 157 insertions, 290 deletions
diff --git a/src/binary-reader-ast.cc b/src/binary-reader-ast.cc index 68185eb9..39c9e8fa 100644 --- a/src/binary-reader-ast.cc +++ b/src/binary-reader-ast.cc @@ -22,6 +22,8 @@ #include <stdint.h> #include <stdio.h> +#include <vector> + #include "ast.h" #include "binary-reader.h" #include "common.h" @@ -37,20 +39,24 @@ namespace wabt { namespace { struct LabelNode { + LabelNode(LabelType, Expr** first); + LabelType label_type; Expr** first; Expr* last; }; -WABT_DEFINE_VECTOR(label_node, LabelNode); + +LabelNode::LabelNode(LabelType label_type, Expr** first) + : label_type(label_type), first(first), last(nullptr) {} struct Context { - BinaryErrorHandler* error_handler; - Module* module; + BinaryErrorHandler* error_handler = nullptr; + Module* module = nullptr; - Func* current_func; - LabelNodeVector label_stack; - uint32_t max_depth; - Expr** current_init_expr; + Func* current_func = nullptr; + std::vector<LabelNode> label_stack; + uint32_t max_depth = 0; + Expr** current_init_expr = nullptr; }; } // namespace @@ -64,33 +70,29 @@ static void WABT_PRINTF_FORMAT(2, 3) } static void push_label(Context* ctx, LabelType label_type, Expr** first) { - LabelNode label; - label.label_type = label_type; - label.first = first; - label.last = nullptr; ctx->max_depth++; - append_label_node_value(&ctx->label_stack, &label); + ctx->label_stack.emplace_back(label_type, first); } static Result pop_label(Context* ctx) { - if (ctx->label_stack.size == 0) { + if (ctx->label_stack.size() == 0) { print_error(ctx, "popping empty label stack"); return Result::Error; } ctx->max_depth--; - ctx->label_stack.size--; + ctx->label_stack.pop_back(); return Result::Ok; } static Result get_label_at(Context* ctx, LabelNode** label, uint32_t depth) { - if (depth >= ctx->label_stack.size) { + if (depth >= ctx->label_stack.size()) { print_error(ctx, "accessing stack depth: %u >= max: %" PRIzd, depth, - ctx->label_stack.size); + ctx->label_stack.size()); return Result::Error; } - *label = &ctx->label_stack.data[ctx->label_stack.size - depth - 1]; + *label = &ctx->label_stack[ctx->label_stack.size() - depth - 1]; return Result::Ok; } @@ -128,7 +130,7 @@ static bool on_error(BinaryReaderContext* reader_context, const char* message) { static Result on_signature_count(uint32_t count, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - reserve_func_type_ptrs(&ctx->module->func_types, count); + ctx->module->func_types.reserve(count); return Result::Ok; } @@ -141,29 +143,18 @@ static Result on_signature(uint32_t index, Context* ctx = static_cast<Context*>(user_data); ModuleField* field = append_module_field(ctx->module); field->type = ModuleFieldType::FuncType; + field->func_type = new FuncType(); - FuncType* func_type = &field->func_type; - WABT_ZERO_MEMORY(*func_type); - - reserve_types(&func_type->sig.param_types, param_count); - func_type->sig.param_types.size = param_count; - memcpy(func_type->sig.param_types.data, param_types, - param_count * sizeof(Type)); - - reserve_types(&func_type->sig.result_types, result_count); - func_type->sig.result_types.size = result_count; - memcpy(func_type->sig.result_types.data, result_types, - result_count * sizeof(Type)); - - assert(index < ctx->module->func_types.capacity); - FuncTypePtr* func_type_ptr = append_func_type_ptr(&ctx->module->func_types); - *func_type_ptr = func_type; + FuncType* func_type = field->func_type; + func_type->sig.param_types.assign(param_types, param_types + param_count); + func_type->sig.result_types.assign(result_types, result_types + result_count); + ctx->module->func_types.push_back(func_type); return Result::Ok; } static Result on_import_count(uint32_t count, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - reserve_import_ptrs(&ctx->module->imports, count); + ctx->module->imports.reserve(count); return Result::Ok; } @@ -172,7 +163,6 @@ static Result on_import(uint32_t index, StringSlice field_name, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - assert(index < ctx->module->imports.capacity); ModuleField* field = append_module_field(ctx->module); field->type = ModuleFieldType::Import; @@ -181,9 +171,7 @@ static Result on_import(uint32_t index, Import* import = field->import; import->module_name = dup_string_slice(module_name); import->field_name = dup_string_slice(field_name); - - ImportPtr* import_ptr = append_import_ptr(&ctx->module->imports); - *import_ptr = import; + ctx->module->imports.push_back(import); return Result::Ok; } @@ -194,20 +182,17 @@ static Result on_import_func(uint32_t import_index, uint32_t sig_index, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - assert(import_index == ctx->module->imports.size - 1); - assert(sig_index < ctx->module->func_types.size); - Import* import = ctx->module->imports.data[import_index]; + assert(import_index == ctx->module->imports.size() - 1); + Import* import = ctx->module->imports[import_index]; import->kind = ExternalKind::Func; import->func = new Func(); - import->func->decl.flags = WABT_FUNC_DECLARATION_FLAG_HAS_FUNC_TYPE | - WABT_FUNC_DECLARATION_FLAG_SHARED_SIGNATURE; + import->func->decl.has_func_type = true; import->func->decl.type_var.type = VarType::Index; import->func->decl.type_var.index = sig_index; - import->func->decl.sig = ctx->module->func_types.data[sig_index]->sig; + import->func->decl.sig = ctx->module->func_types[sig_index]->sig; - FuncPtr func_ptr = import->func; - append_func_ptr_value(&ctx->module->funcs, &func_ptr); + ctx->module->funcs.push_back(import->func); ctx->module->num_func_imports++; return Result::Ok; } @@ -220,13 +205,12 @@ static Result on_import_table(uint32_t import_index, const Limits* elem_limits, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - assert(import_index == ctx->module->imports.size - 1); - Import* import = ctx->module->imports.data[import_index]; + assert(import_index == ctx->module->imports.size() - 1); + Import* import = ctx->module->imports[import_index]; import->kind = ExternalKind::Table; - import->table.elem_limits = *elem_limits; - - TablePtr table_ptr = &import->table; - append_table_ptr_value(&ctx->module->tables, &table_ptr); + import->table = new Table(); + import->table->elem_limits = *elem_limits; + ctx->module->tables.push_back(import->table); ctx->module->num_table_imports++; return Result::Ok; } @@ -238,13 +222,12 @@ static Result on_import_memory(uint32_t import_index, const Limits* page_limits, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - assert(import_index == ctx->module->imports.size - 1); - Import* import = ctx->module->imports.data[import_index]; + assert(import_index == ctx->module->imports.size() - 1); + Import* import = ctx->module->imports[import_index]; import->kind = ExternalKind::Memory; - import->memory.page_limits = *page_limits; - - MemoryPtr memory_ptr = &import->memory; - append_memory_ptr_value(&ctx->module->memories, &memory_ptr); + import->memory = new Memory(); + import->memory->page_limits = *page_limits; + ctx->module->memories.push_back(import->memory); ctx->module->num_memory_imports++; return Result::Ok; } @@ -257,21 +240,20 @@ static Result on_import_global(uint32_t import_index, bool mutable_, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - assert(import_index == ctx->module->imports.size - 1); - Import* import = ctx->module->imports.data[import_index]; + assert(import_index == ctx->module->imports.size() - 1); + Import* import = ctx->module->imports[import_index]; import->kind = ExternalKind::Global; - import->global.type = type; - import->global.mutable_ = mutable_; - - GlobalPtr global_ptr = &import->global; - append_global_ptr_value(&ctx->module->globals, &global_ptr); + import->global = new Global(); + import->global->type = type; + import->global->mutable_ = mutable_; + ctx->module->globals.push_back(import->global); ctx->module->num_global_imports++; return Result::Ok; } static Result on_function_signatures_count(uint32_t count, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - reserve_func_ptrs(&ctx->module->funcs, ctx->module->num_func_imports + count); + ctx->module->funcs.reserve(ctx->module->num_func_imports + count); return Result::Ok; } @@ -279,29 +261,24 @@ static Result on_function_signature(uint32_t index, uint32_t sig_index, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - assert(index < ctx->module->funcs.capacity); - assert(sig_index < ctx->module->func_types.size); ModuleField* field = append_module_field(ctx->module); field->type = ModuleFieldType::Func; field->func = new Func(); Func* func = field->func; - func->decl.flags = WABT_FUNC_DECLARATION_FLAG_HAS_FUNC_TYPE | - WABT_FUNC_DECLARATION_FLAG_SHARED_SIGNATURE; + func->decl.has_func_type = true; func->decl.type_var.type = VarType::Index; func->decl.type_var.index = sig_index; - func->decl.sig = ctx->module->func_types.data[sig_index]->sig; + func->decl.sig = ctx->module->func_types[sig_index]->sig; - FuncPtr* func_ptr = append_func_ptr(&ctx->module->funcs); - *func_ptr = func; + ctx->module->funcs.push_back(func); return Result::Ok; } static Result on_table_count(uint32_t count, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - reserve_table_ptrs(&ctx->module->tables, - ctx->module->num_table_imports + count); + ctx->module->tables.reserve(ctx->module->num_table_imports + count); return Result::Ok; } @@ -310,24 +287,18 @@ static Result on_table(uint32_t index, const Limits* elem_limits, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - assert(index < ctx->module->tables.capacity); ModuleField* field = append_module_field(ctx->module); field->type = ModuleFieldType::Table; - - Table* table = &field->table; - WABT_ZERO_MEMORY(*table); - table->elem_limits = *elem_limits; - - TablePtr* table_ptr = append_table_ptr(&ctx->module->tables); - *table_ptr = table; + field->table = new Table(); + field->table->elem_limits = *elem_limits; + ctx->module->tables.push_back(field->table); return Result::Ok; } static Result on_memory_count(uint32_t count, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - reserve_memory_ptrs(&ctx->module->memories, - ctx->module->num_memory_imports + count); + ctx->module->memories.reserve(ctx->module->num_memory_imports + count); return Result::Ok; } @@ -335,24 +306,18 @@ static Result on_memory(uint32_t index, const Limits* page_limits, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - assert(index < ctx->module->memories.capacity); ModuleField* field = append_module_field(ctx->module); field->type = ModuleFieldType::Memory; - - Memory* memory = &field->memory; - WABT_ZERO_MEMORY(*memory); - memory->page_limits = *page_limits; - - MemoryPtr* memory_ptr = append_memory_ptr(&ctx->module->memories); - *memory_ptr = memory; + field->memory = new Memory(); + field->memory->page_limits = *page_limits; + ctx->module->memories.push_back(field->memory); return Result::Ok; } static Result on_global_count(uint32_t count, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - reserve_global_ptrs(&ctx->module->globals, - ctx->module->num_global_imports + count); + ctx->module->globals.reserve(ctx->module->num_global_imports + count); return Result::Ok; } @@ -361,25 +326,20 @@ static Result begin_global(uint32_t index, bool mutable_, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - assert(index < ctx->module->globals.capacity); ModuleField* field = append_module_field(ctx->module); field->type = ModuleFieldType::Global; - - Global* global = &field->global; - WABT_ZERO_MEMORY(*global); - global->type = type; - global->mutable_ = mutable_; - - GlobalPtr* global_ptr = append_global_ptr(&ctx->module->globals); - *global_ptr = global; + field->global = new Global(); + field->global->type = type; + field->global->mutable_ = mutable_; + ctx->module->globals.push_back(field->global); return Result::Ok; } static Result begin_global_init_expr(uint32_t index, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - assert(index == ctx->module->globals.size - 1); - Global* global = ctx->module->globals.data[index]; + assert(index == ctx->module->globals.size() - 1); + Global* global = ctx->module->globals[index]; ctx->current_init_expr = &global->init_expr; return Result::Ok; } @@ -392,7 +352,7 @@ static Result end_global_init_expr(uint32_t index, void* user_data) { static Result on_export_count(uint32_t count, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - reserve_export_ptrs(&ctx->module->exports, count); + ctx->module->exports.reserve(count); return Result::Ok; } @@ -404,31 +364,28 @@ static Result on_export(uint32_t index, Context* ctx = static_cast<Context*>(user_data); ModuleField* field = append_module_field(ctx->module); field->type = ModuleFieldType::Export; + field->export_ = new Export(); - Export* export_ = &field->export_; - WABT_ZERO_MEMORY(*export_); + Export* export_ = field->export_; export_->name = dup_string_slice(name); switch (kind) { case ExternalKind::Func: - assert(item_index < ctx->module->funcs.size); + assert(item_index < ctx->module->funcs.size()); break; case ExternalKind::Table: - assert(item_index < ctx->module->tables.size); + assert(item_index < ctx->module->tables.size()); break; case ExternalKind::Memory: - assert(item_index < ctx->module->memories.size); + assert(item_index < ctx->module->memories.size()); break; case ExternalKind::Global: - assert(item_index < ctx->module->globals.size); + assert(item_index < ctx->module->globals.size()); break; } export_->var.type = VarType::Index; export_->var.index = item_index; export_->kind = kind; - - assert(index < ctx->module->exports.capacity); - ExportPtr* export_ptr = append_export_ptr(&ctx->module->exports); - *export_ptr = export_; + ctx->module->exports.push_back(export_); return Result::Ok; } @@ -438,7 +395,7 @@ static Result on_start_function(uint32_t func_index, void* user_data) { field->type = ModuleFieldType::Start; field->start.type = VarType::Index; - assert(func_index < ctx->module->funcs.size); + assert(func_index < ctx->module->funcs.size()); field->start.index = func_index; ctx->module->start = &field->start; @@ -447,7 +404,7 @@ static Result on_start_function(uint32_t func_index, void* user_data) { static Result on_function_bodies_count(uint32_t count, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - assert(ctx->module->num_func_imports + count == ctx->module->funcs.size); + assert(ctx->module->num_func_imports + count == ctx->module->funcs.size()); WABT_USE(ctx); return Result::Ok; } @@ -455,8 +412,7 @@ static Result on_function_bodies_count(uint32_t count, void* user_data) { static Result begin_function_body(BinaryReaderContext* context, uint32_t index) { Context* ctx = static_cast<Context*>(context->user_data); - assert(index < ctx->module->funcs.size); - ctx->current_func = ctx->module->funcs.data[index]; + ctx->current_func = ctx->module->funcs[index]; push_label(ctx, LabelType::Func, &ctx->current_func->first_expr); return Result::Ok; } @@ -466,20 +422,16 @@ static Result on_local_decl(uint32_t decl_index, Type type, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - size_t old_local_count = ctx->current_func->local_types.size; - size_t new_local_count = old_local_count + count; - reserve_types(&ctx->current_func->local_types, new_local_count); - TypeVector* types = &ctx->current_func->local_types; + TypeVector& types = ctx->current_func->local_types; + types.reserve(types.size() + count); for (size_t i = 0; i < count; ++i) - types->data[old_local_count + i] = type; - types->size = new_local_count; + types.push_back(type); return Result::Ok; } static Result on_binary_expr(Opcode opcode, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_binary_expr(); - expr->binary.opcode = opcode; + Expr* expr = Expr::CreateBinary(opcode); return append_expr(ctx, expr); } @@ -487,30 +439,22 @@ static Result on_block_expr(uint32_t num_types, Type* sig_types, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_block_expr(); - TypeVector src; - WABT_ZERO_MEMORY(src); - src.size = num_types; - src.data = sig_types; - extend_types(&expr->block.sig, &src); + Expr* expr = Expr::CreateBlock(new Block()); + expr->block->sig.assign(sig_types, sig_types + num_types); append_expr(ctx, expr); - push_label(ctx, LabelType::Block, &expr->block.first); + push_label(ctx, LabelType::Block, &expr->block->first); return Result::Ok; } static Result on_br_expr(uint32_t depth, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_br_expr(); - expr->br.var.type = VarType::Index; - expr->br.var.index = depth; + Expr* expr = Expr::CreateBr(Var(depth)); return append_expr(ctx, expr); } static Result on_br_if_expr(uint32_t depth, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_br_if_expr(); - expr->br_if.var.type = VarType::Index; - expr->br_if.var.index = depth; + Expr* expr = Expr::CreateBrIf(Var(depth)); return append_expr(ctx, expr); } @@ -519,60 +463,50 @@ static Result on_br_table_expr(BinaryReaderContext* context, uint32_t* target_depths, uint32_t default_target_depth) { Context* ctx = static_cast<Context*>(context->user_data); - Expr* expr = new_br_table_expr(); - reserve_vars(&expr->br_table.targets, num_targets); - expr->br_table.targets.size = num_targets; + VarVector* targets = new VarVector(); + targets->resize(num_targets); for (uint32_t i = 0; i < num_targets; ++i) { - Var* var = &expr->br_table.targets.data[i]; - var->type = VarType::Index; - var->index = target_depths[i]; + (*targets)[i] = Var(target_depths[i]); } - expr->br_table.default_target.type = VarType::Index; - expr->br_table.default_target.index = default_target_depth; + Expr* expr = Expr::CreateBrTable(targets, Var(default_target_depth)); return append_expr(ctx, expr); } static Result on_call_expr(uint32_t func_index, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - assert(func_index < ctx->module->funcs.size); - Expr* expr = new_call_expr(); - expr->call.var.type = VarType::Index; - expr->call.var.index = func_index; + assert(func_index < ctx->module->funcs.size()); + Expr* expr = Expr::CreateCall(Var(func_index)); return append_expr(ctx, expr); } static Result on_call_indirect_expr(uint32_t sig_index, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - assert(sig_index < ctx->module->func_types.size); - Expr* expr = new_call_indirect_expr(); - expr->call_indirect.var.type = VarType::Index; - expr->call_indirect.var.index = sig_index; + assert(sig_index < ctx->module->func_types.size()); + Expr* expr = Expr::CreateCallIndirect(Var(sig_index)); return append_expr(ctx, expr); } static Result on_compare_expr(Opcode opcode, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_compare_expr(); - expr->compare.opcode = opcode; + Expr* expr = Expr::CreateCompare(opcode); return append_expr(ctx, expr); } static Result on_convert_expr(Opcode opcode, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_convert_expr(); - expr->convert.opcode = opcode; + Expr* expr = Expr::CreateConvert(opcode); return append_expr(ctx, expr); } static Result on_current_memory_expr(void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_current_memory_expr(); + Expr* expr = Expr::CreateCurrentMemory(); return append_expr(ctx, expr); } static Result on_drop_expr(void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_drop_expr(); + Expr* expr = Expr::CreateDrop(); return append_expr(ctx, expr); } @@ -602,68 +536,53 @@ static Result on_end_expr(void* user_data) { static Result on_f32_const_expr(uint32_t value_bits, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_const_expr(); - expr->const_.type = Type::F32; - expr->const_.f32_bits = value_bits; + Expr* expr = Expr::CreateConst(Const(Const::F32(), value_bits)); return append_expr(ctx, expr); } static Result on_f64_const_expr(uint64_t value_bits, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_const_expr(); - expr->const_.type = Type::F64; - expr->const_.f64_bits = value_bits; + Expr* expr = Expr::CreateConst(Const(Const::F64(), value_bits)); return append_expr(ctx, expr); } static Result on_get_global_expr(uint32_t global_index, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_get_global_expr(); - expr->get_global.var.type = VarType::Index; - expr->get_global.var.index = global_index; + Expr* expr = Expr::CreateGetGlobal(Var(global_index)); return append_expr(ctx, expr); } static Result on_get_local_expr(uint32_t local_index, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_get_local_expr(); - expr->get_local.var.type = VarType::Index; - expr->get_local.var.index = local_index; + Expr* expr = Expr::CreateGetLocal(Var(local_index)); return append_expr(ctx, expr); } static Result on_grow_memory_expr(void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_grow_memory_expr(); + Expr* expr = Expr::CreateGrowMemory(); return append_expr(ctx, expr); } static Result on_i32_const_expr(uint32_t value, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_const_expr(); - expr->const_.type = Type::I32; - expr->const_.u32 = value; + Expr* expr = Expr::CreateConst(Const(Const::I32(), value)); return append_expr(ctx, expr); } static Result on_i64_const_expr(uint64_t value, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_const_expr(); - expr->const_.type = Type::I64; - expr->const_.u64 = value; + Expr* expr = Expr::CreateConst(Const(Const::I64(), value)); return append_expr(ctx, expr); } static Result on_if_expr(uint32_t num_types, Type* sig_types, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_if_expr(); - TypeVector src; - WABT_ZERO_MEMORY(src); - src.size = num_types; - src.data = sig_types; - extend_types(&expr->if_.true_.sig, &src); + Expr* expr = Expr::CreateIf(new Block()); + expr->if_.true_->sig.assign(sig_types, sig_types + num_types); + expr->if_.false_ = nullptr; append_expr(ctx, expr); - push_label(ctx, LabelType::If, &expr->if_.true_.first); + push_label(ctx, LabelType::If, &expr->if_.true_->first); return Result::Ok; } @@ -672,10 +591,7 @@ static Result on_load_expr(Opcode opcode, uint32_t offset, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_load_expr(); - expr->load.opcode = opcode; - expr->load.align = 1 << alignment_log2; - expr->load.offset = offset; + Expr* expr = Expr::CreateLoad(opcode, 1 << alignment_log2, offset); return append_expr(ctx, expr); } @@ -683,48 +599,40 @@ static Result on_loop_expr(uint32_t num_types, Type* sig_types, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_loop_expr(); - TypeVector src; - WABT_ZERO_MEMORY(src); - src.size = num_types; - src.data = sig_types; - extend_types(&expr->loop.sig, &src); + Expr* expr = Expr::CreateLoop(new Block()); + expr->loop->sig.assign(sig_types, sig_types + num_types); append_expr(ctx, expr); - push_label(ctx, LabelType::Loop, &expr->loop.first); + push_label(ctx, LabelType::Loop, &expr->loop->first); return Result::Ok; } static Result on_nop_expr(void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_nop_expr(); + Expr* expr = Expr::CreateNop(); return append_expr(ctx, expr); } static Result on_return_expr(void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_return_expr(); + Expr* expr = Expr::CreateReturn(); return append_expr(ctx, expr); } static Result on_select_expr(void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_select_expr(); + Expr* expr = Expr::CreateSelect(); return append_expr(ctx, expr); } static Result on_set_global_expr(uint32_t global_index, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_set_global_expr(); - expr->set_global.var.type = VarType::Index; - expr->set_global.var.index = global_index; + Expr* expr = Expr::CreateSetGlobal(Var(global_index)); return append_expr(ctx, expr); } static Result on_set_local_expr(uint32_t local_index, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_set_local_expr(); - expr->set_local.var.type = VarType::Index; - expr->set_local.var.index = local_index; + Expr* expr = Expr::CreateSetLocal(Var(local_index)); return append_expr(ctx, expr); } @@ -733,31 +641,25 @@ static Result on_store_expr(Opcode opcode, uint32_t offset, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_store_expr(); - expr->store.opcode = opcode; - expr->store.align = 1 << alignment_log2; - expr->store.offset = offset; + Expr* expr = Expr::CreateStore(opcode, 1 << alignment_log2, offset); return append_expr(ctx, expr); } static Result on_tee_local_expr(uint32_t local_index, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_tee_local_expr(); - expr->tee_local.var.type = VarType::Index; - expr->tee_local.var.index = local_index; + Expr* expr = Expr::CreateTeeLocal(Var(local_index)); return append_expr(ctx, expr); } static Result on_unary_expr(Opcode opcode, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_unary_expr(); - expr->unary.opcode = opcode; + Expr* expr = Expr::CreateUnary(opcode); return append_expr(ctx, expr); } static Result on_unreachable_expr(void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_unreachable_expr(); + Expr* expr = Expr::CreateUnreachable(); return append_expr(ctx, expr); } @@ -770,7 +672,7 @@ static Result end_function_body(uint32_t index, void* user_data) { static Result on_elem_segment_count(uint32_t count, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - reserve_elem_segment_ptrs(&ctx->module->elem_segments, count); + ctx->module->elem_segments.reserve(count); return Result::Ok; } @@ -780,24 +682,17 @@ static Result begin_elem_segment(uint32_t index, Context* ctx = static_cast<Context*>(user_data); ModuleField* field = append_module_field(ctx->module); field->type = ModuleFieldType::ElemSegment; - - ElemSegment* segment = &field->elem_segment; - WABT_ZERO_MEMORY(*segment); - segment->table_var.type = VarType::Index; - segment->table_var.index = table_index; - - assert(index == ctx->module->elem_segments.size); - assert(index < ctx->module->elem_segments.capacity); - ElemSegmentPtr* segment_ptr = - append_elem_segment_ptr(&ctx->module->elem_segments); - *segment_ptr = segment; + field->elem_segment = new ElemSegment(); + field->elem_segment->table_var.type = VarType::Index; + field->elem_segment->table_var.index = table_index; + ctx->module->elem_segments.push_back(field->elem_segment); return Result::Ok; } static Result begin_elem_segment_init_expr(uint32_t index, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - assert(index == ctx->module->elem_segments.size - 1); - ElemSegment* segment = ctx->module->elem_segments.data[index]; + assert(index == ctx->module->elem_segments.size() - 1); + ElemSegment* segment = ctx->module->elem_segments[index]; ctx->current_init_expr = &segment->offset; return Result::Ok; } @@ -812,9 +707,9 @@ static Result on_elem_segment_function_index_count(BinaryReaderContext* context, uint32_t index, uint32_t count) { Context* ctx = static_cast<Context*>(context->user_data); - assert(index == ctx->module->elem_segments.size - 1); - ElemSegment* segment = ctx->module->elem_segments.data[index]; - reserve_vars(&segment->vars, count); + assert(index == ctx->module->elem_segments.size() - 1); + ElemSegment* segment = ctx->module->elem_segments[index]; + segment->vars.reserve(count); return Result::Ok; } @@ -822,9 +717,10 @@ static Result on_elem_segment_function_index(uint32_t index, uint32_t func_index, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - assert(index == ctx->module->elem_segments.size - 1); - ElemSegment* segment = ctx->module->elem_segments.data[index]; - Var* var = append_var(&segment->vars); + assert(index == ctx->module->elem_segments.size() - 1); + ElemSegment* segment = ctx->module->elem_segments[index]; + segment->vars.emplace_back(); + Var* var = &segment->vars.back(); var->type = VarType::Index; var->index = func_index; return Result::Ok; @@ -832,7 +728,7 @@ static Result on_elem_segment_function_index(uint32_t index, static Result on_data_segment_count(uint32_t count, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - reserve_data_segment_ptrs(&ctx->module->data_segments, count); + ctx->module->data_segments.reserve(count); return Result::Ok; } @@ -842,24 +738,17 @@ static Result begin_data_segment(uint32_t index, Context* ctx = static_cast<Context*>(user_data); ModuleField* field = append_module_field(ctx->module); field->type = ModuleFieldType::DataSegment; - - DataSegment* segment = &field->data_segment; - WABT_ZERO_MEMORY(*segment); - segment->memory_var.type = VarType::Index; - segment->memory_var.index = memory_index; - - assert(index == ctx->module->data_segments.size); - assert(index < ctx->module->data_segments.capacity); - DataSegmentPtr* segment_ptr = - append_data_segment_ptr(&ctx->module->data_segments); - *segment_ptr = segment; + field->data_segment = new DataSegment(); + field->data_segment->memory_var.type = VarType::Index; + field->data_segment->memory_var.index = memory_index; + ctx->module->data_segments.push_back(field->data_segment); return Result::Ok; } static Result begin_data_segment_init_expr(uint32_t index, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - assert(index == ctx->module->data_segments.size - 1); - DataSegment* segment = ctx->module->data_segments.data[index]; + assert(index == ctx->module->data_segments.size() - 1); + DataSegment* segment = ctx->module->data_segments[index]; ctx->current_init_expr = &segment->offset; return Result::Ok; } @@ -875,8 +764,8 @@ static Result on_data_segment_data(uint32_t index, uint32_t size, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - assert(index == ctx->module->data_segments.size - 1); - DataSegment* segment = ctx->module->data_segments.data[index]; + assert(index == ctx->module->data_segments.size() - 1); + DataSegment* segment = ctx->module->data_segments[index]; segment->data = new char[size]; segment->size = size; memcpy(segment->data, data, size); @@ -885,10 +774,10 @@ static Result on_data_segment_data(uint32_t index, static Result on_function_names_count(uint32_t count, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - if (count > ctx->module->funcs.size) { + if (count > ctx->module->funcs.size()) { print_error( ctx, "expected function name count (%u) <= function count (%" PRIzd ")", - count, ctx->module->funcs.size); + count, ctx->module->funcs.size()); return Result::Error; } return Result::Ok; @@ -903,7 +792,7 @@ static Result on_function_name(uint32_t index, Context* ctx = static_cast<Context*>(user_data); ctx->module->func_bindings.emplace(string_slice_to_string(name), Binding(index)); - Func* func = ctx->module->funcs.data[index]; + Func* func = ctx->module->funcs[index]; func->name = dup_string_slice(name); return Result::Ok; } @@ -913,8 +802,8 @@ static Result on_local_name_local_count(uint32_t index, void* user_data) { Context* ctx = static_cast<Context*>(user_data); Module* module = ctx->module; - assert(index < module->funcs.size); - Func* func = module->funcs.data[index]; + assert(index < module->funcs.size()); + Func* func = module->funcs[index]; uint32_t num_params_and_locals = get_num_params_and_locals(func); if (count > num_params_and_locals) { print_error(ctx, "expected local name count (%d) <= local count (%d)", @@ -928,10 +817,7 @@ static Result on_init_expr_f32_const_expr(uint32_t index, uint32_t value, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_const_expr(); - expr->const_.type = Type::F32; - expr->const_.f32_bits = value; - *ctx->current_init_expr = expr; + *ctx->current_init_expr = Expr::CreateConst(Const(Const::F32(), value)); return Result::Ok; } @@ -939,10 +825,7 @@ static Result on_init_expr_f64_const_expr(uint32_t index, uint64_t value, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_const_expr(); - expr->const_.type = Type::F64; - expr->const_.f64_bits = value; - *ctx->current_init_expr = expr; + *ctx->current_init_expr = Expr::CreateConst(Const(Const::F64(), value)); return Result::Ok; } @@ -950,10 +833,7 @@ static Result on_init_expr_get_global_expr(uint32_t index, uint32_t global_index, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_get_global_expr(); - expr->get_global.var.type = VarType::Index; - expr->get_global.var.index = global_index; - *ctx->current_init_expr = expr; + *ctx->current_init_expr = Expr::CreateGetGlobal(Var(global_index)); return Result::Ok; } @@ -961,10 +841,7 @@ static Result on_init_expr_i32_const_expr(uint32_t index, uint32_t value, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_const_expr(); - expr->const_.type = Type::I32; - expr->const_.u32 = value; - *ctx->current_init_expr = expr; + *ctx->current_init_expr = Expr::CreateConst(Const(Const::I32(), value)); return Result::Ok; } @@ -972,10 +849,7 @@ static Result on_init_expr_i64_const_expr(uint32_t index, uint64_t value, void* user_data) { Context* ctx = static_cast<Context*>(user_data); - Expr* expr = new_const_expr(); - expr->const_.type = Type::I64; - expr->const_.u64 = value; - *ctx->current_init_expr = expr; + *ctx->current_init_expr = Expr::CreateConst(Const(Const::I64(), value)); return Result::Ok; } @@ -988,7 +862,7 @@ static Result on_local_name(uint32_t func_index, Context* ctx = static_cast<Context*>(user_data); Module* module = ctx->module; - Func* func = module->funcs.data[func_index]; + Func* func = module->funcs[func_index]; uint32_t num_params = get_num_params(func); BindingHash* bindings; uint32_t index; @@ -1005,18 +879,12 @@ static Result on_local_name(uint32_t func_index, return Result::Ok; } -static void destroy_label_node(LabelNode* node) { - if (*node->first) - destroy_expr_list(*node->first); -} - Result read_binary_ast(const void* data, size_t size, const ReadBinaryOptions* options, BinaryErrorHandler* error_handler, struct Module* out_module) { Context ctx; - WABT_ZERO_MEMORY(ctx); ctx.error_handler = error_handler; ctx.module = out_module; @@ -1117,7 +985,6 @@ Result read_binary_ast(const void* data, reader.on_init_expr_i64_const_expr = on_init_expr_i64_const_expr; Result result = read_binary(data, size, &reader, 1, options); - WABT_DESTROY_VECTOR_AND_ELEMENTS(ctx.label_stack, label_node); return result; } |