luaur_code_gen/methods/
shared_code_gen_context_bind_module.rs1use 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}