Fixed order of operations for certain implementations

OP_PUSH: Increment program pointer iff no error from PUSH_ROUTINE call
STACK_ROUTINES: Same as OP_PUSH
RET: Pop off the call stack iff the jump to the address was good.
This commit is contained in:
2024-04-25 02:59:29 +05:30
parent aac6e620c6
commit a0479790a2

View File

@@ -70,8 +70,10 @@ err_t vm_execute(vm_t *vm)
if (UNSIGNED_OPCODE_IS_TYPE(instruction.opcode, OP_PUSH)) if (UNSIGNED_OPCODE_IS_TYPE(instruction.opcode, OP_PUSH))
{ {
err_t err = PUSH_ROUTINES[instruction.opcode](vm, instruction.operand);
if (err)
return err;
prog->ptr++; prog->ptr++;
return PUSH_ROUTINES[instruction.opcode](vm, instruction.operand);
} }
else if (UNSIGNED_OPCODE_IS_TYPE(instruction.opcode, OP_MOV) || else if (UNSIGNED_OPCODE_IS_TYPE(instruction.opcode, OP_MOV) ||
UNSIGNED_OPCODE_IS_TYPE(instruction.opcode, OP_PUSH_REGISTER) || UNSIGNED_OPCODE_IS_TYPE(instruction.opcode, OP_PUSH_REGISTER) ||
@@ -92,7 +94,7 @@ err_t vm_execute(vm_t *vm)
// this pop. // this pop.
// Here we add OP_MOV_BYTE and the data_type_t of the opcode to // Here we add OP_MOV_BYTE and the data_type_t of the opcode to
// get the right OP_MOV typed opcode. // get the right typed OP_MOV opcode.
opcode_t mov_opcode = opcode_t mov_opcode =
OPCODE_DATA_TYPE(instruction.opcode, OP_POP) + OP_MOV_BYTE; OPCODE_DATA_TYPE(instruction.opcode, OP_POP) + OP_MOV_BYTE;
@@ -119,9 +121,9 @@ err_t vm_execute(vm_t *vm)
instruction.opcode == OP_MDELETE || instruction.opcode == OP_MSIZE) instruction.opcode == OP_MDELETE || instruction.opcode == OP_MSIZE)
{ {
err_t err = STACK_ROUTINES[instruction.opcode](vm); err_t err = STACK_ROUTINES[instruction.opcode](vm);
prog->ptr++;
if (err) if (err)
return err; return err;
prog->ptr++;
} }
else if (instruction.opcode == OP_JUMP_ABS) else if (instruction.opcode == OP_JUMP_ABS)
return vm_jump(vm, instruction.operand.as_word); return vm_jump(vm, instruction.operand.as_word);
@@ -176,7 +178,12 @@ err_t vm_execute(vm_t *vm)
{ {
if (vm->call_stack.ptr == 0) if (vm->call_stack.ptr == 0)
return ERR_CALL_STACK_UNDERFLOW; return ERR_CALL_STACK_UNDERFLOW;
return vm_jump(vm, vm->call_stack.address_pointers[--vm->call_stack.ptr]); word addr = vm->call_stack.address_pointers[vm->call_stack.ptr - 1];
err_t err = vm_jump(vm, vm->call_stack.address_pointers[addr]);
if (err)
return err;
--vm->call_stack.ptr;
} }
else if (SIGNED_OPCODE_IS_TYPE(instruction.opcode, OP_PRINT)) else if (SIGNED_OPCODE_IS_TYPE(instruction.opcode, OP_PRINT))
{ {