Skip to content

Commit a3cd25d

Browse files
committed
Support Luau 0.650 native vector library
1 parent a4bfeb7 commit a3cd25d

File tree

5 files changed

+39
-51
lines changed

5 files changed

+39
-51
lines changed

src/luau/mod.rs

+1-17
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use std::ffi::CStr;
2-
use std::os::raw::{c_float, c_int};
2+
use std::os::raw::c_int;
33

44
use crate::error::Result;
55
use crate::state::Lua;
@@ -11,7 +11,6 @@ impl Lua {
1111
let globals = self.globals();
1212

1313
globals.raw_set("collectgarbage", self.create_c_function(lua_collectgarbage)?)?;
14-
globals.raw_set("vector", self.create_c_function(lua_vector)?)?;
1514

1615
// Set `_VERSION` global to include version number
1716
// The environment variable `LUAU_VERSION` set by the build script
@@ -65,21 +64,6 @@ unsafe extern "C-unwind" fn lua_collectgarbage(state: *mut ffi::lua_State) -> c_
6564
}
6665
}
6766

68-
// Luau vector datatype constructor
69-
unsafe extern "C-unwind" fn lua_vector(state: *mut ffi::lua_State) -> c_int {
70-
let x = ffi::luaL_checknumber(state, 1) as c_float;
71-
let y = ffi::luaL_checknumber(state, 2) as c_float;
72-
let z = ffi::luaL_checknumber(state, 3) as c_float;
73-
#[cfg(feature = "luau-vector4")]
74-
let w = ffi::luaL_checknumber(state, 4) as c_float;
75-
76-
#[cfg(not(feature = "luau-vector4"))]
77-
ffi::lua_pushvector(state, x, y, z);
78-
#[cfg(feature = "luau-vector4")]
79-
ffi::lua_pushvector(state, x, y, z, w);
80-
1
81-
}
82-
8367
pub(crate) use package::register_package_module;
8468

8569
mod package;

src/state/raw.rs

+14-9
Original file line numberDiff line numberDiff line change
@@ -1347,6 +1347,12 @@ unsafe fn load_std_libs(state: *mut ffi::lua_State, libs: StdLib) -> Result<()>
13471347
ffi::lua_pop(state, 1);
13481348
}
13491349

1350+
#[cfg(feature = "luau")]
1351+
if libs.contains(StdLib::VECTOR) {
1352+
requiref(state, ffi::LUA_VECLIBNAME, ffi::luaopen_vector, 1)?;
1353+
ffi::lua_pop(state, 1);
1354+
}
1355+
13501356
if libs.contains(StdLib::MATH) {
13511357
requiref(state, ffi::LUA_MATHLIBNAME, ffi::luaopen_math, 1)?;
13521358
ffi::lua_pop(state, 1);
@@ -1369,16 +1375,15 @@ unsafe fn load_std_libs(state: *mut ffi::lua_State, libs: StdLib) -> Result<()>
13691375
}
13701376

13711377
#[cfg(feature = "luajit")]
1372-
{
1373-
if libs.contains(StdLib::JIT) {
1374-
requiref(state, ffi::LUA_JITLIBNAME, ffi::luaopen_jit, 1)?;
1375-
ffi::lua_pop(state, 1);
1376-
}
1378+
if libs.contains(StdLib::JIT) {
1379+
requiref(state, ffi::LUA_JITLIBNAME, ffi::luaopen_jit, 1)?;
1380+
ffi::lua_pop(state, 1);
1381+
}
13771382

1378-
if libs.contains(StdLib::FFI) {
1379-
requiref(state, ffi::LUA_FFILIBNAME, ffi::luaopen_ffi, 1)?;
1380-
ffi::lua_pop(state, 1);
1381-
}
1383+
#[cfg(feature = "luajit")]
1384+
if libs.contains(StdLib::FFI) {
1385+
requiref(state, ffi::LUA_FFILIBNAME, ffi::luaopen_ffi, 1)?;
1386+
ffi::lua_pop(state, 1);
13821387
}
13831388

13841389
Ok(())

src/stdlib.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,17 @@ impl StdLib {
4848
#[cfg_attr(docsrs, doc(cfg(feature = "luau")))]
4949
pub const BUFFER: StdLib = StdLib(1 << 9);
5050

51+
/// [`vector`](https://luau-lang.org/library#vector-library) library
52+
#[cfg(any(feature = "luau", doc))]
53+
#[cfg_attr(docsrs, doc(cfg(feature = "luau")))]
54+
pub const VECTOR: StdLib = StdLib(1 << 10);
55+
5156
/// [`jit`](http://luajit.org/ext_jit.html) library
5257
///
5358
/// Requires `feature = "luajit"`
5459
#[cfg(any(feature = "luajit", doc))]
5560
#[cfg_attr(docsrs, doc(cfg(feature = "luajit")))]
56-
pub const JIT: StdLib = StdLib(1 << 9);
61+
pub const JIT: StdLib = StdLib(1 << 11);
5762

5863
/// (**unsafe**) [`ffi`](http://luajit.org/ext_ffi.html) library
5964
///

tests/luau.rs

+14-10
Original file line numberDiff line numberDiff line change
@@ -97,17 +97,19 @@ fn test_require() -> Result<()> {
9797
fn test_vectors() -> Result<()> {
9898
let lua = Lua::new();
9999

100-
let v: Vector = lua.load("vector(1, 2, 3) + vector(3, 2, 1)").eval()?;
100+
let v: Vector = lua
101+
.load("vector.create(1, 2, 3) + vector.create(3, 2, 1)")
102+
.eval()?;
101103
assert_eq!(v, [4.0, 4.0, 4.0]);
102104

103105
// Test conversion into Rust array
104-
let v: [f64; 3] = lua.load("vector(1, 2, 3)").eval()?;
106+
let v: [f64; 3] = lua.load("vector.create(1, 2, 3)").eval()?;
105107
assert!(v == [1.0, 2.0, 3.0]);
106108

107109
// Test vector methods
108110
lua.load(
109111
r#"
110-
local v = vector(1, 2, 3)
112+
local v = vector.create(1, 2, 3)
111113
assert(v.x == 1)
112114
assert(v.y == 2)
113115
assert(v.z == 3)
@@ -118,7 +120,7 @@ fn test_vectors() -> Result<()> {
118120
// Test vector methods (fastcall)
119121
lua.load(
120122
r#"
121-
local v = vector(1, 2, 3)
123+
local v = vector.create(1, 2, 3)
122124
assert(v.x == 1)
123125
assert(v.y == 2)
124126
assert(v.z == 3)
@@ -135,17 +137,19 @@ fn test_vectors() -> Result<()> {
135137
fn test_vectors() -> Result<()> {
136138
let lua = Lua::new();
137139

138-
let v: Vector = lua.load("vector(1, 2, 3, 4) + vector(4, 3, 2, 1)").eval()?;
140+
let v: Vector = lua
141+
.load("vector.create(1, 2, 3, 4) + vector.create(4, 3, 2, 1)")
142+
.eval()?;
139143
assert_eq!(v, [5.0, 5.0, 5.0, 5.0]);
140144

141145
// Test conversion into Rust array
142-
let v: [f64; 4] = lua.load("vector(1, 2, 3, 4)").eval()?;
146+
let v: [f64; 4] = lua.load("vector.create(1, 2, 3, 4)").eval()?;
143147
assert!(v == [1.0, 2.0, 3.0, 4.0]);
144148

145149
// Test vector methods
146150
lua.load(
147151
r#"
148-
local v = vector(1, 2, 3, 4)
152+
local v = vector.create(1, 2, 3, 4)
149153
assert(v.x == 1)
150154
assert(v.y == 2)
151155
assert(v.z == 3)
@@ -157,7 +161,7 @@ fn test_vectors() -> Result<()> {
157161
// Test vector methods (fastcall)
158162
lua.load(
159163
r#"
160-
local v = vector(1, 2, 3, 4)
164+
local v = vector.create(1, 2, 3, 4)
161165
assert(v.x == 1)
162166
assert(v.y == 2)
163167
assert(v.z == 3)
@@ -180,10 +184,10 @@ fn test_vector_metatable() -> Result<()> {
180184
r#"
181185
{
182186
__index = {
183-
new = vector,
187+
new = vector.create,
184188
185189
product = function(a, b)
186-
return vector(a.x * b.x, a.y * b.y, a.z * b.z)
190+
return vector.create(a.x * b.x, a.y * b.y, a.z * b.z)
187191
end
188192
}
189193
}

tests/serde.rs

+4-14
Original file line numberDiff line numberDiff line change
@@ -133,13 +133,7 @@ fn test_serialize_failure() -> Result<(), Box<dyn StdError>> {
133133
fn test_serialize_vector() -> Result<(), Box<dyn StdError>> {
134134
let lua = Lua::new();
135135

136-
let globals = lua.globals();
137-
globals.set(
138-
"vector",
139-
lua.create_function(|_, (x, y, z)| Ok(mlua::Vector::new(x, y, z)))?,
140-
)?;
141-
142-
let val = lua.load("{_vector = vector(1, 2, 3)}").eval::<Value>()?;
136+
let val = lua.load("{_vector = vector.create(1, 2, 3)}").eval::<Value>()?;
143137
let json = serde_json::json!({
144138
"_vector": [1.0, 2.0, 3.0],
145139
});
@@ -156,13 +150,9 @@ fn test_serialize_vector() -> Result<(), Box<dyn StdError>> {
156150
fn test_serialize_vector() -> Result<(), Box<dyn StdError>> {
157151
let lua = Lua::new();
158152

159-
let globals = lua.globals();
160-
globals.set(
161-
"vector",
162-
lua.create_function(|_, (x, y, z, w)| Ok(mlua::Vector::new(x, y, z, w)))?,
163-
)?;
164-
165-
let val = lua.load("{_vector = vector(1, 2, 3, 4)}").eval::<Value>()?;
153+
let val = lua
154+
.load("{_vector = vector.create(1, 2, 3, 4)}")
155+
.eval::<Value>()?;
166156
let json = serde_json::json!({
167157
"_vector": [1.0, 2.0, 3.0, 4.0],
168158
});

0 commit comments

Comments
 (0)