feat(furvm): introduce global variables

Closes: #59
This commit is contained in:
2026-08-14 13:56:10 +02:00
parent 84b70077c1
commit a685ecf226
5 changed files with 56 additions and 0 deletions
+6
View File
@@ -326,6 +326,12 @@ void executor::step() {
case instruction_t::Store: {
store_thing(instr.arg.u16, std::move(pop_thing()));
} break;
case instruction_t::LoadGlobal: {
push_thing(make_reference(frame.mod->load_global_variable(instr.arg.u16)));
} break;
case instruction_t::StoreGlobal: {
frame.mod->store_global_variable(instr.arg.u16, std::move(pop_thing()));
} break;
case instruction_t::Call: {
push_frame(frame.mod, *frame.mod->function_at(instr.arg.u16));
} break;
+8
View File
@@ -27,6 +27,8 @@ const std::size_t instruction_argument::s_sizes[instruction_argument::Count] = {
4,
// Variable:
2,
// GlobalVariable:
2,
// Function:
4,
// Offset:
@@ -54,6 +56,8 @@ const bool instruction_argument::s_signedness[instruction_argument::Count] = {
false,
// Variable:
false,
// GlobalVariable:
false,
// Function:
false,
// Offset:
@@ -125,6 +129,10 @@ const instruction_argument_t instruction::s_arguments[instruction::Count] = {
instruction_argument::Variable,
// Store:
instruction_argument::Variable,
// LoadGlobal:
instruction_argument::GlobalVariable,
// StoreGlobal:
instruction_argument::GlobalVariable,
// Call:
instruction_argument::Function,
// Jump:
+6
View File
@@ -88,6 +88,8 @@ std::ostream& mod::serialize(std::ostream& os) const {
}
}
detail::serialize(os, static_cast<std::uint16_t>(m_globalVariables.size()));
detail::serialize(os, std::uint64_t(m_bytecode.size()));
return os.write(reinterpret_cast<const char*>(m_bytecode.data()), static_cast<std::streamsize>(m_bytecode.size()));
}
@@ -197,6 +199,10 @@ mod mod::load(std::istream& is) {
}
}
std::uint16_t globalVariables = 0;
detail::load(is, globalVariables);
mod.set_global_variable_count(globalVariables);
std::uint64_t bytecodeLength = 0;
detail::load(is, bytecodeLength);
mod.bytecode().resize(bytecodeLength);