Skip to main content

luaur_code_gen/methods/
shared_code_gen_context_bind_module.rs

1use crate::enums::code_gen_compilation_result::CodeGenCompilationResult;
2use crate::functions::bind_native_protos::bind_native_protos;
3use crate::records::module_bind_result::ModuleBindResult;
4use crate::records::native_module_ref::NativeModuleRef;
5use crate::records::shared_code_gen_context::SharedCodeGenContext;
6use crate::type_aliases::module_id::ModuleId;
7use crate::type_aliases::native_proto_exec_data_ptr::NativeProtoExecDataPtr;
8use alloc::vec::Vec;
9use luaur_vm::records::proto::Proto;
10
11impl SharedCodeGenContext {
12    pub fn bind_module(
13        &mut self,
14        module_id: &Option<ModuleId>,
15        module_protos: &Vec<*mut Proto>,
16        native_protos: Vec<NativeProtoExecDataPtr>,
17        data: *const u8,
18        data_size: usize,
19        code: *const u8,
20        code_size: usize,
21    ) -> ModuleBindResult {
22        let (native_module_ref, _inserted): (NativeModuleRef, bool) =
23            if let Some(module_id) = module_id {
24                self.shared_allocator.get_or_insert_native_module(
25                    module_id,
26                    native_protos,
27                    data,
28                    data_size,
29                    code,
30                    code_size,
31                )
32            } else {
33                (
34                    self.shared_allocator.insert_anonymous_native_module(
35                        native_protos,
36                        data,
37                        data_size,
38                        code,
39                        code_size,
40                    ),
41                    true,
42                )
43            };
44
45        if native_module_ref.native_module_ref_empty() {
46            return ModuleBindResult {
47                compilation_result: CodeGenCompilationResult::AllocationFailed,
48                functions_bound: 0,
49            };
50        }
51
52        let native_module = unsafe { &*native_module_ref.native_module_ref_get() };
53        let mut native_protos = native_module.native_module_get_native_protos().clone();
54        let protos_bound = bind_native_protos(module_protos, &mut native_protos, false);
55        native_module.native_module_add_refs(protos_bound as usize);
56
57        ModuleBindResult {
58            compilation_result: CodeGenCompilationResult::Success,
59            functions_bound: protos_bound,
60        }
61    }
62}