Commit Graph

341 Commits

Author SHA1 Message Date
kyren c22aae461b Some changes for panic correctness, stack usage correctness, and speed 2018-02-12 13:54:31 -05:00
kyren c4b3170e2b More documentation fixes 2018-02-11 18:17:15 -05:00
kyren 9a45ef45e4 clarify the situation with the debug library a bit better 2018-02-11 18:12:20 -05:00
kyren 9388a72d61 Update Cargo.toml for 0.12.1 2018-02-11 17:55:40 -05:00
kyren 5f596d9117 Update changelog for 0.12.1, and add missing entry for 0.12.0 2018-02-11 17:54:27 -05:00
kyren bfe44089ef Documentation fixes / additions 2018-02-11 17:54:17 -05:00
kyren ea834635c1 Add UserDataMethods:: add_function_mut and add_meta_function_mut 2018-02-11 17:53:25 -05:00
kyren 7231e95195 It's far too easy to write 'stack_guard' as opposed to 'stack_err_guard'!
And it will work until something fails!  Maybe there should be a test that calls
every possible function that invokes to_lua / from_lua with a type where both
directions fail?
2018-02-11 16:47:39 -05:00
kyren ce7e8e61fd shave this yak some more, make Callback type alias have two lifetimes 2018-02-11 08:51:17 -05:00
kyren da1e1625b3 Specify the types exactly in the scary transmute
If I happen to change the definition of the Callback type alias, instead of
creating a potentially arbitrary transmute, it will now instead fail to compile.
2018-02-11 08:30:03 -05:00
kyren a91e3ed411 clarify the scary transmute 2018-02-11 08:22:15 -05:00
kyren fd0e31c6ea Add some extra warnings about the reference cycle dangers of RegistryKey 2018-02-11 06:37:51 -05:00
kyren b123eb087d Clarify some things in the README 2018-02-11 06:23:52 -05:00
kyren ca631e470a changelog spelling fix 2018-02-11 06:14:52 -05:00
kyren 9483b5054e Change changelog to be less confusing
There will not be a changelog entry for the changelog entry
2018-02-11 06:13:34 -05:00
kyren f94037856a Small README clarification 2018-02-10 19:13:56 -05:00
kyren 61236e685f Change changelog, readme, examples, Cargo.toml for 0.12 release 2018-02-10 19:04:18 -05:00
kyren 1b92d3319c consistent capitalization 2018-02-10 18:00:53 -05:00
kyren 0b7f07aa5d clarify that the Lua *C* API is the one that longjmps 2018-02-10 17:59:20 -05:00
kyren c3242add40 Update README for readability 2018-02-10 17:55:20 -05:00
kyren 20480ec88d fix unused process import warnings 2018-02-10 17:55:08 -05:00
kyren c5a5c51e9f A lot of README updates for the next version 2018-02-10 17:50:04 -05:00
kyren 9e3374ff9e lua_abort / lua_internal_abort macros 2018-02-10 17:49:54 -05:00
kyren 1426bdbc16 fix duplicated matrix entry for .travis.yml 2018-02-10 00:35:12 -05:00
kyren d4c80d44c8 Attempt to enable compiletest_rs on nightly on travis 2018-02-10 00:27:15 -05:00
kyren f785a3abe4 Don't bother with a feature, just disable LUA_USE_APICHECK in release 2018-02-09 23:59:11 -05:00
kyren 60743d45cd Move all tests into a tests/ subfolder 2018-02-09 23:52:05 -05:00
kyren d331e4b97c Error correctly on too many arguments / returns / binds / recursions
There are also some other drive-by changes to fix panicking in extern "C"
functions and other edge case stack errors
2018-02-09 23:40:23 -05:00
kyren fe6e4bdf35 Explicit error type for destructed callbacks
Also removes some cleverness if debug_assertions was disabled, as it really
doesn't make much of a performance difference.
2018-02-09 21:23:59 -05:00
kyren 514abd5b82 Actually unref scope created types from the registry AS WELL AS destructing them 2018-02-09 07:27:55 -05:00
kyren 84b009da03 A few small performance improvements
When 'debug_assertions' is not enabled, don't bother doing asserts in
stack_guard / stack_err_guard.  Also, add an optional feature not enabled by
default to disable LUA_USE_APICHECK in release mode.  Once the bugs in rlua that
allow you to trigger LUA_USE_APICHECK are fixed, this feature will be the
default behavior.
2018-02-09 01:22:34 -05:00
kyren de4d21f8ea Fix some strange lifetime usage on Lua::create_function
I don't think that the lifetime of the &Lua in the callback and the lifetime of
the &Lua from creating the callback need to be related at all.  I'm not sure if
this has any actual effect, but it makes more sense (I think?).
2018-02-08 18:52:29 -05:00
kyren b6bc8d0bed Make the Scope lifetimes more sensible
Avoids messy lifetime issues when interacting with other handle types with scope
produced values.

The whole lifetime situation with 'lua on most methods could actually probably
use some looking at, I'm sure it probably has lots of less than optimal
decisions in it.

This also adds a proper comment to the 'scope lifetime to explain that the key
is that 'scope needs to be invariant to make things safe.  Disregard my previous
commit message, the real problem is that I had a poor understanding of lifetime
variance / invaraince.
2018-02-08 18:45:07 -05:00
kyren 7701aeef85 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?
2018-02-08 05:12:27 -05:00
kyren f05716deb8 This SHOULD fix the lifetime problem with scope... but it doesn't!
The following code should not compile:

```
struct Test {
    field: i32,
}

let lua = Lua::new();
lua.scope(|scope| {
    let mut test = Test { field: 0 };

    let f = scope
        .create_function(|_, ()| {
            test.field = 42;
            Ok(())
        })
        .unwrap();
    lua.globals().set("bad!", f).unwrap();
});
```

yet it does with this commit.  However, I have a fix for this, which I do not in
any way understand.
2018-02-08 05:12:11 -05:00
kyren 7a0c066593 export accidentally hidden Scope type 2018-02-08 01:54:30 -05:00
kyren 728e8ea714 Merge pull request #68 from chucklefish/scope
Lots of changes, not sure if actually safe yet.
2018-02-07 17:07:13 -05:00
kyren 164250b352 Don't panic with "rlua internal error" message on panics that are not internal
It is part of the contract that only LuaRef types constructed from the same
parent Lua state are passed into Lua, so generating a panic there is not an
internal error.
2018-02-07 17:05:00 -05:00
kyren b9d9bea28a slightly faster, less obnoxious scope drop 2018-02-07 16:51:24 -05:00
kyren 98ee4e9492 More correct scope drop behavior
now no longer aborts if a Drop impl panics
2018-02-07 16:42:03 -05:00
kyren ab9841a02f Don't keep the unref list around forever after Lua is dropped 2018-02-07 11:16:22 -05:00
kyren cb25a99f70 Lots of changes, not sure if actually safe yet.
* Make Lua Send
* Add Send bounds to (nearly) all instances where userdata and functions are
  passed to Lua
* Add a "scope" method which takes a callback that accepts a `Scope`, and give
  `Scope` the ability to create functions and userdata that are !Send, *and also
  functions that are not even 'static!*.
2018-02-06 20:53:25 -05:00
kyren 7780a91e19 fix missing unwrap in tests 2018-02-06 20:29:48 -05:00
kyren b056ed2c4e Don't panic on mismatched RegistryKey use, instead return error 2018-02-06 10:51:39 -05:00
kyren 823c2deaca Slightly different strategy with RegistryKey values
Provide a method for automatic cleanup of expired RegistryKey values, so that
manually cleaning up registry values is optional.
2018-02-06 03:33:19 -05:00
kyren 8820e7705c test owns_registry_value 2018-02-06 00:54:04 -05:00
kyren 79635f29be Add method to check whether a RegistryKey is owned by a given Lua instance 2018-02-06 00:41:51 -05:00
kyren d43f8129f3 experimentally make RegistryKey Send 2018-02-06 00:05:35 -05:00
kyren fe35742026 Set the metatable of __gc'ed userdata to something more informative 2018-02-05 14:40:20 -05:00
kyren 6382baa991 Use ptr::write to initialize uninitalized memory, NOT mem::replace 2018-01-27 18:38:00 -05:00