Skip to main content

luaur_cli_lib/functions/
set_luau_flag.rs

1use 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                    // Compare against "<flag_name><version_decimal>" without allocations.
39                    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        // Match original behavior: only warn for flags that look like Luau flags, and skip experimental flags.
55        if name.as_bytes().starts_with(b"Luau") && !isAnalysisFlagExperimental(name_ptr) {
56            eprintln!("Warning: unrecognized flag '{}'.", name);
57        }
58    }
59}