bugfix: returning in expressions being handled
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Sun, 26 Feb 2023 19:00:19 +0000 (13:00 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Sun, 26 Feb 2023 19:00:19 +0000 (13:00 -0600)
interpreter/include/vm_codebuilder.h
interpreter/src/vm/code_builder.c

index c4b0f454de6e459240e0fd9366de94db2b437c77..62621dd57cf5eff5c07299a5bc958902e7d653aa 100644 (file)
@@ -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 {
index d77251521c15b4b25500f8d0e89670374b9e5c73..6296d97ef30684fefea05dc300c438ec219aa199 100644 (file)
@@ -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);
     }