bugfix: return from expression with stray values
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Sun, 26 Feb 2023 19:18:31 +0000 (13:18 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Sun, 26 Feb 2023 19:18:31 +0000 (13:18 -0600)
interpreter/include/vm_codebuilder.h
interpreter/src/vm/code_builder.c
interpreter/src/wasm/module_parsing.h

index 62621dd57cf5eff5c07299a5bc958902e7d653aa..ff6ee54d3f17a66a584b6f74d1a623692e6ba624 100644 (file)
@@ -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);
index 6296d97ef30684fefea05dc300c438ec219aa199..f408778bdd574e6c0bc812ad45e1edd534074f91 100644 (file)
@@ -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);
     }
 
index 6d927b8aed90b912de5a896b9b6bafc7120bdcf8..f6b2639bc580ca67e1acba5af7031dc3d6a6bd98 100644 (file)
@@ -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);