Support `readonly` table attribute (luau)

This commit is contained in:
Alex Orlenko 2022-03-22 21:33:29 +00:00
parent 3a9c8c2da2
commit 0a3b65af88
No known key found for this signature in database
GPG Key ID: 4C150C250863B96D
2 changed files with 41 additions and 1 deletions

View File

@ -348,6 +348,26 @@ impl<'lua> Table<'lua> {
}
}
/// Sets `readonly` attribute on the table.
///
/// Requires `feature = "luau"`
#[cfg(feature = "luau")]
pub fn set_readonly(&self, enabled: bool) {
let lua = self.0.lua;
unsafe {
lua.ref_thread_exec(|refthr| ffi::lua_setreadonly(refthr, self.0.index, enabled as _));
}
}
/// Returns `readonly` attribute of the table.
///
/// Requires `feature = "luau"`
#[cfg(feature = "luau")]
pub fn is_readonly(&self) -> bool {
let lua = self.0.lua;
unsafe { lua.ref_thread_exec(|refthr| ffi::lua_getreadonly(refthr, self.0.index) != 0) }
}
/// Consume this table and return an iterator over the pairs of the table.
///
/// This works like the Lua `pairs` function, but does not invoke the `__pairs` metamethod.

View File

@ -3,7 +3,7 @@
use std::env;
use std::fs;
use mlua::{Lua, Result, Value};
use mlua::{Error, Lua, Result, Value};
#[test]
fn test_require() -> Result<()> {
@ -47,3 +47,23 @@ fn test_vectors() -> Result<()> {
Ok(())
}
#[test]
fn test_readonly_table() -> Result<()> {
let lua = Lua::new();
let t = lua.create_table()?;
assert!(!t.is_readonly());
t.set_readonly(true);
assert!(t.is_readonly());
match t.set("key", "value") {
Err(Error::RuntimeError(err)) if err.contains("Attempt to modify a readonly table") => {}
r => panic!(
"expected RuntimeError(...) with a specific message, got {:?}",
r
),
};
Ok(())
}