From: Brendan Hansen Date: Sun, 26 Feb 2023 19:00:19 +0000 (-0600) Subject: bugfix: returning in expressions being handled X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=4e31573ad80b44fa482a26a2c7ec387bc174ccf8;p=onyx.git bugfix: returning in expressions being handled --- diff --git a/interpreter/include/vm_codebuilder.h b/interpreter/include/vm_codebuilder.h index c4b0f454..62621dd5 100644 --- a/interpreter/include/vm_codebuilder.h +++ b/interpreter/include/vm_codebuilder.h @@ -41,6 +41,8 @@ struct label_target_t { i32 idx; label_kind_t kind; i32 instr; + + i32 values_on_stack_before_block; }; enum branch_patch_kind_t { diff --git a/interpreter/src/vm/code_builder.c b/interpreter/src/vm/code_builder.c index d7725152..6296d97e 100644 --- a/interpreter/src/vm/code_builder.c +++ b/interpreter/src/vm/code_builder.c @@ -71,6 +71,7 @@ i32 ovm_code_builder_push_label_target(ovm_code_builder_t *builder, label_kind_t target.kind = kind; target.idx = builder->next_label_idx++; target.instr = -1; + target.values_on_stack_before_block = bh_arr_length(builder->execution_stack); if (kind == label_kind_loop) { target.instr = bh_arr_length(builder->program->code); @@ -106,6 +107,11 @@ void ovm_code_builder_pop_label_target(ovm_code_builder_t *builder) { bh_arr_fastdelete(builder->branch_patches, i); 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); + } } void ovm_code_builder_patch_else(ovm_code_builder_t *builder, label_target_t if_target) { @@ -308,9 +314,9 @@ 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); + // assert(values_on_stack == 0 || values_on_stack == 1); - if (values_on_stack == 1) { + if (values_on_stack > 0) { instr.a = POP_VALUE(builder); }