luaur_cli_lib/functions/
set_luau_flag.rs1use core::ffi::c_char;
2use core::sync::atomic::Ordering;
3
4use luaur_common::functions::is_analysis_flag_experimental::isAnalysisFlagExperimental;
5use luaur_common::records::f_value::{FValue, FValueList};
6
7pub fn set_luau_flag(name: &str, state: bool) {
8 let name_ptr = name.as_ptr() as *const c_char;
9
10 unsafe {
11 let mut flag_ptr = <bool as FValueList>::head().load(Ordering::Relaxed);
12
13 #[repr(C)]
14 struct FValueLayout<T> {
15 value: core::cell::UnsafeCell<T>,
16 dynamic: bool,
17 name: *const c_char,
18 next: core::cell::UnsafeCell<*const FValue<T>>,
19 version: core::ffi::c_uint,
20 }
21
22 while !flag_ptr.is_null() {
23 let flag: &FValue<bool> = &*flag_ptr;
24
25 let layout = &*(flag_ptr as *const FValueLayout<bool>);
26 let flag_name_ptr = layout.name;
27
28 if !flag_name_ptr.is_null() {
29 let flag_name_bytes = core::ffi::CStr::from_ptr(flag_name_ptr).to_bytes();
30
31 if name.as_bytes() == flag_name_bytes {
32 flag.set(state);
33 return;
34 }
35
36 let version = flag.version();
37 if version != 0 {
38 let version_bytes = version.to_string();
40
41 if name.as_bytes().len() == flag_name_bytes.len() + version_bytes.len()
42 && name.as_bytes()[..flag_name_bytes.len()] == *flag_name_bytes
43 && name.as_bytes()[flag_name_bytes.len()..] == *version_bytes.as_bytes()
44 {
45 flag.set(state);
46 return;
47 }
48 }
49 }
50
51 flag_ptr = *layout.next.get() as *mut FValue<bool>;
52 }
53
54 if name.as_bytes().starts_with(b"Luau") && !isAnalysisFlagExperimental(name_ptr) {
56 eprintln!("Warning: unrecognized flag '{}'.", name);
57 }
58 }
59}