bh_arr(label_target_t) label_stack;
bh_arr(branch_patch_t) branch_patches;
- i32 param_count, local_count;
+ i32 param_count, result_count, local_count;
ovm_program_t *program;
i32 start_instr;
bool targets_else;
};
-ovm_code_builder_t ovm_code_builder_new(ovm_program_t *program, debug_info_builder_t *debug, i32 param_count, i32 local_count);
+ovm_code_builder_t ovm_code_builder_new(ovm_program_t *program, debug_info_builder_t *debug, i32 param_count, i32 result_count, i32 local_count);
label_target_t ovm_code_builder_wasm_target_idx(ovm_code_builder_t *builder, i32 idx);
i32 ovm_code_builder_push_label_target(ovm_code_builder_t *builder, label_kind_t kind);
void ovm_code_builder_pop_label_target(ovm_code_builder_t *builder);
#endif
}
-ovm_code_builder_t ovm_code_builder_new(ovm_program_t *program, debug_info_builder_t *debug, i32 param_count, i32 local_count) {
+ovm_code_builder_t ovm_code_builder_new(ovm_program_t *program, debug_info_builder_t *debug, i32 param_count, i32 result_count, i32 local_count) {
ovm_code_builder_t builder;
builder.param_count = param_count;
+ builder.result_count = result_count;
builder.local_count = local_count;
builder.start_instr = bh_arr_length(program->code);
builder.program = program;
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);
- }
+ // 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) {
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);
-
- if (values_on_stack > 0) {
+ if (values_on_stack > 0 && builder->result_count > 0) {
instr.a = POP_VALUE(builder);
}
// Set up a lot of stuff...
i32 func_idx = bh_arr_length(ctx->program->funcs);
- i32 param_count = ctx->module->functypes.data[i]->type.func.params.size;
+ i32 param_count = ctx->module->functypes.data[i]->type.func.params.size;
+ i32 result_count = ctx->module->functypes.data[i]->type.func.results.size;
debug_info_builder_begin_func(&ctx->debug_builder, func_idx);
- ctx->builder = ovm_code_builder_new(ctx->program, &ctx->debug_builder, param_count, total_locals);
+ ctx->builder = ovm_code_builder_new(ctx->program, &ctx->debug_builder, param_count, result_count, total_locals);
ctx->builder.func_table_arr_idx = ctx->func_table_arr_idx;
ovm_code_builder_push_label_target(&ctx->builder, label_kind_func);