instrs[0].r = tmp_register;
instrs[0].i = count;
- instrs[1].full_instr = OVM_TYPED_INSTR(OVMI_LE, OVM_TYPE_I32);
+ instrs[1].full_instr = OVM_TYPED_INSTR(OVMI_LT, OVM_TYPE_I32);
instrs[1].r = tmp_register;
instrs[1].a = index_register;
instrs[1].b = tmp_register;
state->external_funcs = NULL;
bh_arr_new(store->heap_allocator, state->external_funcs, 8);
+#ifdef OVM_VERBOSE
+ ovm_program_print_instructions(program, 0, bh_arr_length(program->code));
+#endif
+
return state;
}
ovm_value_t tmp_val;
while (state->pc < bh_arr_length(program->code)) {
- // ovm_program_print_instructions(program, state->pc, 1);
+#ifdef OVM_VERBOSE
+ ovm_program_print_instructions(program, state->pc, 1);
+#endif
+
tmp_val.type = OVM_TYPE_NONE;
tmp_val.u64 = 0;
case OVMI_MOV:
VAL(instr.r) = VAL(instr.a);
- // printf("$%d = %lx\n", instr.r, VAL(instr.r).u64);
+
+#ifdef OVM_VERBOSE
+ printf("$%d = %lx\n", instr.r, VAL(instr.r).u64);
+#endif
+
break;
#define OVM_LOAD(type_, stype) \
}
case OVMI_IDX_ARR: {
+ ovm_static_integer_array_t data_elem = program->static_data[instr.a];
+ assert(VAL(instr.b).u32 < (u32) data_elem.len);
+
tmp_val.type = OVM_TYPE_I32;
- tmp_val.i32 = program->static_integers[program->static_data[instr.a].start_idx + VAL(instr.b).u32];
+ tmp_val.i32 = program->static_integers[data_elem.start_idx + VAL(instr.b).u32];
VAL(instr.r) = tmp_val;
break;
}
VAL(frame.return_number_value) = val;
}
- // printf("Returning from %s to %s: ", frame.func->name, bh_arr_last(state->stack_frames).func->name);
- // ovm_print_val(val);
- // printf("\n\n");
+#ifdef OVM_VERBOSE
+ printf("Returning from %s to %s: ", frame.func->name, bh_arr_last(state->stack_frames).func->name);
+ ovm_print_val(val);
+ printf("\n\n");
+#endif
state->pc = frame.return_address;
break;