Skip to content

Commit ecc09c4

Browse files
committed
Add luaL_loadbufferenv helper to all Lua versions
1 parent 7bfd327 commit ecc09c4

File tree

6 files changed

+97
-19
lines changed

6 files changed

+97
-19
lines changed

mlua-sys/src/lua51/compat.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,25 @@ pub unsafe fn luaL_newmetatable(L: *mut lua_State, tname: *const c_char) -> c_in
403403
}
404404
}
405405

406+
pub unsafe fn luaL_loadbufferenv(
407+
L: *mut lua_State,
408+
data: *const c_char,
409+
size: usize,
410+
name: *const c_char,
411+
mode: *const c_char,
412+
mut env: c_int,
413+
) -> c_int {
414+
if env != 0 {
415+
env = lua_absindex(L, env);
416+
}
417+
let status = luaL_loadbufferx(L, data, size, name, mode);
418+
if status == LUA_OK && env != 0 {
419+
lua_pushvalue(L, env);
420+
lua_setfenv(L, -2);
421+
}
422+
status
423+
}
424+
406425
#[inline(always)]
407426
pub unsafe fn luaL_loadbufferx(
408427
L: *mut lua_State,

mlua-sys/src/lua52/compat.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,3 +247,22 @@ pub unsafe fn luaL_requiref(L: *mut lua_State, modname: *const c_char, openf: lu
247247
}
248248
lua_replace(L, -2);
249249
}
250+
251+
pub unsafe fn luaL_loadbufferenv(
252+
L: *mut lua_State,
253+
data: *const c_char,
254+
size: usize,
255+
name: *const c_char,
256+
mode: *const c_char,
257+
mut env: c_int,
258+
) -> c_int {
259+
if env != 0 {
260+
env = lua_absindex(L, env);
261+
}
262+
let status = luaL_loadbufferx(L, data, size, name, mode);
263+
if status == LUA_OK && env != 0 {
264+
lua_pushvalue(L, env);
265+
lua_setupvalue(L, -2, 1);
266+
}
267+
status
268+
}

mlua-sys/src/lua53/compat.rs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
//! MLua compatibility layer for Lua 5.3
22
3-
use std::os::raw::c_int;
3+
use std::os::raw::{c_char, c_int};
44

5+
use super::lauxlib::*;
56
use super::lua::*;
67

78
#[inline(always)]
@@ -12,3 +13,22 @@ pub unsafe fn lua_resume(L: *mut lua_State, from: *mut lua_State, narg: c_int, n
1213
}
1314
ret
1415
}
16+
17+
pub unsafe fn luaL_loadbufferenv(
18+
L: *mut lua_State,
19+
data: *const c_char,
20+
size: usize,
21+
name: *const c_char,
22+
mode: *const c_char,
23+
mut env: c_int,
24+
) -> c_int {
25+
if env != 0 {
26+
env = lua_absindex(L, env);
27+
}
28+
let status = luaL_loadbufferx(L, data, size, name, mode);
29+
if status == LUA_OK && env != 0 {
30+
lua_pushvalue(L, env);
31+
lua_setupvalue(L, -2, 1);
32+
}
33+
status
34+
}

mlua-sys/src/lua54/lauxlib.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,25 @@ pub unsafe fn luaL_loadbuffer(L: *mut lua_State, s: *const c_char, sz: usize, n:
169169
luaL_loadbufferx(L, s, sz, n, ptr::null())
170170
}
171171

172+
pub unsafe fn luaL_loadbufferenv(
173+
L: *mut lua_State,
174+
data: *const c_char,
175+
size: usize,
176+
name: *const c_char,
177+
mode: *const c_char,
178+
mut env: c_int,
179+
) -> c_int {
180+
if env != 0 {
181+
env = lua::lua_absindex(L, env);
182+
}
183+
let status = luaL_loadbufferx(L, data, size, name, mode);
184+
if status == lua::LUA_OK && env != 0 {
185+
lua::lua_pushvalue(L, env);
186+
lua::lua_setupvalue(L, -2, 1);
187+
}
188+
status
189+
}
190+
172191
//
173192
// TODO: Generic Buffer Manipulation
174193
//

mlua-sys/src/luau/compat.rs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -320,13 +320,13 @@ pub unsafe fn luaL_newmetatable(L: *mut lua_State, tname: *const c_char) -> c_in
320320
}
321321
}
322322

323-
pub unsafe fn luaL_loadbufferx(
323+
pub unsafe fn luaL_loadbufferenv(
324324
L: *mut lua_State,
325325
data: *const c_char,
326326
mut size: usize,
327327
name: *const c_char,
328328
mode: *const c_char,
329-
env: c_int
329+
env: c_int,
330330
) -> c_int {
331331
extern "C" {
332332
fn free(p: *mut c_void);
@@ -357,14 +357,25 @@ pub unsafe fn luaL_loadbufferx(
357357
LUA_OK
358358
}
359359

360+
#[inline(always)]
361+
pub unsafe fn luaL_loadbufferx(
362+
L: *mut lua_State,
363+
data: *const c_char,
364+
size: usize,
365+
name: *const c_char,
366+
mode: *const c_char,
367+
) -> c_int {
368+
luaL_loadbufferenv(L, data, size, name, mode, 0)
369+
}
370+
360371
#[inline(always)]
361372
pub unsafe fn luaL_loadbuffer(
362373
L: *mut lua_State,
363374
data: *const c_char,
364375
size: usize,
365-
name: *const c_char
376+
name: *const c_char,
366377
) -> c_int {
367-
luaL_loadbufferx(L, data, size, name, ptr::null(), 0)
378+
luaL_loadbufferenv(L, data, size, name, ptr::null(), 0)
368379
}
369380

370381
#[inline(always)]

src/state/raw.rs

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -305,39 +305,29 @@ impl RawLua {
305305
let state = self.state();
306306
unsafe {
307307
let _sg = StackGuard::new(state);
308-
check_stack(state, 1)?;
308+
check_stack(state, 2)?;
309309

310310
let mode_str = match mode {
311311
Some(ChunkMode::Binary) => cstr!("b"),
312312
Some(ChunkMode::Text) => cstr!("t"),
313313
None => cstr!("bt"),
314314
};
315315

316-
match ffi::luaL_loadbufferx(
316+
match ffi::luaL_loadbufferenv(
317317
state,
318318
source.as_ptr() as *const c_char,
319319
source.len(),
320320
name.map(|n| n.as_ptr()).unwrap_or_else(ptr::null),
321321
mode_str,
322-
#[cfg(feature="luau")]
323-
match &env {
322+
match env {
324323
Some(env) => {
325324
self.push_ref(&env.0);
326325
-1
327326
}
328-
_ => 0
327+
_ => 0,
329328
},
330329
) {
331330
ffi::LUA_OK => {
332-
if let Some(env) = env {
333-
#[cfg(not(feature="luau"))]
334-
self.push_ref(&env.0);
335-
#[cfg(any(feature = "lua54", feature = "lua53", feature = "lua52"))]
336-
ffi::lua_setupvalue(state, -2, 1);
337-
#[cfg(any(feature = "lua51", feature = "luajit"))]
338-
ffi::lua_setfenv(state, -2);
339-
}
340-
341331
#[cfg(feature = "luau-jit")]
342332
if (*self.extra.get()).enable_jit && ffi::luau_codegen_supported() != 0 {
343333
ffi::luau_codegen_compile(state, -1);

0 commit comments

Comments
 (0)