diff --git a/mlua-sys/src/lua51/compat.rs b/mlua-sys/src/lua51/compat.rs index 29837f2..027077f 100644 --- a/mlua-sys/src/lua51/compat.rs +++ b/mlua-sys/src/lua51/compat.rs @@ -90,7 +90,7 @@ unsafe fn compat53_findfield(L: *mut lua_State, objidx: c_int, level: c_int) -> } else if compat53_findfield(L, objidx, level - 1) != 0 { // try recursively lua_remove(L, -2); // remove table (but keep name) - lua_pushliteral(L, c"."); + lua_pushliteral(L, "."); lua_insert(L, -2); // place '.' between the two names lua_concat(L, 3); return 1; @@ -121,13 +121,13 @@ unsafe fn compat53_pushfuncname(L: *mut lua_State, ar: *mut lua_Debug) { lua_pushfstring(L, cstr!("function '%s'"), (*ar).name); } else if *(*ar).what == b'm' as c_char { // main? - lua_pushliteral(L, c"main chunk"); + lua_pushliteral(L, "main chunk"); } else if *(*ar).what == b'C' as c_char { if compat53_pushglobalfuncname(L, ar) != 0 { lua_pushfstring(L, cstr!("function '%s'"), lua_tostring(L, -1)); lua_remove(L, -2); // remove name } else { - lua_pushliteral(L, c"?"); + lua_pushliteral(L, "?"); } } else { lua_pushfstring( @@ -377,7 +377,7 @@ pub unsafe fn luaL_checkstack(L: *mut lua_State, sz: c_int, msg: *const c_char) if !msg.is_null() { luaL_error(L, cstr!("stack overflow (%s)"), msg); } else { - lua_pushliteral(L, c"stack overflow"); + lua_pushliteral(L, "stack overflow"); lua_error(L); } } @@ -467,12 +467,12 @@ pub unsafe fn luaL_traceback(L: *mut lua_State, L1: *mut lua_State, msg: *const if !msg.is_null() { lua_pushfstring(L, cstr!("%s\n"), msg); } - lua_pushliteral(L, c"stack traceback:"); + lua_pushliteral(L, "stack traceback:"); while lua_getstack(L1, level, &mut ar) != 0 { level += 1; if level == mark { // too many levels? - lua_pushliteral(L, c"\n\t..."); // add a '...' + lua_pushliteral(L, "\n\t..."); // add a '...' level = numlevels - COMPAT53_LEVELS2; // and skip to last ones } else { lua_getinfo(L1, cstr!("Slnt"), &mut ar); @@ -480,7 +480,7 @@ pub unsafe fn luaL_traceback(L: *mut lua_State, L1: *mut lua_State, msg: *const if ar.currentline > 0 { lua_pushfstring(L, cstr!("%d:"), ar.currentline); } - lua_pushliteral(L, c" in "); + lua_pushliteral(L, " in "); compat53_pushfuncname(L, &mut ar); lua_concat(L, lua_gettop(L) - top); } @@ -493,16 +493,16 @@ pub unsafe fn luaL_tolstring(L: *mut lua_State, mut idx: c_int, len: *mut usize) if luaL_callmeta(L, idx, cstr!("__tostring")) == 0 { match lua_type(L, idx) { LUA_TNIL => { - lua_pushliteral(L, c"nil"); + lua_pushliteral(L, "nil"); } LUA_TSTRING | LUA_TNUMBER => { lua_pushvalue(L, idx); } LUA_TBOOLEAN => { if lua_toboolean(L, idx) == 0 { - lua_pushliteral(L, c"false"); + lua_pushliteral(L, "false"); } else { - lua_pushliteral(L, c"true"); + lua_pushliteral(L, "true"); } } t => { diff --git a/mlua-sys/src/lua51/lua.rs b/mlua-sys/src/lua51/lua.rs index adbcd30..2739043 100644 --- a/mlua-sys/src/lua51/lua.rs +++ b/mlua-sys/src/lua51/lua.rs @@ -1,6 +1,5 @@ //! Contains definitions from `lua.h`. -use std::ffi::CStr; use std::marker::{PhantomData, PhantomPinned}; use std::os::raw::{c_char, c_double, c_int, c_void}; use std::ptr; @@ -313,8 +312,10 @@ pub unsafe fn lua_isnoneornil(L: *mut lua_State, n: c_int) -> c_int { } #[inline(always)] -pub unsafe fn lua_pushliteral(L: *mut lua_State, s: &'static CStr) { - lua_pushstring_(L, s.as_ptr()); +pub unsafe fn lua_pushliteral(L: *mut lua_State, s: &'static str) { + use std::ffi::CString; + let c_str = CString::new(s).unwrap(); + lua_pushlstring_(L, c_str.as_ptr(), c_str.as_bytes().len()) } #[inline(always)] diff --git a/mlua-sys/src/lua52/compat.rs b/mlua-sys/src/lua52/compat.rs index 0482914..29cd888 100644 --- a/mlua-sys/src/lua52/compat.rs +++ b/mlua-sys/src/lua52/compat.rs @@ -199,16 +199,16 @@ pub unsafe fn luaL_tolstring(L: *mut lua_State, mut idx: c_int, len: *mut usize) if luaL_callmeta(L, idx, cstr!("__tostring")) == 0 { match lua_type(L, idx) { LUA_TNIL => { - lua_pushliteral(L, c"nil"); + lua_pushliteral(L, "nil"); } LUA_TSTRING | LUA_TNUMBER => { lua_pushvalue(L, idx); } LUA_TBOOLEAN => { if lua_toboolean(L, idx) == 0 { - lua_pushliteral(L, c"false"); + lua_pushliteral(L, "false"); } else { - lua_pushliteral(L, c"true"); + lua_pushliteral(L, "true"); } } t => { diff --git a/mlua-sys/src/lua52/lua.rs b/mlua-sys/src/lua52/lua.rs index a5fed2b..1135496 100644 --- a/mlua-sys/src/lua52/lua.rs +++ b/mlua-sys/src/lua52/lua.rs @@ -1,6 +1,5 @@ //! Contains definitions from `lua.h`. -use std::ffi::CStr; use std::marker::{PhantomData, PhantomPinned}; use std::os::raw::{c_char, c_double, c_int, c_uchar, c_uint, c_void}; use std::ptr; @@ -396,8 +395,10 @@ pub unsafe fn lua_isnoneornil(L: *mut lua_State, n: c_int) -> c_int { } #[inline(always)] -pub unsafe fn lua_pushliteral(L: *mut lua_State, s: &'static CStr) { - lua_pushstring(L, s.as_ptr()); +pub unsafe fn lua_pushliteral(L: *mut lua_State, s: &'static str) -> *const c_char { + use std::ffi::CString; + let c_str = CString::new(s).unwrap(); + lua_pushlstring_(L, c_str.as_ptr(), c_str.as_bytes().len()) } #[inline(always)] diff --git a/mlua-sys/src/lua53/lua.rs b/mlua-sys/src/lua53/lua.rs index efb85f0..ad283b0 100644 --- a/mlua-sys/src/lua53/lua.rs +++ b/mlua-sys/src/lua53/lua.rs @@ -1,6 +1,5 @@ //! Contains definitions from `lua.h`. -use std::ffi::CStr; use std::marker::{PhantomData, PhantomPinned}; use std::os::raw::{c_char, c_double, c_int, c_uchar, c_void}; use std::{mem, ptr}; @@ -408,8 +407,10 @@ pub unsafe fn lua_isnoneornil(L: *mut lua_State, n: c_int) -> c_int { } #[inline(always)] -pub unsafe fn lua_pushliteral(L: *mut lua_State, s: &'static CStr) { - lua_pushstring(L, s.as_ptr()); +pub unsafe fn lua_pushliteral(L: *mut lua_State, s: &'static str) -> *const c_char { + use std::ffi::CString; + let c_str = CString::new(s).unwrap(); + lua_pushlstring(L, c_str.as_ptr(), c_str.as_bytes().len()) } #[inline(always)] diff --git a/mlua-sys/src/lua54/lua.rs b/mlua-sys/src/lua54/lua.rs index 09c7c6a..0b51317 100644 --- a/mlua-sys/src/lua54/lua.rs +++ b/mlua-sys/src/lua54/lua.rs @@ -1,6 +1,5 @@ //! Contains definitions from `lua.h`. -use std::ffi::CStr; use std::marker::{PhantomData, PhantomPinned}; use std::os::raw::{c_char, c_double, c_int, c_uchar, c_ushort, c_void}; use std::{mem, ptr}; @@ -435,8 +434,10 @@ pub unsafe fn lua_isnoneornil(L: *mut lua_State, n: c_int) -> c_int { } #[inline(always)] -pub unsafe fn lua_pushliteral(L: *mut lua_State, s: &'static CStr) { - lua_pushstring(L, s.as_ptr()); +pub unsafe fn lua_pushliteral(L: *mut lua_State, s: &'static str) -> *const c_char { + use std::ffi::CString; + let c_str = CString::new(s).unwrap(); + lua_pushlstring(L, c_str.as_ptr(), c_str.as_bytes().len()) } #[inline(always)] diff --git a/mlua-sys/src/luau/compat.rs b/mlua-sys/src/luau/compat.rs index d151330..a3ef790 100644 --- a/mlua-sys/src/luau/compat.rs +++ b/mlua-sys/src/luau/compat.rs @@ -43,7 +43,7 @@ unsafe fn compat53_findfield(L: *mut lua_State, objidx: c_int, level: c_int) -> } else if compat53_findfield(L, objidx, level - 1) != 0 { // try recursively lua_remove(L, -2); // remove table (but keep name) - lua_pushliteral(L, c"."); + lua_pushliteral(L, "."); lua_insert(L, -2); // place '.' between the two names lua_concat(L, 3); return 1; @@ -77,7 +77,7 @@ unsafe fn compat53_pushfuncname(L: *mut lua_State, level: c_int, ar: *mut lua_De lua_pushfstring(L, cstr!("function '%s'"), lua_tostring(L, -1)); lua_remove(L, -2); // remove name } else { - lua_pushliteral(L, c"?"); + lua_pushliteral(L, "?"); } } @@ -192,7 +192,7 @@ pub unsafe fn lua_rawgetp(L: *mut lua_State, idx: c_int, p: *const c_void) -> c_ pub unsafe fn lua_getuservalue(L: *mut lua_State, mut idx: c_int) -> c_int { luaL_checkstack(L, 2, cstr!("not enough stack slots available")); idx = lua_absindex(L, idx); - lua_pushliteral(L, c"__mlua_uservalues"); + lua_pushliteral(L, "__mlua_uservalues"); if lua_rawget(L, LUA_REGISTRYINDEX) != LUA_TTABLE { return LUA_TNIL; } @@ -229,13 +229,13 @@ pub unsafe fn lua_rawsetp(L: *mut lua_State, idx: c_int, p: *const c_void) { pub unsafe fn lua_setuservalue(L: *mut lua_State, mut idx: c_int) { luaL_checkstack(L, 4, cstr!("not enough stack slots available")); idx = lua_absindex(L, idx); - lua_pushliteral(L, c"__mlua_uservalues"); + lua_pushliteral(L, "__mlua_uservalues"); lua_pushvalue(L, -1); if lua_rawget(L, LUA_REGISTRYINDEX) != LUA_TTABLE { lua_pop(L, 1); lua_createtable(L, 0, 2); // main table lua_createtable(L, 0, 1); // metatable - lua_pushliteral(L, c"k"); + lua_pushliteral(L, "k"); lua_setfield(L, -2, cstr!("__mode")); lua_setmetatable(L, -2); lua_pushvalue(L, -2); @@ -309,7 +309,7 @@ pub unsafe fn luaL_checkstack(L: *mut lua_State, sz: c_int, msg: *const c_char) if !msg.is_null() { luaL_error(L, cstr!("stack overflow (%s)"), msg); } else { - lua_pushliteral(L, c"stack overflow"); + lua_pushliteral(L, "stack overflow"); lua_error(L); } } @@ -430,11 +430,11 @@ pub unsafe fn luaL_traceback(L: *mut lua_State, L1: *mut lua_State, msg: *const if !msg.is_null() { lua_pushfstring(L, cstr!("%s\n"), msg); } - lua_pushliteral(L, c"stack traceback:"); + lua_pushliteral(L, "stack traceback:"); while lua_getinfo(L1, level, cstr!(""), &mut ar) != 0 { if level + 1 == mark { // too many levels? - lua_pushliteral(L, c"\n\t..."); // add a '...' + lua_pushliteral(L, "\n\t..."); // add a '...' level = numlevels - COMPAT53_LEVELS2; // and skip to last ones } else { lua_getinfo(L1, level, cstr!("sln"), &mut ar); @@ -442,7 +442,7 @@ pub unsafe fn luaL_traceback(L: *mut lua_State, L1: *mut lua_State, msg: *const if ar.currentline > 0 { lua_pushfstring(L, cstr!("%d:"), ar.currentline); } - lua_pushliteral(L, c" in "); + lua_pushliteral(L, " in "); compat53_pushfuncname(L, level, &mut ar); lua_concat(L, lua_gettop(L) - top); } @@ -456,16 +456,16 @@ pub unsafe fn luaL_tolstring(L: *mut lua_State, mut idx: c_int, len: *mut usize) if luaL_callmeta(L, idx, cstr!("__tostring")) == 0 { match lua_type(L, idx) { LUA_TNIL => { - lua_pushliteral(L, c"nil"); + lua_pushliteral(L, "nil"); } LUA_TSTRING | LUA_TNUMBER => { lua_pushvalue(L, idx); } LUA_TBOOLEAN => { if lua_toboolean(L, idx) == 0 { - lua_pushliteral(L, c"false"); + lua_pushliteral(L, "false"); } else { - lua_pushliteral(L, c"true"); + lua_pushliteral(L, "true"); } } t => { diff --git a/mlua-sys/src/luau/lauxlib.rs b/mlua-sys/src/luau/lauxlib.rs index 267490c..41c4e64 100644 --- a/mlua-sys/src/luau/lauxlib.rs +++ b/mlua-sys/src/luau/lauxlib.rs @@ -148,7 +148,7 @@ pub unsafe fn luaL_sandbox(L: *mut lua_State, enabled: c_int) { } // set all builtin metatables to read-only - lua_pushliteral(L, c""); + lua_pushliteral(L, ""); if lua_getmetatable(L, -1) != 0 { lua_setreadonly(L, -1, enabled); lua_pop(L, 2); diff --git a/mlua-sys/src/luau/lua.rs b/mlua-sys/src/luau/lua.rs index 26a3eae..2463707 100644 --- a/mlua-sys/src/luau/lua.rs +++ b/mlua-sys/src/luau/lua.rs @@ -1,6 +1,5 @@ //! Contains definitions from `lua.h`. -use std::ffi::CStr; use std::marker::{PhantomData, PhantomPinned}; use std::os::raw::{c_char, c_double, c_float, c_int, c_uint, c_void}; use std::{mem, ptr}; @@ -403,8 +402,10 @@ pub unsafe fn lua_isnoneornil(L: *mut lua_State, n: c_int) -> c_int { } #[inline(always)] -pub unsafe fn lua_pushliteral(L: *mut lua_State, s: &'static CStr) { - lua_pushstring_(L, s.as_ptr()); +pub unsafe fn lua_pushliteral(L: *mut lua_State, s: &'static str) { + use std::ffi::CString; + let c_str = CString::new(s).unwrap(); + lua_pushlstring_(L, c_str.as_ptr(), c_str.as_bytes().len()) } #[inline(always)] diff --git a/src/function.rs b/src/function.rs index a1944dc..4e6e406 100644 --- a/src/function.rs +++ b/src/function.rs @@ -280,7 +280,7 @@ impl Function { // Traverse upvalues until we find the _ENV one match ffi::lua_getupvalue(state, -1, i) { s if s.is_null() => break, - s if std::ffi::CStr::from_ptr(s as _) == c"_ENV" => break, + s if std::ffi::CStr::from_ptr(s as _).to_bytes() == b"_ENV" => break, _ => ffi::lua_pop(state, 1), } } @@ -319,7 +319,7 @@ impl Function { for i in 1..=255 { match ffi::lua_getupvalue(state, -1, i) { s if s.is_null() => return Ok(false), - s if std::ffi::CStr::from_ptr(s as _) == c"_ENV" => { + s if std::ffi::CStr::from_ptr(s as _).to_bytes() == b"_ENV" => { ffi::lua_pop(state, 1); // Create an anonymous function with the new environment let f_with_env = lua diff --git a/src/state/raw.rs b/src/state/raw.rs index c40cd1a..f2e9a0f 100644 --- a/src/state/raw.rs +++ b/src/state/raw.rs @@ -415,7 +415,7 @@ impl RawLua { } #[cfg(any(feature = "lua52", feature = "lua51", feature = "luajit"))] { - ffi::lua_pushliteral(state, c"attempt to yield from a hook"); + ffi::lua_pushliteral(state, "attempt to yield from a hook"); ffi::lua_error(state); } } diff --git a/src/userdata.rs b/src/userdata.rs index 8dde816..a463190 100644 --- a/src/userdata.rs +++ b/src/userdata.rs @@ -221,7 +221,9 @@ impl MetaMethod { pub(crate) const fn as_cstr(self) -> &'static CStr { match self { #[rustfmt::skip] - MetaMethod::Type => if cfg!(feature = "luau") { c"__type" } else { c"__name" }, + MetaMethod::Type => unsafe { + CStr::from_bytes_with_nul_unchecked(if cfg!(feature = "luau") { b"__type\0" } else { b"__name\0" }) + }, _ => unreachable!(), } } diff --git a/tests/conversion.rs b/tests/conversion.rs index d724fa8..e75a3a0 100644 --- a/tests/conversion.rs +++ b/tests/conversion.rs @@ -1,6 +1,6 @@ use std::borrow::Cow; use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; -use std::ffi::{CString, OsString}; +use std::ffi::{CStr, CString, OsString}; use std::path::PathBuf; use bstr::BString; @@ -450,8 +450,8 @@ fn test_conv_cstring() -> Result<()> { let s2: CString = lua.globals().get("s")?; assert_eq!(s, s2); - let cs = c"hello"; - lua.globals().set("cs", c"hello")?; + let cs = CStr::from_bytes_with_nul(b"hello\0").unwrap(); + lua.globals().set("cs", cs)?; let cs2: CString = lua.globals().get("cs")?; assert_eq!(cs, cs2.as_c_str());