From 317ce7caa6984b5fda0282308b2e269ece26ae7a Mon Sep 17 00:00:00 2001 From: Alex Orlenko Date: Sat, 4 May 2024 21:15:22 +0100 Subject: [PATCH] Add `Lua::set_fflag()` to control Luau feature flags --- mlua-sys/src/luau/lua.rs | 5 +++++ src/lua.rs | 14 ++++++++++++++ tests/luau.rs | 6 ++++++ 3 files changed, 25 insertions(+) diff --git a/mlua-sys/src/luau/lua.rs b/mlua-sys/src/luau/lua.rs index 3db6a7b..a2077e1 100644 --- a/mlua-sys/src/luau/lua.rs +++ b/mlua-sys/src/luau/lua.rs @@ -553,3 +553,8 @@ pub struct lua_Callbacks { extern "C" { pub fn lua_callbacks(L: *mut lua_State) -> *mut lua_Callbacks; } + +// Functions from customization lib +extern "C" { + pub fn luau_setfflag(name: *const c_char, value: c_int) -> c_int; +} diff --git a/src/lua.rs b/src/lua.rs index 35bdf4b..6def0c0 100644 --- a/src/lua.rs +++ b/src/lua.rs @@ -1288,6 +1288,20 @@ impl Lua { unsafe { (*self.extra.get()).enable_jit = enable }; } + /// Sets Luau feature flag (global setting). + /// + /// See https://github.com/luau-lang/luau/blob/master/CONTRIBUTING.md#feature-flags for details. + #[cfg(feature = "luau")] + #[doc(hidden)] + pub fn set_fflag(name: &str, enabled: bool) -> StdResult<(), ()> { + if let Ok(name) = CString::new(name) { + if unsafe { ffi::luau_setfflag(name.as_ptr(), enabled as c_int) != 0 } { + return Ok(()); + } + } + Err(()) + } + /// Returns Lua source code as a `Chunk` builder type. /// /// In order to actually compile or run the resulting code, you must call [`Chunk::exec`] or diff --git a/tests/luau.rs b/tests/luau.rs index aedcc53..29af6cf 100644 --- a/tests/luau.rs +++ b/tests/luau.rs @@ -484,3 +484,9 @@ fn test_buffer() -> Result<()> { Ok(()) } + +#[test] +fn test_fflags() { + // We cannot really on any particular feature flag to be present + assert!(Lua::set_fflag("UnknownFlag", true).is_err()); +}