From b93a4af4952906e544f35805720c6b547f1f062e Mon Sep 17 00:00:00 2001 From: Aryadev Chavali Date: Mon, 23 Oct 2023 01:45:18 +0100 Subject: Extracted code that performs a jump into its own routine Checks if the operand given is a well defined program address, then performs the jump. --- src/runtime.c | 17 +++++++++++------ src/runtime.h | 2 ++ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/runtime.c b/src/runtime.c index 1108b25..cf66480 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -123,18 +123,14 @@ err_t vm_execute(vm_t *vm) err_t err = vm_pop_word(vm, &ret); if (err) return err; - else if (ret.as_word >= vm->program.max) - return ERR_INVALID_PROGRAM_ADDRESS; - prog->ptr = ret.as_word; + return vm_jump(vm, ret.as_word); } else if (instruction.opcode == OP_JUMP_REGISTER) { if (instruction.operand.as_byte >= 8) return ERR_INVALID_REGISTER_WORD; word addr = vm->registers.reg[instruction.operand.as_byte]; - if (addr >= vm->program.max) - return ERR_INVALID_PROGRAM_ADDRESS; - prog->ptr = addr; + return vm_jump(vm, addr); } else if (instruction.opcode >= OP_PRINT_CHAR && instruction.opcode <= OP_PRINT_WORD) @@ -367,6 +363,15 @@ void vm_print_all(vm_t *vm, FILE *fp) fp); } +err_t vm_jump(vm_t *vm, word w) +{ + printf("vm_jump: w=%lu\n", w); + if (w >= vm->program.max) + return ERR_INVALID_PROGRAM_ADDRESS; + vm->program.ptr = w; + return ERR_OK; +} + err_t vm_push_byte(vm_t *vm, data_t b) { if (vm->stack.ptr >= vm->stack.max) diff --git a/src/runtime.h b/src/runtime.h index ab5abd7..83ffa17 100644 --- a/src/runtime.h +++ b/src/runtime.h @@ -71,6 +71,8 @@ void vm_print_program(vm_t *, FILE *); void vm_print_all(vm_t *, FILE *); // Execution routines +err_t vm_jump(vm_t *, word); + err_t vm_pop_byte(vm_t *, data_t *); err_t vm_pop_hword(vm_t *, data_t *); err_t vm_pop_word(vm_t *, data_t *); -- cgit v1.2.3-13-gbd6f