2024-08-12 22:05:40 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "common.hpp"
|
|
|
|
|
|
|
|
class VM {
|
|
|
|
public:
|
|
|
|
VM() {}
|
2024-08-17 22:22:21 +00:00
|
|
|
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)) {}
|
2024-08-12 22:05:40 +00:00
|
|
|
VM(const VM&) = delete;
|
|
|
|
|
|
|
|
static Result<VM> create() {
|
|
|
|
auto stack = TRY(Stack::create(16 * 1024));
|
2024-08-17 22:22:21 +00:00
|
|
|
auto callstack = TRY(Stack::create(16 * 1024));
|
|
|
|
return VM(std::move(stack), std::move(callstack));
|
2024-08-12 22:05:40 +00:00
|
|
|
}
|
|
|
|
|
2024-08-23 23:28:29 +00:00
|
|
|
Result<Value> run(const Module& mod);
|
2024-08-12 22:05:40 +00:00
|
|
|
|
|
|
|
Result<void> step();
|
|
|
|
Result<void> vm_mov(Opcode& oc);
|
2024-08-13 00:11:23 +00:00
|
|
|
Result<void> vm_add(Opcode& oc);
|
|
|
|
Result<void> vm_mul(Opcode& oc);
|
|
|
|
Result<void> vm_sub(Opcode& oc);
|
|
|
|
Result<void> vm_div(Opcode& oc);
|
2024-08-17 22:22:21 +00:00
|
|
|
Result<void> vm_call(Opcode& oc);
|
|
|
|
Result<void> vm_ret(Opcode& oc);
|
2024-08-12 22:05:40 +00:00
|
|
|
|
2024-08-23 20:30:05 +00:00
|
|
|
Result<void> vm_equal(Opcode& oc);
|
|
|
|
Result<void> vm_less(Opcode& oc);
|
|
|
|
Result<void> vm_less_equal(Opcode& oc);
|
2024-08-15 00:18:05 +00:00
|
|
|
Result<void> vm_jump(Opcode& oc);
|
|
|
|
|
2024-08-21 22:45:19 +00:00
|
|
|
Result<void> vm_make_closure(Opcode& oc);
|
2024-08-22 16:21:05 +00:00
|
|
|
Result<void> vm_closure_load(Opcode& oc);
|
2024-08-21 22:45:19 +00:00
|
|
|
|
2024-08-23 23:28:29 +00:00
|
|
|
Result<void> vm_global_load(Opcode& oc);
|
|
|
|
|
2024-08-12 22:05:40 +00:00
|
|
|
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;
|
2024-08-17 22:22:21 +00:00
|
|
|
Stack _callstack;
|
2024-08-12 22:05:40 +00:00
|
|
|
Function _fun;
|
|
|
|
Array _code;
|
|
|
|
Array _constants;
|
2024-08-22 16:21:05 +00:00
|
|
|
Array _closure;
|
2024-08-23 23:28:29 +00:00
|
|
|
Dict _globals;
|
2024-08-12 22:05:40 +00:00
|
|
|
uint64_t _pc;
|
|
|
|
uint64_t _base;
|
2024-08-13 00:11:23 +00:00
|
|
|
Value _res;
|
2024-08-12 22:05:40 +00:00
|
|
|
};
|