valeri/src/vm.hpp

51 lines
1.2 KiB
C++
Raw Normal View History

#pragma once
#include "common.hpp"
class VM {
public:
VM() {}
VM(Stack&& stack, Stack&& callstack)
: _stack(std::move(stack)), _callstack(std::move(callstack)) {}
VM(VM&& vm)
: _stack(std::move(vm._stack)), _callstack(std::move(vm._callstack)) {}
VM(const VM&) = delete;
static Result<VM> create() {
auto stack = TRY(Stack::create(16 * 1024));
auto callstack = TRY(Stack::create(16 * 1024));
return VM(std::move(stack), std::move(callstack));
}
Result<Value> run(const Function& fun);
Result<void> step();
Result<void> vm_mov(Opcode& oc);
Result<void> vm_add(Opcode& oc);
Result<void> vm_mul(Opcode& oc);
Result<void> vm_sub(Opcode& oc);
Result<void> vm_div(Opcode& oc);
Result<void> vm_call(Opcode& oc);
Result<void> vm_ret(Opcode& oc);
2024-08-15 00:18:05 +00:00
Result<void> vm_jump_not_equal(Opcode& oc);
Result<void> vm_jump(Opcode& oc);
Result<void> vm_make_closure(Opcode& oc);
Result<Value> get(bool is_const, uint64_t idx);
Result<Value> getconst(uint64_t idx);
Result<Value> getreg(uint64_t idx);
Result<void> setreg(uint64_t idx, const Value& value);
private:
Stack _stack;
Stack _callstack;
Function _fun;
Array _code;
Array _constants;
uint64_t _pc;
uint64_t _base;
Value _res;
};