Phasor 2.2.0
Stack VM based Programming Language
Loading...
Searching...
No Matches
VM.hpp
Go to the documentation of this file.
1#pragma once
3#include "../Value.hpp"
4#include <vector>
5#include <filesystem>
6#include <functional>
7#include <map>
8#include <array>
9#include "core/core.h"
10
12namespace Phasor
13{
14
17class VM
18{
19 public:
21 void run(const Bytecode &bytecode);
22
24 using NativeFunction = std::function<Value(const std::vector<Value> &args, VM *vm)>;
25
27 void registerNativeFunction(const std::string &name, NativeFunction fn);
28
29 using ImportHandler = std::function<void(const std::filesystem::path &path)>;
30 void setImportHandler(ImportHandler handler);
31
33 void freeVariable(const size_t index);
34
38 size_t addVariable(const Value &value);
39
43 void setVariable(const size_t index, const Value &value);
44
46 Value getVariable(const size_t index);
47
49 size_t getVariableCount();
50
54 void setRegister(uint8_t index, const Value &value);
55
58 void freeRegister(uint8_t index);
59
63 Value getRegister(uint8_t index);
64
67 size_t getRegisterCount();
68
71 {
97 r25 // If you are here to try adding more, step back and think about what got you here in the first place
98 };
99
101 Value operation(const OpCode &op, const int &operand1 = 0, const int &operand2 = 0, const int &operand3 = 0,
102 const int &operand4 = 0, const int &operand5 = 0);
103
105 void push(const Value &value);
106
108 Value pop();
109
111 Value peek();
112
114 void reset(const bool &resetStack = true, const bool &resetFunctions = true, const bool &resetVariables = true);
115
117 std::string getInformation();
118
120 void log(const Value &msg);
121 void logerr(const Value &msg);
122
123 private:
126
128 std::array<Value, 256> registers;
129
131 std::vector<Value> stack;
132
134 std::vector<int> callStack;
135
137 std::vector<Value> variables;
138
141
143 size_t pc = 0;
144
146 std::map<std::string, NativeFunction> nativeFunctions;
147};
148} // namespace Phasor
Virtual Machine.
Definition VM.hpp:18
ImportHandler importHandler
Import handler for loading modules.
Definition VM.hpp:125
std::vector< Value > variables
Variable storage indexed by variable index.
Definition VM.hpp:137
std::function< Value(const std::vector< Value > &args, VM *vm)> NativeFunction
Native function signature.
Definition VM.hpp:24
Value pop()
Pop a value from the stack.
Definition VM.cpp:884
std::function< void(const std::filesystem::path &path)> ImportHandler
Definition VM.hpp:29
void logerr(const Value &msg)
Definition VM.cpp:1006
std::vector< Value > stack
Stack for function calls.
Definition VM.hpp:131
std::array< Value, 256 > registers
Virtual registers for register-based operations (v2.0).
Definition VM.hpp:128
std::vector< int > callStack
Call stack for function calls.
Definition VM.hpp:134
std::map< std::string, NativeFunction > nativeFunctions
Native function registry.
Definition VM.hpp:146
void registerNativeFunction(const std::string &name, NativeFunction fn)
Register a native function.
Definition VM.cpp:869
Value getRegister(uint8_t index)
Get a register value.
Definition VM.cpp:970
size_t getVariableCount()
Get the number of variables in the VM.
Definition VM.cpp:955
void log(const Value &msg)
Use the VM's logging via print opcode.
Definition VM.cpp:1000
size_t addVariable(const Value &value)
Add a variable to the VM.
Definition VM.cpp:923
void freeVariable(const size_t index)
Free a variable in the VM.
Definition VM.cpp:929
size_t pc
Program counter.
Definition VM.hpp:143
void setVariable(const size_t index, const Value &value)
Set a variable in the VM.
Definition VM.cpp:937
void push(const Value &value)
Push a value onto the stack.
Definition VM.cpp:879
void setRegister(uint8_t index, const Value &value)
Set a register value.
Definition VM.cpp:960
void setImportHandler(ImportHandler handler)
Definition VM.cpp:874
void freeRegister(uint8_t index)
Free a register (reset to null).
Definition VM.cpp:965
void run(const Bytecode &bytecode)
Run the virtual machine.
Definition VM.cpp:9
const Bytecode * bytecode
Bytecode to execute.
Definition VM.hpp:140
Value getVariable(const size_t index)
Get a variable from the VM.
Definition VM.cpp:946
Value operation(const OpCode &op, const int &operand1=0, const int &operand2=0, const int &operand3=0, const int &operand4=0, const int &operand5=0)
Execute a single operation.
Definition VM.cpp:26
Register
Enum for lower 26 registers.
Definition VM.hpp:71
@ r11
Definition VM.hpp:83
@ r17
Definition VM.hpp:89
@ r10
Definition VM.hpp:82
@ r19
Definition VM.hpp:91
@ r21
Definition VM.hpp:93
@ r25
Definition VM.hpp:97
@ r13
Definition VM.hpp:85
@ r12
Definition VM.hpp:84
@ r22
Definition VM.hpp:94
@ r24
Definition VM.hpp:96
@ r18
Definition VM.hpp:90
@ r20
Definition VM.hpp:92
@ r16
Definition VM.hpp:88
@ r15
Definition VM.hpp:87
@ r14
Definition VM.hpp:86
@ r23
Definition VM.hpp:95
Value peek()
Peek at the top value on the stack.
Definition VM.cpp:895
size_t getRegisterCount()
Get the total number of registers.
Definition VM.cpp:975
void reset(const bool &resetStack=true, const bool &resetFunctions=true, const bool &resetVariables=true)
Reset the virtual machine.
Definition VM.cpp:904
std::string getInformation()
Get VM information for debugging.
Definition VM.cpp:980
A value in the Phasor VM.
Definition Value.hpp:33
The Phasor Programming Language and Runtime.
Definition AST.hpp:8
Complete bytecode structure.
Definition CodeGen.hpp:201