From 91af86cca23a3c66320c3e3389a1e9150741bcac Mon Sep 17 00:00:00 2001 From: Sasial <44125644+sasial-dev@users.noreply.github.com> Date: Tue, 5 Nov 2024 22:02:15 +1000 Subject: [PATCH 1/2] `IsA`, `ClassName` & `Parent` should work if an instance is already destroyed (#271) --- crates/lune-roblox/src/instance/base.rs | 12 ++++++------ crates/lune-roblox/src/instance/mod.rs | 5 +---- tests/roblox/instance/methods/ClearAllChildren.luau | 8 ++------ tests/roblox/instance/methods/Destroy.luau | 12 +++--------- 4 files changed, 12 insertions(+), 25 deletions(-) diff --git a/crates/lune-roblox/src/instance/base.rs b/crates/lune-roblox/src/instance/base.rs index 58a2ae78..4b737d3f 100644 --- a/crates/lune-roblox/src/instance/base.rs +++ b/crates/lune-roblox/src/instance/base.rs @@ -113,7 +113,6 @@ pub fn add_methods<'lua, M: LuaUserDataMethods<'lua, Instance>>(m: &mut M) { }, ); m.add_method("IsA", |_, this, class_name: String| { - ensure_not_destroyed(this)?; Ok(class_is_a(&this.class_name, class_name).unwrap_or(false)) }); m.add_method( @@ -217,19 +216,20 @@ fn instance_property_get<'lua>( this: &Instance, prop_name: String, ) -> LuaResult> { - ensure_not_destroyed(this)?; - match prop_name.as_str() { "ClassName" => return this.get_class_name().into_lua(lua), - "Name" => { - return this.get_name().into_lua(lua); - } "Parent" => { return this.get_parent().into_lua(lua); } _ => {} } + ensure_not_destroyed(this)?; + + if prop_name.as_str() == "Name" { + return this.get_name().into_lua(lua); + } + if let Some(info) = find_property_info(&this.class_name, &prop_name) { if let Some(prop) = this.get_property(&prop_name) { if let DomValue::Enum(enum_value) = prop { diff --git a/crates/lune-roblox/src/instance/mod.rs b/crates/lune-roblox/src/instance/mod.rs index 3397e095..120a5140 100644 --- a/crates/lune-roblox/src/instance/mod.rs +++ b/crates/lune-roblox/src/instance/mod.rs @@ -302,10 +302,7 @@ impl Instance { pub fn get_parent(&self) -> Option { let dom = INTERNAL_DOM.lock().expect("Failed to lock document"); - let parent_ref = dom - .get_by_ref(self.dom_ref) - .expect("Failed to find instance in document") - .parent(); + let parent_ref = dom.get_by_ref(self.dom_ref)?.parent(); if parent_ref == dom.root_ref() { None diff --git a/tests/roblox/instance/methods/ClearAllChildren.luau b/tests/roblox/instance/methods/ClearAllChildren.luau index ed6ec22d..01bd6b58 100644 --- a/tests/roblox/instance/methods/ClearAllChildren.luau +++ b/tests/roblox/instance/methods/ClearAllChildren.luau @@ -20,14 +20,10 @@ assert(not pcall(function() return child1.Name end)) -assert(not pcall(function() - return child1.Parent -end)) +assert(not child1.Parent) assert(not pcall(function() return child2.Name end)) -assert(not pcall(function() - return child2.Parent -end)) +assert(not child2.Parent) diff --git a/tests/roblox/instance/methods/Destroy.luau b/tests/roblox/instance/methods/Destroy.luau index aa18344d..bbffa07c 100644 --- a/tests/roblox/instance/methods/Destroy.luau +++ b/tests/roblox/instance/methods/Destroy.luau @@ -14,22 +14,16 @@ assert(not pcall(function() return root.Name end)) -assert(not pcall(function() - return root.Parent -end)) +assert(not root.Parent) assert(not pcall(function() return child.Name end)) -assert(not pcall(function() - return child.Parent -end)) +assert(not child.Parent) assert(not pcall(function() return descendant.Name end)) -assert(not pcall(function() - return descendant.Parent -end)) +assert(not descendant.Parent) From 5d1401cdf611cc9f215f03bdf16ada0e77717edf Mon Sep 17 00:00:00 2001 From: Qwreey Date: Tue, 5 Nov 2024 21:10:05 +0900 Subject: [PATCH 2/2] Add `process.endianness` constant (#267) --- crates/lune-std-process/src/lib.rs | 6 ++++++ types/process.luau | 19 +++++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/crates/lune-std-process/src/lib.rs b/crates/lune-std-process/src/lib.rs index b66bc0df..390f75dc 100644 --- a/crates/lune-std-process/src/lib.rs +++ b/crates/lune-std-process/src/lib.rs @@ -50,6 +50,11 @@ pub fn module(lua: &Lua) -> LuaResult { // Create constants for OS & processor architecture let os = lua.create_string(OS.to_lowercase())?; let arch = lua.create_string(ARCH.to_lowercase())?; + let endianness = lua.create_string(if cfg!(target_endian = "big") { + "big" + } else { + "little" + })?; // Create readonly args array let args_vec = lua .app_data_ref::>() @@ -75,6 +80,7 @@ pub fn module(lua: &Lua) -> LuaResult { TableBuilder::new(lua)? .with_value("os", os)? .with_value("arch", arch)? + .with_value("endianness", endianness)? .with_value("args", args_tab)? .with_value("cwd", cwd_str)? .with_value("env", env_tab)? diff --git a/types/process.luau b/types/process.luau index 6a4a12ec..9c436008 100644 --- a/types/process.luau +++ b/types/process.luau @@ -1,5 +1,6 @@ export type OS = "linux" | "macos" | "windows" export type Arch = "x86_64" | "aarch64" +export type Endianness = "big" | "little" export type SpawnOptionsStdioKind = "default" | "inherit" | "forward" | "none" export type SpawnOptionsStdio = { @@ -117,8 +118,8 @@ export type ChildProcess = { stdin: typeof(ChildProcessWriter), stdout: typeof(ChildProcessReader), stderr: typeof(ChildProcessReader), - kill: () -> (); - status: () -> { ok: boolean, code: number } + kill: () -> (), + status: () -> { ok: boolean, code: number }, } --[=[ @@ -222,6 +223,20 @@ process.os = (nil :: any) :: OS ]=] process.arch = (nil :: any) :: Arch +--[=[ + @within Process + @prop endianness Endianness + @tag read_only + + The endianness of the processor currently being used. + + Possible values: + + * `"big"` + * `"little"` +]=] +process.endianness = (nil :: any) :: Endianness + --[=[ @within Process @prop args { string }