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