Skip to content

Commit 705a677

Browse files
committed
Don't leak T if FromLua for [T; N] fails
1 parent f3765d1 commit 705a677

1 file changed

Lines changed: 14 additions & 10 deletions

File tree

src/conversion.rs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -902,17 +902,21 @@ where
902902
fn from_lua(value: Value, _lua: &Lua) -> Result<Self> {
903903
match value {
904904
#[cfg(feature = "luau")]
905-
#[rustfmt::skip]
906-
Value::Vector(v) if N == crate::Vector::SIZE => unsafe {
907-
use std::{mem, ptr};
908-
let mut arr: [mem::MaybeUninit<T>; N] = mem::MaybeUninit::uninit().assume_init();
909-
ptr::write(arr[0].as_mut_ptr() , T::from_lua(Value::Number(v.x() as _), _lua)?);
910-
ptr::write(arr[1].as_mut_ptr(), T::from_lua(Value::Number(v.y() as _), _lua)?);
911-
ptr::write(arr[2].as_mut_ptr(), T::from_lua(Value::Number(v.z() as _), _lua)?);
905+
Value::Vector(v) if N == crate::Vector::SIZE => {
906+
use std::mem::MaybeUninit;
907+
let x = T::from_lua(Value::Number(v.x() as _), _lua)?;
908+
let y = T::from_lua(Value::Number(v.y() as _), _lua)?;
909+
let z = T::from_lua(Value::Number(v.z() as _), _lua)?;
912910
#[cfg(feature = "luau-vector4")]
913-
ptr::write(arr[3].as_mut_ptr(), T::from_lua(Value::Number(v.w() as _), _lua)?);
914-
Ok(mem::transmute_copy(&arr))
915-
},
911+
let w = T::from_lua(Value::Number(v.w() as _), _lua)?;
912+
let mut arr: [MaybeUninit<T>; N] = [const { MaybeUninit::uninit() }; N];
913+
arr[0].write(x);
914+
arr[1].write(y);
915+
arr[2].write(z);
916+
#[cfg(feature = "luau-vector4")]
917+
arr[3].write(w);
918+
Ok(arr.map(|e| unsafe { e.assume_init() }))
919+
}
916920
Value::Table(table) => {
917921
let vec = table.sequence_values().collect::<Result<Vec<_>>>()?;
918922
vec.try_into().map_err(|vec: Vec<T>| {

0 commit comments

Comments
 (0)