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;
}
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;
}
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");
\
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; \
} \
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; \
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; \
(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;