From: Brendan Hansen Date: Sun, 26 Feb 2023 19:18:31 +0000 (-0600) Subject: bugfix: return from expression with stray values X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=7b19dbb27f7d5af7860fb5fd68a71915bcca2533;p=onyx.git bugfix: return from expression with stray values --- diff --git a/interpreter/include/vm_codebuilder.h b/interpreter/include/vm_codebuilder.h index 62621dd5..ff6ee54d 100644 --- a/interpreter/include/vm_codebuilder.h +++ b/interpreter/include/vm_codebuilder.h @@ -19,7 +19,7 @@ struct ovm_code_builder_t { bh_arr(label_target_t) label_stack; bh_arr(branch_patch_t) branch_patches; - i32 param_count, local_count; + i32 param_count, result_count, local_count; ovm_program_t *program; i32 start_instr; @@ -59,7 +59,7 @@ struct branch_patch_t { bool targets_else; }; -ovm_code_builder_t ovm_code_builder_new(ovm_program_t *program, debug_info_builder_t *debug, i32 param_count, i32 local_count); +ovm_code_builder_t ovm_code_builder_new(ovm_program_t *program, debug_info_builder_t *debug, i32 param_count, i32 result_count, i32 local_count); label_target_t ovm_code_builder_wasm_target_idx(ovm_code_builder_t *builder, i32 idx); i32 ovm_code_builder_push_label_target(ovm_code_builder_t *builder, label_kind_t kind); void ovm_code_builder_pop_label_target(ovm_code_builder_t *builder); diff --git a/interpreter/src/vm/code_builder.c b/interpreter/src/vm/code_builder.c index 6296d97e..f408778b 100644 --- a/interpreter/src/vm/code_builder.c +++ b/interpreter/src/vm/code_builder.c @@ -31,9 +31,10 @@ static inline int NEXT_VALUE(ovm_code_builder_t *b) { #endif } -ovm_code_builder_t ovm_code_builder_new(ovm_program_t *program, debug_info_builder_t *debug, i32 param_count, i32 local_count) { +ovm_code_builder_t ovm_code_builder_new(ovm_program_t *program, debug_info_builder_t *debug, i32 param_count, i32 result_count, i32 local_count) { ovm_code_builder_t builder; builder.param_count = param_count; + builder.result_count = result_count; builder.local_count = local_count; builder.start_instr = bh_arr_length(program->code); builder.program = program; @@ -108,10 +109,10 @@ void ovm_code_builder_pop_label_target(ovm_code_builder_t *builder) { i--; } - i32 values_on_stack = bh_arr_length(builder->execution_stack); - if (values_on_stack > target.values_on_stack_before_block) { - bh_arr_set_length(builder->execution_stack, target.values_on_stack_before_block); - } + // i32 values_on_stack = bh_arr_length(builder->execution_stack); + // if (values_on_stack > target.values_on_stack_before_block) { + // bh_arr_set_length(builder->execution_stack, target.values_on_stack_before_block); + // } } void ovm_code_builder_patch_else(ovm_code_builder_t *builder, label_target_t if_target) { @@ -314,9 +315,7 @@ void ovm_code_builder_add_return(ovm_code_builder_t *builder) { instr.full_instr = OVM_TYPED_INSTR(OVMI_RETURN, OVM_TYPE_NONE); i32 values_on_stack = bh_arr_length(builder->execution_stack); - // assert(values_on_stack == 0 || values_on_stack == 1); - - if (values_on_stack > 0) { + if (values_on_stack > 0 && builder->result_count > 0) { instr.a = POP_VALUE(builder); } diff --git a/interpreter/src/wasm/module_parsing.h b/interpreter/src/wasm/module_parsing.h index 6d927b8a..f6b2639b 100644 --- a/interpreter/src/wasm/module_parsing.h +++ b/interpreter/src/wasm/module_parsing.h @@ -936,11 +936,12 @@ static void parse_code_section(build_context *ctx) { // Set up a lot of stuff... i32 func_idx = bh_arr_length(ctx->program->funcs); - i32 param_count = ctx->module->functypes.data[i]->type.func.params.size; + i32 param_count = ctx->module->functypes.data[i]->type.func.params.size; + i32 result_count = ctx->module->functypes.data[i]->type.func.results.size; debug_info_builder_begin_func(&ctx->debug_builder, func_idx); - ctx->builder = ovm_code_builder_new(ctx->program, &ctx->debug_builder, param_count, total_locals); + ctx->builder = ovm_code_builder_new(ctx->program, &ctx->debug_builder, param_count, result_count, total_locals); ctx->builder.func_table_arr_idx = ctx->func_table_arr_idx; ovm_code_builder_push_label_target(&ctx->builder, label_kind_func);