From e80bac5a4d48c268ff4a15da5bf0bf4df553eeff Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Sun, 26 Jun 2022 17:03:50 -0500 Subject: [PATCH] successfully compiling 'real.onyx' to ovm! --- build.sh | 4 +- include/vm.h | 7 +++ include/vm_codebuilder.h | 10 ++++ src/tools/assembler.c | 2 + src/vm/code_builder.c | 98 +++++++++++++++++++++++++++++++ src/vm/vm.c | 47 ++++++++++++++- src/wasm/module_parsing.c.incl | 104 ++++++++++++++++++++++++++++++--- src/wasm_cli_test.c | 2 +- tests/ovm/out.ovm | Bin 722 -> 738 bytes tests/ovm/test.asm | 1 + tests/wasm/out.wasm | Bin 967 -> 131349 bytes tests/wasm/tiny.onyx | 20 ++++++- 12 files changed, 282 insertions(+), 13 deletions(-) diff --git a/build.sh b/build.sh index 42da70a..160e456 100755 --- a/build.sh +++ b/build.sh @@ -3,7 +3,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="-g3" -LIBS= +LIBS="-pthread" INCLUDES="-I include" TARGET="libonyx_embedder.so" C_FILES="src/wasm.c src/vm/*.c src/wasm/*.c" @@ -13,7 +13,7 @@ $CC $FLAGS $INCLUDES -shared -fPIC -o $TARGET $C_FILES $LIBS $WARNINGS C_FILES="src/ovm_cli_test.c" TARGET=bin/ovm_cli_test -LIBS="-L$(pwd) -lonyx_embedder -lm -Wl,-rpath=./" +LIBS="-L$(pwd) -lonyx_embedder -pthread -lm -Wl,-rpath=./" $CC $FLAGS $INCLUDES -o $TARGET $C_FILES $LIBS $WARNINGS diff --git a/include/vm.h b/include/vm.h index 2b5157b..080ae04 100644 --- a/include/vm.h +++ b/include/vm.h @@ -3,6 +3,7 @@ #include "bh.h" #include +#include typedef u8 ovm_valtype_t; typedef i32 ovm_valnum_t; @@ -73,6 +74,7 @@ int ovm_program_register_static_ints(ovm_program_t *program, int len, int *data void ovm_program_register_func(ovm_program_t *program, char *name, i32 instr, i32 param_count, i32 value_number_count); void ovm_program_register_external_func(ovm_program_t *program, char *name, i32 param_count, i32 external_func_idx); void ovm_program_begin_func(ovm_program_t *program, char *name, i32 param_count, i32 value_number_count); +void ovm_program_modify_static_int(ovm_program_t *program, int arr, int idx, int new_value); // // Represents the running configuration and static @@ -82,6 +84,8 @@ void ovm_program_begin_func(ovm_program_t *program, char *name, i32 param_count, struct ovm_engine_t { ovm_store_t *store; + pthread_mutex_t atomic_mutex; + i64 memory_size; // This is probably going to always be 4GiB. void *memory; }; @@ -234,6 +238,7 @@ struct ovm_instr_t { #define OVM_INSTR_TYPE(instr) ((instr).full_instr >> 24) #define OVM_INSTR_INSTR(instr) ((instr).full_instr & 0xffffff) +#define OVMI_ATOMIC 0x00800000 // Flag an instruction as atomic #define OVMI_NOP 0x00 #define OVMI_ADD 0x01 // %r = %a + %b @@ -322,6 +327,8 @@ struct ovm_instr_t { #define OVMI_TRANSMUTE_F32 0x6C // %r = *(t *) &%a (reinterpret bytes) #define OVMI_TRANSMUTE_F64 0x6D // %r = *(t *) &%a (reinterpret bytes) +#define OVMI_CMPXCHG 0x70 // %r = %r == %a ? %b : %r + // // OVM_TYPED_INSTR(OVMI_ADD, OVM_TYPE_I32) == instruction for adding i32s // diff --git a/include/vm_codebuilder.h b/include/vm_codebuilder.h index cd078d0..c3c2d7e 100644 --- a/include/vm_codebuilder.h +++ b/include/vm_codebuilder.h @@ -40,9 +40,17 @@ struct label_target_t { i32 instr; }; +enum branch_patch_kind_t { + branch_patch_instr_a, // For patching the '.a' register of a branch instruction. + branch_patch_static_idx, // For patching an integer in the static integers section. +}; + struct branch_patch_t { + enum branch_patch_kind_t kind; i32 branch_instr; i32 label_idx; + i32 static_arr; + i32 static_idx; }; ovm_code_builder_t ovm_code_builder_new(ovm_program_t *program, i32 param_count, i32 local_count); @@ -52,6 +60,7 @@ void ovm_code_builder_add_unop(ovm_code_builder_t *builder, u32 in void ovm_code_builder_add_imm(ovm_code_builder_t *builder, u32 ovm_type, void *imm); void ovm_code_builder_add_branch(ovm_code_builder_t *builder, i32 label_idx); void ovm_code_builder_add_cond_branch(ovm_code_builder_t *builder, i32 label_idx); +void ovm_code_builder_add_branch_table(ovm_code_builder_t *builder, i32 count, i32 *label_indicies, i32 default_label_idx); void ovm_code_builder_add_return(ovm_code_builder_t *builder); void ovm_code_builder_add_call(ovm_code_builder_t *builder, i32 func_idx, i32 param_count, bool has_return_value); void ovm_code_builder_add_indirect_call(ovm_code_builder_t *builder, i32 param_count, bool has_return_value); @@ -62,6 +71,7 @@ void ovm_code_builder_add_register_get(ovm_code_builder_t *builder void ovm_code_builder_add_register_set(ovm_code_builder_t *builder, i32 local_idx); void ovm_code_builder_add_load(ovm_code_builder_t *builder, u32 ovm_type, i32 offset); void ovm_code_builder_add_store(ovm_code_builder_t *builder, u32 ovm_type, i32 offset); +void ovm_code_builder_add_cmpxchg(ovm_code_builder_t *builder, u32 ovm_type, i32 offset); void ovm_code_builder_add_memory_copy(ovm_code_builder_t *builder); void ovm_code_builder_add_memory_fill(ovm_code_builder_t *builder); diff --git a/src/tools/assembler.c b/src/tools/assembler.c index 2610ffe..147a5fe 100644 --- a/src/tools/assembler.c +++ b/src/tools/assembler.c @@ -191,6 +191,8 @@ static struct instruction_mapping_t instr_map[] = { { "cvt.f64.i32", OVM_TYPED_INSTR(OVMI_CVT_F64, OVM_TYPE_I32), op_reg, op_reg }, { "cvt.f64.i64", OVM_TYPED_INSTR(OVMI_CVT_F64, OVM_TYPE_I64), op_reg, op_reg }, { "cvt.f64.f32", OVM_TYPED_INSTR(OVMI_CVT_F64, OVM_TYPE_F32), op_reg, op_reg }, + + { "atomic.add.i32", OVM_TYPED_INSTR(OVMI_ADD | OVMI_ATOMIC, OVM_TYPE_I32), op_reg, op_reg, op_reg }, }; void parse_register(i32 *dest) { diff --git a/src/vm/code_builder.c b/src/vm/code_builder.c index 3701078..b6b1be7 100644 --- a/src/vm/code_builder.c +++ b/src/vm/code_builder.c @@ -93,6 +93,7 @@ void ovm_code_builder_add_branch(ovm_code_builder_t *builder, i32 label_idx) { branch_instr.a = -1; branch_patch_t patch; + patch.kind = branch_patch_instr_a; patch.branch_instr = bh_arr_length(builder->program->code); patch.label_idx = label_idx; @@ -108,6 +109,7 @@ void ovm_code_builder_add_cond_branch(ovm_code_builder_t *builder, i32 label_idx branch_instr.b = POP_VALUE(builder); branch_patch_t patch; + patch.kind = branch_patch_instr_a; patch.branch_instr = bh_arr_length(builder->program->code); patch.label_idx = label_idx; @@ -116,6 +118,61 @@ void ovm_code_builder_add_cond_branch(ovm_code_builder_t *builder, i32 label_idx ovm_program_add_instructions(builder->program, 1, &branch_instr); } +void ovm_code_builder_add_branch_table(ovm_code_builder_t *builder, i32 count, i32 *label_indicies, i32 default_label_idx) { + // + // Passing label indicies here is a little disingenuous, because that is not + // what the data will have to be. But since it is already the correct length + // I am using it as a subsitute. + int table_idx = ovm_program_register_static_ints(builder->program, count, label_indicies); + assert(table_idx > 0); + + ovm_instr_t instrs[5] = {0}; + int tmp_register = NEXT_VALUE(builder); + int index_register = POP_VALUE(builder); + PUSH_VALUE(builder, tmp_register); + + instrs[0].full_instr = OVM_TYPED_INSTR(OVMI_IMM, OVM_TYPE_I32); + instrs[0].r = tmp_register; + instrs[0].i = count; + + instrs[1].full_instr = OVM_TYPED_INSTR(OVMI_LE, OVM_TYPE_I32); + instrs[1].r = tmp_register; + instrs[1].a = index_register; + instrs[1].b = tmp_register; + + instrs[2].full_instr = OVMI_BR_Z; + instrs[2].a = -1; + instrs[2].b = tmp_register; + + instrs[3].full_instr = OVMI_IDX_ARR; + instrs[3].r = tmp_register; + instrs[3].a = table_idx; + instrs[3].b = index_register; + + instrs[4].full_instr = OVMI_BRI; + instrs[4].a = tmp_register; + + POP_VALUE(builder); + + fori (i, 0, count) { + branch_patch_t patch; + patch.kind = branch_patch_static_idx; + patch.branch_instr = bh_arr_length(builder->program->code) + 4; + patch.label_idx = label_indicies[i]; + patch.static_arr = table_idx; + patch.static_idx = i; + bh_arr_push(builder->branch_patches, patch); + } + + branch_patch_t default_patch; + default_patch.kind = branch_patch_instr_a; + default_patch.branch_instr = bh_arr_length(builder->program->code) + 2; + default_patch.label_idx = default_label_idx; + bh_arr_push(builder->branch_patches, default_patch); + + ovm_program_add_instructions(builder->program, 5, instrs); +} + void ovm_code_builder_add_return(ovm_code_builder_t *builder) { ovm_instr_t instr = {0}; instr.full_instr = OVMI_RETURN; @@ -304,6 +361,47 @@ void ovm_code_builder_add_store(ovm_code_builder_t *builder, u32 ovm_type, i32 o ovm_program_add_instructions(builder->program, 3, instrs); } +void ovm_code_builder_add_cmpxchg(ovm_code_builder_t *builder, u32 ovm_type, i32 offset) { + if (offset == 0) { + ovm_instr_t cmpxchg_instr = {0}; + cmpxchg_instr.full_instr = OVM_TYPED_INSTR(OVMI_ATOMIC | OVMI_CMPXCHG, ovm_type); + cmpxchg_instr.b = POP_VALUE(builder); + cmpxchg_instr.a = POP_VALUE(builder); + cmpxchg_instr.r = POP_VALUE(builder); + + ovm_program_add_instructions(builder->program, 1, &cmpxchg_instr); + + PUSH_VALUE(builder, cmpxchg_instr.r); + return; + } + + ovm_instr_t instrs[3] = {0}; + int value_reg = POP_VALUE(builder); + int expected_reg = POP_VALUE(builder); + int addr_reg = POP_VALUE(builder); + + // imm.i32 %n, offset + instrs[0].full_instr = OVM_TYPED_INSTR(OVMI_IMM, OVM_TYPE_I32); + instrs[0].i = offset; + instrs[0].r = NEXT_VALUE(builder); + + // add.i32 %n, %n, %i + instrs[1].full_instr = OVM_TYPED_INSTR(OVMI_ADD, OVM_TYPE_I32); + instrs[1].r = instrs[0].r; + instrs[1].a = instrs[0].r; + instrs[1].b = addr_reg; + + // cmpxchg.x %m, %n + instrs[2].full_instr = OVM_TYPED_INSTR(OVMI_ATOMIC | OVMI_CMPXCHG, ovm_type); + instrs[2].r = instrs[1].r; + instrs[2].a = expected_reg; + instrs[2].b = value_reg; + + ovm_program_add_instructions(builder->program, 3, instrs); + + PUSH_VALUE(builder, instrs[2].r); +} + void ovm_code_builder_add_memory_copy(ovm_code_builder_t *builder) { ovm_instr_t instr = {0}; instr.full_instr = OVMI_COPY; diff --git a/src/vm/vm.c b/src/vm/vm.c index 3ef3af1..7084ac3 100644 --- a/src/vm/vm.c +++ b/src/vm/vm.c @@ -3,6 +3,7 @@ #include #include #include // REMOVE THIS!!! only needed for sqrt +#include // // Store @@ -57,6 +58,15 @@ int ovm_program_register_static_ints(ovm_program_t *program, int len, int *data) return bh_arr_length(program->static_data) - 1; } +void ovm_program_modify_static_int(ovm_program_t *program, int arr, int idx, int new_value) { + if (arr >= bh_arr_length(program->static_data)) return; + + ovm_static_integer_array_t array = program->static_data[arr]; + if (idx >= array.len) return; + + program->static_integers[array.start_idx + idx] = new_value; +} + void ovm_program_register_func(ovm_program_t *program, char *name, i32 instr, i32 param_count, i32 value_number_count) { ovm_func_t func; func.kind = OVM_FUNC_INTERNAL; @@ -99,7 +109,9 @@ void ovm_program_add_instructions(ovm_program_t *program, i32 instr_count, ovm_i static char *ovm_instr_name(i32 full_instr) { -#define C(...) case __VA_ARGS__: return #__VA_ARGS__; +#define C(...) \ + case __VA_ARGS__: return #__VA_ARGS__; \ + case __VA_ARGS__ | OVMI_ATOMIC: return "ATOMIC_" #__VA_ARGS__; static char buf[64]; @@ -350,6 +362,11 @@ static char *ovm_instr_name(i32 full_instr) { C(OVM_TYPED_INSTR(OVMI_CVT_F64, OVM_TYPE_I64)) C(OVM_TYPED_INSTR(OVMI_CVT_F64, OVM_TYPE_F32)) + C(OVM_TYPED_INSTR(OVMI_CMPXCHG, OVM_TYPE_I8)) + C(OVM_TYPED_INSTR(OVMI_CMPXCHG, OVM_TYPE_I16)) + C(OVM_TYPED_INSTR(OVMI_CMPXCHG, OVM_TYPE_I32)) + C(OVM_TYPED_INSTR(OVMI_CMPXCHG, OVM_TYPE_I64)) + default: snprintf(buf, 64, "unknown (%d)", full_instr); return buf; @@ -547,6 +564,7 @@ void ovm_run_code(ovm_engine_t *engine, ovm_state_t *state, ovm_program_t *progr #define VAL(loc) (state->numbered_values[(u32) (loc + state->value_number_offset)]) ovm_instr_t *code = program->code; + bool release_mutex_at_end = false; while (state->pc < bh_arr_length(program->code)) { // @@ -557,6 +575,13 @@ void ovm_run_code(ovm_engine_t *engine, ovm_state_t *state, ovm_program_t *progr // being executed. - brendanfh 2022/06/13 ovm_instr_t instr = code[state->pc++]; + if (instr.full_instr & OVMI_ATOMIC) { + pthread_mutex_lock(&engine->atomic_mutex); + release_mutex_at_end = true; + + instr.full_instr &= ~OVMI_ATOMIC; + } + switch (instr.full_instr) { case OVMI_NOP: break; @@ -978,6 +1003,21 @@ void ovm_run_code(ovm_engine_t *engine, ovm_state_t *state, ovm_program_t *progr #undef CVT + +#define CMPXCHG(otype, ctype) \ + case OVM_TYPED_INSTR(OVMI_ATOMIC | OVMI_CMPXCHG, otype): \ + if (VAL(instr.r).ctype == VAL(instr.a).ctype) { \ + VAL(instr.r).ctype = VAL(instr.b).ctype ; \ + } \ + break; + + CMPXCHG(OVM_TYPE_I8, i8) + CMPXCHG(OVM_TYPE_I16, i16) + CMPXCHG(OVM_TYPE_I32, i32) + CMPXCHG(OVM_TYPE_I64, i64) + +#undef CMPXCHG + default: printf("ERROR:\n"); ovm_program_print_instructions(program, state->pc - 1, 1); @@ -985,6 +1025,11 @@ void ovm_run_code(ovm_engine_t *engine, ovm_state_t *state, ovm_program_t *progr assert(("ILLEGAL INSTRUCTION", 0)); break; } + + if (release_mutex_at_end) { + pthread_mutex_unlock(&engine->atomic_mutex); + release_mutex_at_end = false; + } } } diff --git a/src/wasm/module_parsing.c.incl b/src/wasm/module_parsing.c.incl index 2ee8941..1b4e7dd 100644 --- a/src/wasm/module_parsing.c.incl +++ b/src/wasm/module_parsing.c.incl @@ -18,6 +18,8 @@ struct build_context { ovm_program_t *program; ovm_store_t *store; + int func_table_arr_idx; + // This will be set/reset for every code (function) entry. ovm_code_builder_t builder; }; @@ -301,6 +303,8 @@ static void parse_elem_section(build_context *ctx) { fori (i, 0, (int) entry_count) { ctx->module->elem_entries[i] = uleb128_to_uint(ctx->binary.data, &ctx->offset); } + + ctx->func_table_arr_idx = ovm_program_register_static_ints(ctx->program, entry_count, ctx->module->elem_entries); } static void parse_data_section(build_context *ctx) { @@ -377,7 +381,18 @@ static void pop_label_target(build_context *ctx) { branch_patch_t patch = ctx->builder.branch_patches[i]; if (patch.label_idx != target.idx) continue; - ctx->program->code[patch.branch_instr].a = target.instr - patch.branch_instr - 1; + int br_delta = target.instr - patch.branch_instr - 1; + + switch (patch.kind) { + case branch_patch_instr_a: + ctx->program->code[patch.branch_instr].a = br_delta; + break; + + case branch_patch_static_idx: + ovm_program_modify_static_int(ctx->program, patch.static_arr, patch.static_idx, br_delta); + break; + } + bh_arr_fastdelete(ctx->builder.branch_patches, i); i--; } @@ -429,6 +444,69 @@ static void parse_fc_instruction(build_context *ctx) { } } +static void parse_fe_instruction(build_context *ctx) { + int instr_num = uleb128_to_uint(ctx->binary.data, &ctx->offset); + + switch (instr_num) { + +#define LOAD_CASE(num, type) \ + case num : { \ + int alignment = uleb128_to_uint(ctx->binary.data, &ctx->offset); \ + int offset = uleb128_to_uint(ctx->binary.data, &ctx->offset); \ + ovm_code_builder_add_load(&ctx->builder, OVMI_ATOMIC | type, offset); \ + break; \ + } + + LOAD_CASE(0x10, OVM_TYPE_I32) + LOAD_CASE(0x11, OVM_TYPE_I64) + LOAD_CASE(0x12, OVM_TYPE_I8) + LOAD_CASE(0x13, OVM_TYPE_I16) + LOAD_CASE(0x14, OVM_TYPE_I8) + LOAD_CASE(0x15, OVM_TYPE_I16) + LOAD_CASE(0x16, OVM_TYPE_I32) + +#undef LOAD_CASE + +#define STORE_CASE(num, type) \ + case num : { \ + int alignment = uleb128_to_uint(ctx->binary.data, &ctx->offset); \ + int offset = uleb128_to_uint(ctx->binary.data, &ctx->offset); \ + ovm_code_builder_add_store(&ctx->builder, OVMI_ATOMIC | type, offset); \ + break; \ + } + + STORE_CASE(0x17, OVM_TYPE_I32) + STORE_CASE(0x18, OVM_TYPE_I64) + STORE_CASE(0x19, OVM_TYPE_I8) + STORE_CASE(0x1A, OVM_TYPE_I16) + STORE_CASE(0x1B, OVM_TYPE_I8) + STORE_CASE(0x1C, OVM_TYPE_I16) + STORE_CASE(0x1D, OVM_TYPE_I32) + +#undef STORE_CASE + +#define CMPXCHG_CASE(num, type) \ + case num : { \ + int alignment = uleb128_to_uint(ctx->binary.data, &ctx->offset); \ + int offset = uleb128_to_uint(ctx->binary.data, &ctx->offset); \ + ovm_code_builder_add_cmpxchg(&ctx->builder, type, offset); \ + break; \ + } + + CMPXCHG_CASE(0x48, OVM_TYPE_I32) + CMPXCHG_CASE(0x49, OVM_TYPE_I64) + CMPXCHG_CASE(0x4A, OVM_TYPE_I8) + CMPXCHG_CASE(0x4B, OVM_TYPE_I16) + CMPXCHG_CASE(0x4C, OVM_TYPE_I8) + CMPXCHG_CASE(0x4D, OVM_TYPE_I16) + CMPXCHG_CASE(0x4E, OVM_TYPE_I32) + +#undef CMPXCHG_CASE + + default: assert(("UNHANDLED ATOMIC INSTRUCTION... SORRY :/", 0)); + } +} + static void parse_instruction(build_context *ctx) { unsigned char instr_byte = CONSUME_BYTE(ctx); switch (instr_byte) { @@ -470,7 +548,7 @@ static void parse_instruction(build_context *ctx) { // Therefore, this "peeks" at what the next label index will be, so it can // know what label to track for where to jump. It feels like there should be // a better way to do this. - ovm_code_builder_add_branch(&ctx->builder, ctx->builder.next_label_idx); + ovm_code_builder_add_branch(&ctx->builder, bh_arr_last(ctx->builder.label_stack).idx); pop_label_target(ctx); push_label_target(ctx, label_kind_block); break; @@ -497,8 +575,18 @@ static void parse_instruction(build_context *ctx) { break; } - case 0x0E: assert(0); { - // TODO: Branch tables + case 0x0E: { + // Branch tables are the most complicated thing ever :/ + + int entry_count = uleb128_to_uint(ctx->binary.data, &ctx->offset); + int *entries = bh_alloc_array(bh_heap_allocator(), int, entry_count); + fori (i, 0, entry_count) { + entries[i] = uleb128_to_uint(ctx->binary.data, &ctx->offset); + } + + int default_entry = uleb128_to_uint(ctx->binary.data, &ctx->offset); + + ovm_code_builder_add_branch_table(&ctx->builder, entry_count, entries, default_entry); break; } @@ -618,6 +706,7 @@ static void parse_instruction(build_context *ctx) { int memory_size = 65536; ovm_code_builder_add_imm(&ctx->builder, OVM_TYPE_I32, &memory_size); + break; } case 0x40: { @@ -646,7 +735,7 @@ static void parse_instruction(build_context *ctx) { case 0x44: { double value = * (f64 *) &ctx->binary.data[ctx->offset]; - ctx->offset += 4; + ctx->offset += 8; ovm_code_builder_add_imm(&ctx->builder, OVM_TYPE_F64, &value); break; } @@ -800,6 +889,7 @@ static void parse_instruction(build_context *ctx) { case 0xC4: ovm_code_builder_add_unop (&ctx->builder, OVM_TYPED_INSTR(OVMI_CVT_I32_S, OVM_TYPE_I64)); break; case 0xFC: parse_fc_instruction(ctx); break; + case 0xFE: parse_fe_instruction(ctx); break; default: assert(("UNHANDLED INSTRUCTION", 0)); } @@ -830,10 +920,10 @@ static void parse_code_section(build_context *ctx) { // Set up a lot of stuff... - i32 param_count = wasm_module_index_functype(ctx->module, i)->type.func.params.size; + i32 param_count = ctx->module->functypes.data[i]->type.func.params.size; ctx->builder = ovm_code_builder_new(ctx->program, param_count, total_locals); - ctx->builder.func_table_arr_idx = 0; // This might not be right + ctx->builder.func_table_arr_idx = ctx->func_table_arr_idx; push_label_target(ctx, label_kind_func); parse_expression(ctx); diff --git a/src/wasm_cli_test.c b/src/wasm_cli_test.c index f0d8414..5f06ea9 100644 --- a/src/wasm_cli_test.c +++ b/src/wasm_cli_test.c @@ -46,6 +46,6 @@ int main(int argc, char *argv[]) { bh_printf("exports: %b %d\n", export_name->data, export_name->size, wasm_externtype_kind(wasm_exporttype_type(exports.data[i]))); } - ovm_program_print_instructions(module->program, 0, 150); + ovm_program_print_instructions(module->program, 0, bh_arr_length(module->program->code)); } diff --git a/tests/ovm/out.ovm b/tests/ovm/out.ovm index 208d51a39ba22233904f4543dbe08b13c8111277..19fd7f28f90bd1e007a58ee37ed305e792ee9008 100644 GIT binary patch delta 63 zcmcb_`iPa&Kg`#Yfq{WhZ6oJlMovbC24*0SfnoAd#`kh^U?u|tNQe=Lxq!I1Br!QV JzM!Ot0RV+N3z7f; delta 53 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 bXg?uYp6#bhl4y|ZCmoWMI x + 1; foo(); - if_test(10); + switch_test(10); while_test(10); } -if_test :: (x: i32) { +/*if_test :: (x: i32) { if !(x > 10) { f(10, 20); } elseif x > 5 { @@ -27,6 +27,22 @@ if_test :: (x: i32) { } else { y := x * 2; } +}*/ + +switch_test :: (x: i32) { + switch x { + case 10 { + y := 0; + } + + case 20 { + z := x * 2; + } + + case #default { + w := x + 2; + } + } } while_test :: (x: i32) { -- 2.25.1