Closed
Description
Hello, I'm mlua
maintainer and found a regression when running tests for the library on the latest beta and nightly.
I narrowed it down to a minimal example:
Code
main.rs
mod ffi {
use std::os::raw::{c_int, c_void};
type LuaCFn = unsafe extern "C" fn(L: *mut c_void) -> c_int;
extern "C" {
pub fn luaL_newstate() -> *mut c_void;
pub fn lua_pcall(L: *mut c_void, nargs: c_int, nresults: c_int, errfunc: c_int) -> c_int;
pub fn lua_gettable(L: *mut c_void, idx: c_int);
pub fn lua_pushcclosure(L: *mut c_void, f: LuaCFn, n: c_int);
pub fn lua_pushnil(L: *mut c_void);
}
// #[inline(always)]
pub unsafe fn lua_gettable2(state: *mut c_void, idx: c_int) {
lua_gettable(state, idx);
}
}
pub unsafe fn test_me() {
let state = ffi::luaL_newstate();
assert!(!state.is_null());
unsafe extern "C" fn run_me(state: *mut std::os::raw::c_void) -> std::os::raw::c_int {
ffi::lua_pushnil(state);
ffi::lua_pushnil(state);
ffi::lua_gettable2(state, -2); // Changing this to `ffi::lua_gettable` solves the problem
1
}
ffi::lua_pushcclosure(state, run_me, 0);
assert!(ffi::lua_pcall(state, 0, -1, 0) != 0);
}
fn main() {
unsafe { test_me() }
}
Cargo.toml
[package]
name = "luajit_test"
version = "0.1.0"
edition = "2018"
build = "build.rs"
[build-dependencies]
luajit-src = "*"
build.rs
fn main() {
let artifacts = luajit_src::Build::new().build();
artifacts.print_cargo_metadata();
println!("cargo:rerun-if-changed=build.rs");
}
Repo: https://github.com/khvzak/luajit_bug
It works on stable rust, but fails on beta and nightly with illegal hardware instruction
on macos 10.15 and linux (at least).
It works if uncomment #[inline(always)]
OR replace ffi::lua_gettable2
call with ffi::lua_gettable
.
Reproducible only using LuaJIT, but not on Lua 5.1.
Version it worked on
It most recently worked on: nightly-2021-03-10. Does not work on nightly-2021-03-11.
Version with regression
rustc --version --verbose
:
rustc 1.52.0-nightly (f98721f88 2021-03-10)
binary: rustc
commit-hash: f98721f886ab52d32d622ad0a46216ad03f3e525
commit-date: 2021-03-10
host: x86_64-unknown-linux-gnu
release: 1.52.0-nightly
LLVM version: 12.0.0