diff --git a/lib/roblox_emulator/src/runner/cframe.rs b/lib/roblox_emulator/src/runner/cframe.rs
index 5eb7116..5de90e9 100644
--- a/lib/roblox_emulator/src/runner/cframe.rs
+++ b/lib/roblox_emulator/src/runner/cframe.rs
@@ -1,3 +1,4 @@
+use super::util::coerce_float32;
 use super::vector3::Vector3;
 
 #[derive(Clone,Copy)]
@@ -93,11 +94,11 @@ pub fn set_globals(lua:&mlua::Lua,globals:&mlua::Table)->Result<(),mlua::Error>{
 			},
 			//CFrame.new(x,y,z)
 			(
-				mlua::Value::Number(x),mlua::Value::Number(y),Some(z),
+				x,y,Some(z),
 				None,None,None,
 				None,None,None,
 				None,None,None,
-			)=>Ok(CFrame::point(x as f32,y as f32,z)),
+			)=>Ok(CFrame::point(coerce_float32(&x)?,coerce_float32(&y)?,z)),
 			//CFrame.new(x,y,z,xx,yx,zx,xy,yy,zy,xz,yz,zz)
 			(
 				mlua::Value::Number(x),mlua::Value::Number(y),Some(z),
diff --git a/lib/roblox_emulator/src/runner/instance/instance.rs b/lib/roblox_emulator/src/runner/instance/instance.rs
index c2c4a16..7a6053c 100644
--- a/lib/roblox_emulator/src/runner/instance/instance.rs
+++ b/lib/roblox_emulator/src/runner/instance/instance.rs
@@ -5,6 +5,7 @@ use rbx_types::Ref;
 use rbx_dom_weak::{Ustr,InstanceBuilder,WeakDom};
 
 use crate::runner::vector3::Vector3;
+use crate::runner::util::coerce_float32;
 
 // disallow non-static lifetimes
 fn static_ustr(s:&'static str)->rbx_dom_weak::Ustr{
@@ -40,13 +41,6 @@ pub fn dom_mut<T>(lua:&mlua::Lua,mut f:impl FnMut(&mut WeakDom)->mlua::Result<T>
 	f(*dom)
 }
 
-fn coerce_float32(value:&mlua::Value)->Option<f32>{
-	match value{
-		&mlua::Value::Integer(i)=>Some(i as f32),
-		&mlua::Value::Number(f)=>Some(f as f32),
-		_=>None,
-	}
-}
 pub fn class_is_a(class:&str,superclass:&str)->bool{
 	let db=rbx_reflection_database::get();
 	let (Some(class),Some(superclass))=(db.classes.get(class),db.classes.get(superclass))else{
@@ -304,7 +298,7 @@ impl mlua::UserData for Instance{
 						rbx_types::Variant::Vector3(typed_value.into())
 					},
 					rbx_reflection::DataType::Value(rbx_types::VariantType::Float32)=>{
-						let typed_value:f32=coerce_float32(&value).ok_or_else(||mlua::Error::runtime("Expected f32"))?;
+						let typed_value:f32=coerce_float32(&value)?;
 						rbx_types::Variant::Float32(typed_value)
 					},
 					rbx_reflection::DataType::Enum(enum_name)=>{
diff --git a/lib/roblox_emulator/src/runner/mod.rs b/lib/roblox_emulator/src/runner/mod.rs
index 2b178b6..de23097 100644
--- a/lib/roblox_emulator/src/runner/mod.rs
+++ b/lib/roblox_emulator/src/runner/mod.rs
@@ -1,6 +1,7 @@
 #[macro_use]
 mod macros;
 mod runner;
+mod util;
 
 mod r#enum;
 mod udim;
diff --git a/lib/roblox_emulator/src/runner/util.rs b/lib/roblox_emulator/src/runner/util.rs
new file mode 100644
index 0000000..6e92474
--- /dev/null
+++ b/lib/roblox_emulator/src/runner/util.rs
@@ -0,0 +1,7 @@
+pub fn coerce_float32(value:&mlua::Value)->mlua::Result<f32>{
+	match value{
+		&mlua::Value::Integer(i)=>Ok(i as f32),
+		&mlua::Value::Number(f)=>Ok(f as f32),
+		_=>Err(mlua::Error::runtime("Expected f32")),
+	}
+}