Skip to main content

luaur_code_gen/methods/
standalone_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::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}