feels like progress I think
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Sat, 2 Jul 2022 04:20:57 +0000 (23:20 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Sat, 2 Jul 2022 04:20:57 +0000 (23:20 -0500)
build.sh
include/vm.h
src/vm/vm.c
src/wasm/instance.c

index e4095d852c2eba224e201e6293ee036675a9d936..160e4565e3a07b4bdb49c758614569f3f8208fcd 100755 (executable)
--- a/build.sh
+++ b/build.sh
@@ -2,7 +2,7 @@
 
 CC="gcc"
 WARNINGS='-Wimplicit -Wmisleading-indentation -Wparentheses -Wsequence-point -Wreturn-type -Wshift-negative-value -Wunused-but-set-parameter -Wunused-but-set-variable -Wunused-function -Wunused-label -Wmaybe-uninitialized -Wsign-compare -Wstrict-overflow -Wduplicated-branches -Wduplicated-cond -Wtrigraphs -Waddress -Wlogical-op'
-FLAGS="-O3"
+FLAGS="-g3"
 LIBS="-pthread"
 INCLUDES="-I include"
 TARGET="libonyx_embedder.so"
index 7c3dd33906003848d8201e8e54ff17714469c350..ab7700483d24d4893c016db6769b4e74d044b5fc 100644 (file)
@@ -154,13 +154,10 @@ struct ovm_func_t {
     ovm_func_kind_t kind;
     char *name;
     i32 param_count;
+    i32 value_number_count;
 
     union {
-        struct {
-            i32 start_instr;
-            i32 value_number_count;
-        };
-
+        i32 start_instr;
         i32 external_func_idx;
     };
 };
index 0d1cbfdee42c27df7f69681665fd7dbd71bf8052..4c8de37decd1c6540a5999f7d13571e3c3bc46d8 100644 (file)
@@ -106,6 +106,7 @@ int ovm_program_register_external_func(ovm_program_t *program, char *name, i32 p
     func.name = name;
     func.param_count = param_count;
     func.external_func_idx = external_func_idx;
+    func.value_number_count = param_count;
 
     bh_arr_push(program->funcs, func);
     return func.id;
@@ -560,11 +561,17 @@ ovm_value_t ovm_func_call(ovm_engine_t *engine, ovm_state_t *state, ovm_program_
         }
 
         case OVM_FUNC_EXTERNAL: {
+            ovm__func_setup_stack_frame(engine, state, program, func_idx, 0);
+
             ovm_value_t result = {0};
             ovm_external_func_t external_func = state->external_funcs[func.external_func_idx];
             external_func.native_func(external_func.userdata, state->params, &result);
 
-            bh_arr_set_length(state->params, 0);
+            bh_arr_pop(state->stack_frames);
+            state->value_number_offset = bh_arr_last(state->stack_frames).value_number_base;
+            bh_arr_fastdeleten(state->numbered_values, func.value_number_count);
+            bh_arr_fastdeleten(state->params, func.param_count);
+
             return result;
         }
 
@@ -993,6 +1000,11 @@ void ovm_run_code(ovm_engine_t *engine, ovm_state_t *state, ovm_program_t *progr
                     VAL(frame.return_number_value) = val;
                 }
 
+                ovm_func_t *new_func = bh_arr_last(state->stack_frames).func;
+                if (new_func->kind == OVM_FUNC_EXTERNAL) {
+                    return;
+                }
+
                 // printf("Returning from %s to %s: ", frame.func->name, bh_arr_last(state->stack_frames).func->name); 
                 // ovm_print_val(val);
                 // printf("\n\n");
@@ -1015,10 +1027,19 @@ void ovm_run_code(ovm_engine_t *engine, ovm_state_t *state, ovm_program_t *progr
  \
                 state->pc = func->start_instr; \
             } else { \
+                ovm__func_setup_stack_frame(engine, state, program, fidx, 0); \
+ \
+                i32 extra_params = bh_arr_length(state->params) - func->param_count; \
+ \
                 ovm_value_t result = {0}; \
                 ovm_external_func_t external_func = state->external_funcs[func->external_func_idx]; \
-                external_func.native_func(external_func.userdata, state->params, &result); \
-                bh_arr_set_length(state->params, 0); \
+                external_func.native_func(external_func.userdata, state->params + extra_params, &result); \
+                bh_arr_fastdeleten(state->params, func->param_count); \
+ \
+                ovm_stack_frame_t frame = bh_arr_pop(state->stack_frames); \
+                bh_arr_fastdeleten(state->numbered_values, frame.value_number_count); \
+                state->value_number_offset = bh_arr_last(state->stack_frames).value_number_base; \
+ \
                 if (instr.r >= 0) { \
                     VAL(instr.r) = result; \
                 } \
index 4864eca89933abfae70dc8b356c973ff9defe49a..0f5ebcdc6096dfe01cbe974d5e296f83b91d32d0 100644 (file)
@@ -19,7 +19,8 @@ struct ovm_wasm_binding {
     wasm_func_t *func;
 };
 
-#define WASM_TO_OVM(w, o) \
+#define WASM_TO_OVM(w, o) { \
+    (o).u64 = 0;\
     switch ((w).kind) { \
         case WASM_I32: \
             (o).type = OVM_TYPE_I32; \
@@ -42,9 +43,10 @@ struct ovm_wasm_binding {
             break; \
  \
         default: assert(("invalid wasm value type for conversion", 0)); \
-    }
+    } }
 
-#define OVM_TO_WASM(o, w) \
+#define OVM_TO_WASM(o, w) { \
+    (w).of.i64 = 0;\
     switch ((o).type) { \
         case OVM_TYPE_I8: \
             (w).kind = WASM_I32; \
@@ -75,7 +77,7 @@ struct ovm_wasm_binding {
             (w).kind = WASM_F64; \
             (w).of.f64 = (o).f64; \
             break; \
-    }
+    } }
 
 static wasm_trap_t *wasm_to_ovm_func_call_binding(void *vbinding, const wasm_val_vec_t *args, wasm_val_vec_t *res) {
     wasm_ovm_binding *binding = (wasm_ovm_binding *) vbinding;