diff options
Diffstat (limited to 'vm')
| -rw-r--r-- | vm/runtime.c | 37 | 
1 files changed, 24 insertions, 13 deletions
diff --git a/vm/runtime.c b/vm/runtime.c index 7b712f2..664fa25 100644 --- a/vm/runtime.c +++ b/vm/runtime.c @@ -74,29 +74,34 @@ err_t vm_execute(vm_t *vm)             OPCODE_IS_TYPE(instruction.opcode, OP_MSET) ||             OPCODE_IS_TYPE(instruction.opcode, OP_MGET))    { +    err_t err = +        WORD_ROUTINES[instruction.opcode](vm, instruction.operand.as_word); +    if (err) +      return err;      prog->ptr++; -    return WORD_ROUTINES[instruction.opcode](vm, instruction.operand.as_word);    }    else if (OPCODE_IS_TYPE(instruction.opcode, OP_POP))    {      // NOTE: We use the first register to hold the result of this pop      data_type_t type = OPCODE_DATA_TYPE(instruction.opcode, OP_POP); -    prog->ptr++; +    err_t err        = ERR_OK;      switch (type)      {      case DATA_TYPE_NIL:        break;      case DATA_TYPE_BYTE: -      return vm_mov_byte(vm, 0); +      err = vm_mov_byte(vm, 0);        break;      case DATA_TYPE_HWORD: -      return vm_mov_hword(vm, 0); +      err = vm_mov_hword(vm, 0);        break;      case DATA_TYPE_WORD: -      return vm_mov_word(vm, 0); +      err = vm_mov_word(vm, 0);        break;      } -    return ERR_OK; +    if (err) +      return err; +    prog->ptr++;    }    else if (OPCODE_IS_TYPE(instruction.opcode, OP_NOT) ||             OPCODE_IS_TYPE(instruction.opcode, OP_OR) || @@ -115,16 +120,18 @@ err_t vm_execute(vm_t *vm)             OPCODE_IS_TYPE(instruction.opcode, OP_MGET_STACK) ||             instruction.opcode == OP_MDELETE || instruction.opcode == OP_MSIZE)    { +    err_t err = STACK_ROUTINES[instruction.opcode](vm);      prog->ptr++; -    return STACK_ROUTINES[instruction.opcode](vm); +    if (err) +      return err;    }    else if (instruction.opcode == OP_JUMP_ABS)      return vm_jump(vm, instruction.operand.as_word);    else if (instruction.opcode == OP_JUMP_STACK)    { -    // Set prog->ptr to the word on top of the stack      data_t ret = {0}; -    err_t err  = vm_pop_word(vm, &ret); +    // Set prog->ptr to the word on top of the stack +    err_t err = vm_pop_word(vm, &ret);      if (err)        return err;      return vm_jump(vm, ret.as_word); @@ -620,8 +627,10 @@ err_t vm_push_hword(vm_t *vm, data_t f)    convert_hword_to_bytes(f.as_hword, bytes);    for (size_t i = 0; i < HWORD_SIZE; ++i)    { -    byte b = bytes[HWORD_SIZE - i - 1]; -    vm_push_byte(vm, DBYTE(b)); +    byte b    = bytes[HWORD_SIZE - i - 1]; +    err_t err = vm_push_byte(vm, DBYTE(b)); +    if (err) +      return err;    }    return ERR_OK;  } @@ -634,8 +643,10 @@ err_t vm_push_word(vm_t *vm, data_t w)    convert_word_to_bytes(w.as_word, bytes);    for (size_t i = 0; i < WORD_SIZE; ++i)    { -    byte b = bytes[WORD_SIZE - i - 1]; -    vm_push_byte(vm, DBYTE(b)); +    byte b    = bytes[WORD_SIZE - i - 1]; +    err_t err = vm_push_byte(vm, DBYTE(b)); +    if (err) +      return err;    }    return ERR_OK;  }  | 
