summaryrefslogtreecommitdiff
path: root/src/userdata.rs
AgeCommit message (Collapse)Author
2020-01-07Implement PartialEq trait for Value (and subtypes)Alex Orlenko
Add equals() method to compare values optionally invoking __eq.
2019-11-30Add pair and ipair metamethods support (lua 5.2/5.3 only)Alex Orlenko
2019-11-30Add Lua 5.2 supportAlex Orlenko
2019-11-04Move lua 5.1 support under new "lua51" featureAlex Orlenko
2019-11-04Fix examples and docsAlex Orlenko
2019-10-17Lua 5.1 supportAlex Orlenko
2019-10-01Rename to mluaAlex Orlenko
2019-09-29Backport changes from rlua 0.16 (master branch)Alex Orlenko
2018-10-01Allow non-utf8 Lua source in load / exec / evalkyren
2018-09-04code re-org have slightly less pub(crate) itemskyren
2018-09-04Initial design for non-'static scoped userdatakyren
Uses the same UserData trait, and should at least in theory support everything that 'static UserData does, except that any functions added that rely on AnyUserData are pretty much useless. Probably pretty slow and I'm not sure how to make it dramatically faster, which is a shame because generally when you need non'-static userdata you might be creating it kind of a lot (if it was long-lived, it would probably be 'static). Haven't added tests yet, will do that next.
2018-08-05format with up-to-date rustfmtkyren
2018-03-19Small renames and comments to better communicate the intention of stack ↵kyren
checking functions
2018-03-19Where possible, don't call to_lua / from_lua / to_lua_multi / from_lua_multi ↵kyren
callbacks during Lua stack manipulation This should protect against being able to trigger a stack assert in Lua. Lua and associated types shoul be able to assume that LUA_MINSTACK stack slots are available on any user entry point. In the future, we could turn check_stack into something that only checked the Lua stack when debug_assertions is true.
2018-03-19Clean up some lifetime specificationkyren
2018-03-12Do not crash in release when accessing an AnyUserDatakyren
Also, don't bother asserting if the userdata has no metatable, just behave as though the userdata has no type. This should be impossible to trigger currently without the debug library, but it is not really that useful of an assert anyway.
2018-03-12Move several asserts to only be active with debug, bump alpha version numberkyren
2018-03-12Remove `stack_guard` function and instead just use StackGuard directlykyren
2018-03-12Merge branch 'bench'kyren
2018-03-11A lot of performance changes.kyren
Okay, so this is kind of a mega-commit of a lot of performance related changes to rlua, some of which are pretty complicated. There are some small improvements here and there, but most of the benefits of this change are from a few big changes. The simplest big change is that there is now `protect_lua` as well as `protect_lua_call`, which allows skipping a lightuserdata parameter and some stack manipulation in some cases. Second simplest is the change to use Vec instead of VecDeque for MultiValue, and to have MultiValue be used as a sort of "backwards-only" Vec so that ToLuaMulti / FromLuaMulti still work correctly. The most complex change, though, is a change to the way LuaRef works, so that LuaRef can optionally point into the Lua stack instead of only registry values. At state creation a set number of stack slots is reserved for the first N LuaRef types (currently 16), and space for these are also allocated separately allocated at callback time. There is a huge breaking change here, which is that now any LuaRef types MUST only be used with the Lua on which they were created, and CANNOT be used with any other Lua callback instance. This mostly will affect people using LuaRef types from inside a scope callback, but hopefully in those cases `Function::bind` will be a suitable replacement. On the plus side, the rules for LuaRef types are easier to state now. There is probably more easy-ish perf on the table here, but here's the preliminary results, based on my very limited benchmarks: create table time: [314.13 ns 315.71 ns 317.44 ns] change: [-36.154% -35.670% -35.205%] (p = 0.00 < 0.05) create array 10 time: [2.9731 us 2.9816 us 2.9901 us] change: [-16.996% -16.600% -16.196%] (p = 0.00 < 0.05) Performance has improved. create string table 10 time: [5.6904 us 5.7164 us 5.7411 us] change: [-53.536% -53.309% -53.079%] (p = 0.00 < 0.05) Performance has improved. call add function 3 10 time: [5.1134 us 5.1222 us 5.1320 us] change: [-4.1095% -3.6910% -3.1781%] (p = 0.00 < 0.05) Performance has improved. call callback add 2 10 time: [5.4408 us 5.4480 us 5.4560 us] change: [-6.4203% -5.7780% -5.0013%] (p = 0.00 < 0.05) Performance has improved. call callback append 10 time: [9.8243 us 9.8410 us 9.8586 us] change: [-26.937% -26.702% -26.469%] (p = 0.00 < 0.05) Performance has improved. create registry 10 time: [3.7005 us 3.7089 us 3.7174 us] change: [-8.4965% -8.1042% -7.6926%] (p = 0.00 < 0.05) Performance has improved. I think that a lot of these benchmarks are too "easy", and most API usage is going to be more like the 'create string table 10' benchmark, where there are a lot of handles and tables and strings, so I think that 25%-50% improvement is a good guess for most use cases.
2018-03-10Improve documentation about __index vs regular methodskyren
2018-03-08Simplify stack_guard / stack_err_guardkyren
The expected change is always zero, because stack_guard / stack_err_guard are always used at `rlua` entry / exit points.
2018-03-08Change strategies for handling the Lua stack during panicskyren
Previously, on an internal panic, the Lua stack would be reset before panicking in an attempt to make sure that such panics would not cause stack leaks or leave the stack in an unknown state. Now, such panic handling is done in stack_guard and stack_err_guard instead, and this is for a few reasons: 1) The previous approach did NOT handle user triggered panics that were outside of `rlua`, such as a panic in a ToLua / FromLua implementation. This is especially bad since most other panics would be indicative of an internal bug anyway, so the utility of keeping `rlua` types usable after such panics was questionable. It is much more sensible to ensure that `rlua` types are usable after *user generated* panics. 2) Every entry point into `rlua` should be guarded by a stack_guard or stack_err_guard anyway, so this should restore the Lua stack on exiting back to user code in all cases. 3) The method of stack restoration no longer *clears* the stack, only resets it to what it previously was. This allows us, potentially, to keep values at the beginning of the Lua stack long term and know that panics will not clobber them. There may be a way of dramatically speeding up ref types by using a small static area at the beginning of the stack instead of only the registry, so this may be important.
2018-02-12Some changes for panic correctness, stack usage correctness, and speedkyren
2018-02-11Add `UserDataMethods::` `add_function_mut` and `add_meta_function_mut`kyren
2018-02-11It's far too easy to write 'stack_guard' as opposed to 'stack_err_guard'!kyren
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-11shave this yak some more, make `Callback` type alias have two lifetimeskyren
2018-02-09Move all tests into a tests/ subfolderkyren
2018-02-09Error correctly on too many arguments / returns / binds / recursionskyren
There are also some other drive-by changes to fix panicking in extern "C" functions and other edge case stack errors
2018-02-07Don't panic with "rlua internal error" message on panics that are not internalkyren
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-06Lots of changes, not sure if actually safe yet.kyren
* 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-06Slightly different strategy with RegistryKey valueskyren
Provide a method for automatic cleanup of expired RegistryKey values, so that manually cleaning up registry values is optional.
2018-02-05Set the metatable of __gc'ed userdata to something more informativekyren
2018-01-27Simplify handling of userdata __gc and resurrected userdata.kyren
Now, simply remove the userdata table immediately before dropping the userdata. This does two things, it prevents __gc from double dropping the userdata, and after the first call to __gc, it prevents the userdata from being identified as any particular userdata type, so it cannot be misused after being finalized. This change thus removes the userdata invalidation error, and simplifies a lot of userdata handling code. It also fixes a panic bug. Because there is no predictable order for finalizers, it is possible to run a userdata finalizer that does not resurrect itself before a lua table finalizer that accesses that userdata, and this means that there were several asserts that were possible to trigger in normal Lua code in util.rs related to `WrappedError`. Now, finalized userdata is simply a userdata with no methods, so any use of finalized userdata becomes a normal script runtime error (though, with a potentially confusing error message). As a future improvement, we could set a metatable on finalized userdata that provides a better error message.
2018-01-26Add an API that exposes the functionality of `lua_getuservalue` and ↵kyren
`lua_setuservalue`
2018-01-26__gc would be safe now, reword MetaMethod docs accordinglyJonas Schievink
2018-01-26Additional `MetaMethod` docsJonas Schievink
2018-01-21Experimentally use the `failure` crate for errorskyren
2017-12-04Add `ExpiredUserData` error and avoid what was previously a panickyren
Also make sure that panic messages clearly state that they are internal errors, so people report them as a bug. Since the only panics left are all internal errors, just move the internal error message into the panic / assert macros.
2017-12-04more reorganization in an attempt to shrink the size of lua.rskyren
2017-12-04Move function and thread into their own modules, auto-formattingkyren
2017-12-03I believe this is all the external API changes necessary for 'm' safetykyren
2017-12-03auto formattingkyren
2017-12-02auto-formattingkyren
2017-10-23auto-formattingkyren
2017-10-14Cleanups of userdata handling, particularly around callbackskyren
First, make sure that `add_methods` cannot trigger another userdata registry insert, causing an unintended panic. Second, remove `RefCell` surrounding userdata hashmap, as this change makes it no longer needed. Third, add a `RefCell` around `Callback` because FnMut means that callbacks cannot recurse into themselves, and panic appropriately when this happens. This should eventually be turned into an error.
2017-09-30more reorganization, move simple type defines to types.rs modulekyren
2017-09-30move userdata tests into userdata.rskyren
2017-09-30crudely move LightUserData/UserData/AnyUserData to their own modulekyren