luaur_code_gen/methods/
standalone_code_gen_context_bind_module.rs1use crate::enums::code_gen_compilation_result::CodeGenCompilationResult;
2use crate::functions::bind_native_protos::bind_native_protos;
3use crate::functions::get_native_proto_exec_data_header_native_proto_exec_data::get_native_proto_exec_data_header_mut;
4use crate::records::module_bind_result::ModuleBindResult;
5use crate::records::standalone_code_gen_context::StandaloneCodeGenContext;
6use crate::type_aliases::module_id::ModuleId;
7use crate::type_aliases::native_proto_exec_data_ptr::NativeProtoExecDataPtr;
8use alloc::vec::Vec;
9use luaur_common::FFlag;
10use luaur_vm::records::proto::Proto;
11
12impl StandaloneCodeGenContext {
13 pub fn bind_module(
14 &mut self,
15 _module_id: &Option<ModuleId>,
16 module_protos: &Vec<*mut Proto>,
17 mut native_protos: Vec<NativeProtoExecDataPtr>,
18 data: *const u8,
19 data_size: usize,
20 code: *const u8,
21 code_size: usize,
22 ) -> ModuleBindResult {
23 if FFlag::LuauCodegenFreeBlocks.get() {
24 let module_ref = self.shared_allocator.insert_anonymous_native_module(
25 native_protos,
26 data,
27 data_size,
28 code,
29 code_size,
30 );
31
32 if module_ref.native_module_ref_empty() {
33 return ModuleBindResult {
34 compilation_result: CodeGenCompilationResult::AllocationFailed,
35 functions_bound: 0,
36 };
37 }
38
39 let native_module = unsafe { &*module_ref.native_module_ref_get() };
40 let mut native_protos_for_bind =
41 native_module.native_module_get_native_protos().clone();
42 let protos_bound =
43 bind_native_protos(module_protos, &mut native_protos_for_bind, false);
44 native_module.native_module_add_refs(protos_bound as usize);
45
46 ModuleBindResult {
47 compilation_result: CodeGenCompilationResult::Success,
48 functions_bound: protos_bound,
49 }
50 } else {
51 let mut native_data = core::ptr::null_mut();
52 let mut native_data_size = 0usize;
53 let mut code_start = core::ptr::null_mut();
54
55 if !self.base.code_allocator.allocate_deprecated(
56 data,
57 data_size,
58 code,
59 code_size,
60 &mut native_data,
61 &mut native_data_size,
62 &mut code_start,
63 ) {
64 return ModuleBindResult {
65 compilation_result: CodeGenCompilationResult::AllocationFailed,
66 functions_bound: 0,
67 };
68 }
69
70 for native_proto in &native_protos {
71 unsafe {
72 let header = get_native_proto_exec_data_header_mut(native_proto.as_ptr());
73 (*header).entry_offset_or_address =
74 code_start.add((*header).entry_offset_or_address as usize);
75 }
76 }
77
78 let protos_bound = bind_native_protos(module_protos, &mut native_protos, true);
79
80 ModuleBindResult {
81 compilation_result: CodeGenCompilationResult::Success,
82 functions_bound: protos_bound,
83 }
84 }
85 }
86}