Skip to main content

luaur_code_gen/methods/
native_module_try_get_native_proto.rs

1use crate::functions::get_native_proto_exec_data_header_native_proto_exec_data_alt_b::get_native_proto_exec_data_header;
2use crate::macros::codegen_assert::CODEGEN_ASSERT;
3use crate::records::native_module::NativeModule;
4
5impl NativeModule {
6    pub fn native_module_try_get_native_proto(&self, bytecode_id: u32) -> *const u32 {
7        let mut lo = 0usize;
8        let mut hi = self.native_protos.len();
9
10        while lo < hi {
11            let mid = lo + (hi - lo) / 2;
12            let mid_bytecode_id = unsafe {
13                (*get_native_proto_exec_data_header(self.native_protos[mid].as_ptr())).bytecode_id
14            };
15
16            if mid_bytecode_id < bytecode_id {
17                lo = mid + 1;
18            } else {
19                hi = mid;
20            }
21        }
22
23        if lo == self.native_protos.len() {
24            return core::ptr::null();
25        }
26
27        let found_bytecode_id = unsafe {
28            (*get_native_proto_exec_data_header(self.native_protos[lo].as_ptr())).bytecode_id
29        };
30        if found_bytecode_id != bytecode_id {
31            return core::ptr::null();
32        }
33
34        if lo + 1 < self.native_protos.len() {
35            let next_bytecode_id = unsafe {
36                (*get_native_proto_exec_data_header(self.native_protos[lo + 1].as_ptr()))
37                    .bytecode_id
38            };
39            CODEGEN_ASSERT!(next_bytecode_id != bytecode_id);
40        }
41
42        self.native_protos[lo].as_ptr()
43    }
44}