luaur-code-gen 0.1.3

Native (A64/X64) code generation for Luau (Rust).
Documentation
use crate::enums::code_gen_compilation_result::CodeGenCompilationResult;
use crate::functions::bind_native_protos::bind_native_protos;
use crate::records::module_bind_result::ModuleBindResult;
use crate::records::native_module_ref::NativeModuleRef;
use crate::records::shared_code_gen_context::SharedCodeGenContext;
use crate::type_aliases::module_id::ModuleId;
use crate::type_aliases::native_proto_exec_data_ptr::NativeProtoExecDataPtr;
use alloc::vec::Vec;
use luaur_vm::records::proto::Proto;

impl SharedCodeGenContext {
    pub fn bind_module(
        &mut self,
        module_id: &Option<ModuleId>,
        module_protos: &Vec<*mut Proto>,
        native_protos: Vec<NativeProtoExecDataPtr>,
        data: *const u8,
        data_size: usize,
        code: *const u8,
        code_size: usize,
    ) -> ModuleBindResult {
        let (native_module_ref, _inserted): (NativeModuleRef, bool) =
            if let Some(module_id) = module_id {
                self.shared_allocator.get_or_insert_native_module(
                    module_id,
                    native_protos,
                    data,
                    data_size,
                    code,
                    code_size,
                )
            } else {
                (
                    self.shared_allocator.insert_anonymous_native_module(
                        native_protos,
                        data,
                        data_size,
                        code,
                        code_size,
                    ),
                    true,
                )
            };

        if native_module_ref.native_module_ref_empty() {
            return ModuleBindResult {
                compilation_result: CodeGenCompilationResult::AllocationFailed,
                functions_bound: 0,
            };
        }

        let native_module = unsafe { &*native_module_ref.native_module_ref_get() };
        let mut native_protos = native_module.native_module_get_native_protos().clone();
        let protos_bound = bind_native_protos(module_protos, &mut native_protos, false);
        native_module.native_module_add_refs(protos_bound as usize);

        ModuleBindResult {
            compilation_result: CodeGenCompilationResult::Success,
            functions_bound: protos_bound,
        }
    }
}