refactor: improve functions

Closes: #49
This commit is contained in:
2026-07-08 00:19:37 +02:00
parent 7de645d323
commit d49b4f5bc7
10 changed files with 188 additions and 122 deletions
+8 -5
View File
@@ -2,6 +2,7 @@
#include "furlang/ir/function.hpp"
#include "furlang/ir/instruction.hpp"
#include "furvm/function.hpp"
#include "furvm/fwd.hpp"
#include <furvm/instruction.hpp>
@@ -20,12 +21,14 @@ furvm::mod furvm_generator::generate(furlang::ir::mod& mod) {
}
void furvm_generator::generate_function(furvm::mod& mod, const furlang::ir::function& function) {
furvm::function_sig signature; // TODO: Complete
switch (function.type()) {
case furlang::ir::function_t::Normal: {
if (function.access() == furlang::ir::function_access_t::Public)
mod.emplace_function_named(function.name(), function.param_count(), mod.bytecode().size()).dispatch();
mod.emplace_function(function.name(), std::move(signature), mod.bytecode().size()).dispatch();
else
mod.emplace_function(function.param_count(), mod.bytecode().size()).dispatch();
mod.emplace_function(std::move(signature), mod.bytecode().size()).dispatch();
function_context ctx;
for (furlang::ir::block_index idx = 0; idx < function.blocks().size(); ++idx) {
@@ -48,9 +51,9 @@ void furvm_generator::generate_function(furvm::mod& mod, const furlang::ir::func
} break;
case furlang::ir::function_t::Native: {
if (function.access() == furlang::ir::function_access_t::Public)
mod.emplace_function_named(function.name(), function.param_count(), function.name()).dispatch();
mod.emplace_function(function.name(), std::move(signature), function.name()).dispatch();
else
mod.emplace_function(function.param_count(), function.name()).dispatch();
mod.emplace_function(std::move(signature), function.name()).dispatch();
} break;
}
}
@@ -150,7 +153,7 @@ void furvm_generator::generate_instruction(furvm::mod& mod,
const auto& call = dynamic_cast<const furlang::ir::call_instruction&>(instr);
// TODO: Implement a queue for unknown functions
furvm::function_id func = mod.function_at(call.name()).id();
furvm::function_id func = mod.function_at(call.name(), furvm::function_sig{}).id(); // TODO: Complete
mod.bytecode().push_back(static_cast<furvm::byte>(furvm::instruction_t::Call));
mod.bytecode().push_back((func >> 0) & 0xFF);
mod.bytecode().push_back((func >> 8) & 0xFF);