summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkyren <kerriganw@gmail.com>2018-02-08 05:00:11 -0500
committerkyren <kerriganw@gmail.com>2018-02-08 05:12:27 -0500
commit7701aeef85cb1f110ed27d75e04b9f8e768e0216 (patch)
tree042b3cbc4e82d2d82292ec003693cc85da9dc932
parentf05716deb85e8e458f2a43478c5fae4cb156099b (diff)
downloadmlua-7701aeef85cb1f110ed27d75e04b9f8e768e0216.zip
TERRIBLE HACK FIX I DO NOT UNDERSTAND
Okay, so this is the fix for the previously mentioned lifetime problem. I mimicked the API for `crossbeam::scope` extremely closely for `Lua::scope`, and for some reason things that would not compile with `crossbeam::scope` WOULD compile with `Lua::scope`, and I could not figure it out. So I took the crossbeam source and made tiny edits until I determined the crossover point where invalid borrows would compile, and it was.. not what I expected it to be. Simply replacing a RefCell<Option<DtorChain<'a>>> with a PhantomData<&'a ()> would suddenly cause this to compile with crossbeam: ``` struct Test { field: i32, } crossbeam::scope(|scope| { let mut t = Test { field: 0, }; scope.spawn(|| t.field = 42); drop(t); // ...anything }) ``` which is precisely the same problem as `rlua`. To say I am unsatisfied by this fix is a drastic understatement. SURELY this must be a compiler bug?
-rw-r--r--src/lua.rs2
1 files changed, 2 insertions, 0 deletions
diff --git a/src/lua.rs b/src/lua.rs
index a7bf385..a878638 100644
--- a/src/lua.rs
+++ b/src/lua.rs
@@ -33,6 +33,7 @@ pub struct Lua {
pub struct Scope<'scope> {
lua: &'scope Lua,
destructors: RefCell<Vec<Box<FnMut(*mut ffi::lua_State) -> Box<Any>>>>,
+ _phantom: PhantomData<RefCell<&'scope ()>>,
}
// Data associated with the main lua_State via lua_getextraspace.
@@ -326,6 +327,7 @@ impl Lua {
let mut scope = Scope {
lua: self,
destructors: RefCell::new(Vec::new()),
+ _phantom: PhantomData,
};
let r = f(&mut scope);
drop(scope);