Skip to content

Commit c2eab17

Browse files
committed
Add userdata-wrappers feature
This feature allow to opt into `impl UserData` for `Rc<T>`/`Arc<T>`/`Rc<RefCell<T>>`/`Arc<Mutex<T>>` where `T: UserData` Close #470
1 parent bb31134 commit c2eab17

File tree

6 files changed

+422
-78
lines changed

6 files changed

+422
-78
lines changed

.github/workflows/main.yml

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ jobs:
2727
- name: Build ${{ matrix.lua }} vendored
2828
run: |
2929
cargo build --features "${{ matrix.lua }},vendored"
30-
cargo build --features "${{ matrix.lua }},vendored,async,serialize,macros,anyhow"
31-
cargo build --features "${{ matrix.lua }},vendored,async,serialize,macros,anyhow,send"
30+
cargo build --features "${{ matrix.lua }},vendored,async,serialize,macros,anyhow,userdata-wrappers"
31+
cargo build --features "${{ matrix.lua }},vendored,async,serialize,macros,anyhow,userdata-wrappers,send"
3232
shell: bash
3333
- name: Build ${{ matrix.lua }} pkg-config
3434
if: ${{ matrix.os == 'ubuntu-latest' }}
@@ -51,7 +51,7 @@ jobs:
5151
toolchain: stable
5252
target: aarch64-apple-darwin
5353
- name: Cross-compile
54-
run: cargo build --target aarch64-apple-darwin --features "${{ matrix.lua }},vendored,async,send,serialize,macros"
54+
run: cargo build --target aarch64-apple-darwin --features "${{ matrix.lua }},vendored,async,send,serialize,macros,anyhow,userdata-wrappers"
5555

5656
build_aarch64_cross_ubuntu:
5757
name: Cross-compile to aarch64-unknown-linux-gnu
@@ -72,7 +72,7 @@ jobs:
7272
sudo apt-get install -y --no-install-recommends gcc-aarch64-linux-gnu libc6-dev-arm64-cross
7373
shell: bash
7474
- name: Cross-compile
75-
run: cargo build --target aarch64-unknown-linux-gnu --features "${{ matrix.lua }},vendored,async,send,serialize,macros"
75+
run: cargo build --target aarch64-unknown-linux-gnu --features "${{ matrix.lua }},vendored,async,send,serialize,macros,anyhow,userdata-wrappers"
7676
shell: bash
7777

7878
build_armv7_cross_ubuntu:
@@ -94,7 +94,7 @@ jobs:
9494
sudo apt-get install -y --no-install-recommends gcc-arm-linux-gnueabihf libc-dev-armhf-cross
9595
shell: bash
9696
- name: Cross-compile
97-
run: cargo build --target armv7-unknown-linux-gnueabihf --features "${{ matrix.lua }},vendored,async,send,serialize,macros"
97+
run: cargo build --target armv7-unknown-linux-gnueabihf --features "${{ matrix.lua }},vendored,async,send,serialize,macros,anyhow,userdata-wrappers"
9898
shell: bash
9999

100100
test:
@@ -123,8 +123,8 @@ jobs:
123123
- name: Run ${{ matrix.lua }} tests
124124
run: |
125125
cargo test --features "${{ matrix.lua }},vendored"
126-
cargo test --features "${{ matrix.lua }},vendored,async,serialize,macros,anyhow"
127-
cargo test --features "${{ matrix.lua }},vendored,async,serialize,macros,anyhow,send"
126+
cargo test --features "${{ matrix.lua }},vendored,async,serialize,macros,anyhow,userdata-wrappers"
127+
cargo test --features "${{ matrix.lua }},vendored,async,serialize,macros,anyhow,userdata-wrappers,send"
128128
shell: bash
129129
- name: Run compile tests (macos lua54)
130130
if: ${{ matrix.os == 'macos-latest' && matrix.lua == 'lua54' }}
@@ -154,8 +154,8 @@ jobs:
154154
- uses: Swatinem/rust-cache@v2
155155
- name: Run ${{ matrix.lua }} tests with address sanitizer
156156
run: |
157-
cargo test --tests --features "${{ matrix.lua }},vendored,async,serialize,macros" --target x86_64-unknown-linux-gnu -- --skip test_too_many_recursions
158-
cargo test --tests --features "${{ matrix.lua }},vendored,async,serialize,macros,send" --target x86_64-unknown-linux-gnu -- --skip test_too_many_recursions
157+
cargo test --tests --features "${{ matrix.lua }},vendored,async,serialize,macros,anyhow" --target x86_64-unknown-linux-gnu -- --skip test_too_many_recursions
158+
cargo test --tests --features "${{ matrix.lua }},vendored,async,serialize,macros,anyhow,userdata-wrappers,send" --target x86_64-unknown-linux-gnu -- --skip test_too_many_recursions
159159
shell: bash
160160
env:
161161
RUSTFLAGS: -Z sanitizer=address
@@ -181,7 +181,7 @@ jobs:
181181
- uses: Swatinem/rust-cache@v2
182182
- name: Run ${{ matrix.lua }} tests with forced memory limit
183183
run: |
184-
cargo test --tests --features "${{ matrix.lua }},vendored,async,send,serialize,macros"
184+
cargo test --tests --features "${{ matrix.lua }},vendored,async,send,serialize,macros,anyhow,userdata-wrappers"
185185
shell: bash
186186
env:
187187
RUSTFLAGS: --cfg=force_memory_limit
@@ -254,7 +254,7 @@ jobs:
254254
- name: Run ${{ matrix.lua }} tests
255255
run: |
256256
cargo test --tests --features "${{ matrix.lua }},vendored"
257-
cargo test --tests --features "${{ matrix.lua }},vendored,async,serialize,macros"
257+
cargo test --tests --features "${{ matrix.lua }},vendored,async,serialize,macros,anyhow,userdata-wrappers"
258258
259259
rustfmt:
260260
name: Rustfmt
@@ -281,4 +281,4 @@ jobs:
281281
- uses: giraffate/clippy-action@v1
282282
with:
283283
reporter: 'github-pr-review'
284-
clippy_flags: --features "${{ matrix.lua }},vendored,async,send,serialize,macros,anyhow"
284+
clippy_flags: --features "${{ matrix.lua }},vendored,async,send,serialize,macros,anyhow,userdata-wrappers"

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ error-send = []
4343
serialize = ["dep:serde", "dep:erased-serde", "dep:serde-value"]
4444
macros = ["mlua_derive/macros"]
4545
anyhow = ["dep:anyhow", "error-send"]
46+
userdata-wrappers = []
4647

4748
[dependencies]
4849
mlua_derive = { version = "=0.10.0", optional = true, path = "mlua_derive" }

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ Below is a list of the available feature flags. By default `mlua` does not enabl
5757
* `serialize`: add serialization and deserialization support to `mlua` types using [serde] framework
5858
* `macros`: enable procedural macros (such as `chunk!`)
5959
* `anyhow`: enable `anyhow::Error` conversion into Lua
60+
* `userdata-wrappers`: opt into `impl UserData` for `Rc<T>`/`Arc<T>`/`Rc<RefCell<T>>`/`Arc<Mutex<T>>` where `T: UserData`
6061

6162
[5.4]: https://www.lua.org/manual/5.4/manual.html
6263
[5.3]: https://www.lua.org/manual/5.3/manual.html

src/scope.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use std::cell::RefCell;
22
use std::marker::PhantomData;
33
use std::mem;
4-
use std::os::raw::c_void;
54

65
use crate::error::{Error, Result};
76
use crate::function::Function;
@@ -183,7 +182,7 @@ impl<'scope, 'env: 'scope> Scope<'scope, 'env> {
183182
let ud_ptr = util::push_uninit_userdata::<UserDataStorage<T>>(state, protect)?;
184183

185184
// Push the metatable and register it with no TypeId
186-
let mut registry = UserDataRegistry::new_unique(ud_ptr as *const c_void);
185+
let mut registry = UserDataRegistry::new_unique(ud_ptr as *mut _);
187186
T::register(&mut registry);
188187
self.lua.push_userdata_metatable(registry)?;
189188
let mt_ptr = ffi::lua_topointer(state, -1);

0 commit comments

Comments
 (0)