From: Brendan Hansen Date: Sat, 2 Jul 2022 04:20:57 +0000 (-0500) Subject: feels like progress I think X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=c412bf002bfe973bb723d407dcfa433e71328c8c;p=onyx-embedder.git feels like progress I think --- diff --git a/build.sh b/build.sh index e4095d8..160e456 100755 --- 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" diff --git a/include/vm.h b/include/vm.h index 7c3dd33..ab77004 100644 --- a/include/vm.h +++ b/include/vm.h @@ -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; }; }; diff --git a/src/vm/vm.c b/src/vm/vm.c index 0d1cbfd..4c8de37 100644 --- a/src/vm/vm.c +++ b/src/vm/vm.c @@ -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; \ } \ diff --git a/src/wasm/instance.c b/src/wasm/instance.c index 4864eca..0f5ebcd 100644 --- a/src/wasm/instance.c +++ b/src/wasm/instance.c @@ -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;