Skip to content

Commit 039da3c

Browse files
committed
Take lua_Destructor in lua_newuserdatadtor (with lua_State argument).
mlua needs access to Lua state in userdata destructor to set a flag to prevent further access to Lua VM ops in destructor.
1 parent 32d52d1 commit 039da3c

5 files changed

Lines changed: 17 additions & 13 deletions

File tree

CLI/src/Repl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ void* createCliRequireContext(lua_State* L)
170170
void* ctx = lua_newuserdatadtor(
171171
L,
172172
sizeof(ReplRequirer),
173-
[](void* ptr)
173+
[](lua_State*, void* ptr)
174174
{
175175
static_cast<ReplRequirer*>(ptr)->~ReplRequirer();
176176
}

VM/include/lua.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,12 @@ typedef int (*lua_Continuation)(lua_State* L, int status);
5454

5555
typedef void* (*lua_Alloc)(void* ud, void* ptr, size_t osize, size_t nsize);
5656

57+
/*
58+
** prototype for userdata destructor
59+
*/
60+
61+
typedef void (*lua_Destructor)(lua_State* L, void* userdata);
62+
5763
// non-return type
5864
#define l_noret void LUA_NORETURN
5965

@@ -200,7 +206,7 @@ LUA_API int lua_pushthread(lua_State* L);
200206
LUA_API void lua_pushlightuserdatatagged(lua_State* L, void* p, int tag);
201207
LUA_API void* lua_newuserdatatagged(lua_State* L, size_t sz, int tag);
202208
LUA_API void* lua_newuserdatataggedwithmetatable(lua_State* L, size_t sz, int tag); // metatable fetched with lua_getuserdatametatable
203-
LUA_API void* lua_newuserdatadtor(lua_State* L, size_t sz, void (*dtor)(void*));
209+
LUA_API void* lua_newuserdatadtor(lua_State* L, size_t sz, lua_Destructor dtor);
204210

205211
LUA_API void* lua_newbuffer(lua_State* L, size_t sz);
206212

@@ -333,8 +339,6 @@ LUA_API double lua_clock();
333339

334340
LUA_API void lua_setuserdatatag(lua_State* L, int idx, int tag);
335341

336-
typedef void (*lua_Destructor)(lua_State* L, void* userdata);
337-
338342
LUA_API void lua_setuserdatadtor(lua_State* L, int tag, lua_Destructor dtor);
339343
LUA_API lua_Destructor lua_getuserdatadtor(lua_State* L, int tag);
340344

VM/src/lapi.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1460,7 +1460,7 @@ void* lua_newuserdatataggedwithmetatable(lua_State* L, size_t sz, int tag)
14601460
return u->data;
14611461
}
14621462

1463-
void* lua_newuserdatadtor(lua_State* L, size_t sz, void (*dtor)(void*))
1463+
void* lua_newuserdatadtor(lua_State* L, size_t sz, lua_Destructor dtor)
14641464
{
14651465
api_check(L, dtor != nullptr);
14661466
luaC_checkGC(L);

VM/src/ludata.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@ void luaU_freeudata(lua_State* L, Udata* u, lua_Page* page)
3232
}
3333
else if (u->tag == UTAG_IDTOR)
3434
{
35-
void (*dtor)(void*) = nullptr;
35+
lua_Destructor dtor = nullptr;
3636
memcpy(&dtor, &u->data + u->len - sizeof(dtor), sizeof(dtor));
3737
if (dtor)
38-
dtor(u->data);
38+
dtor(L, u->data);
3939
}
4040

4141

tests/Conformance.test.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2247,15 +2247,15 @@ TEST_CASE("Reference")
22472247
lua_newuserdatadtor(
22482248
L,
22492249
0,
2250-
[](void*)
2250+
[](lua_State*, void* data)
22512251
{
22522252
dtorhits++;
22532253
}
22542254
);
22552255
lua_newuserdatadtor(
22562256
L,
22572257
0,
2258-
[](void*)
2258+
[](lua_State*, void* data)
22592259
{
22602260
dtorhits++;
22612261
}
@@ -2293,7 +2293,7 @@ TEST_CASE("NewUserdataOverflow")
22932293
[](lua_State* L1)
22942294
{
22952295
// The following userdata request might cause an overflow.
2296-
lua_newuserdatadtor(L1, SIZE_MAX, [](void* d) {});
2296+
lua_newuserdatadtor(L1, SIZE_MAX, [](lua_State*, void* d) {});
22972297
// The overflow might segfault in the following call.
22982298
lua_getmetatable(L1, -1);
22992299
return 0;
@@ -3429,7 +3429,7 @@ TEST_CASE("UserdataApi")
34293429
void* ud3 = lua_newuserdatadtor(
34303430
L,
34313431
4,
3432-
[](void* data)
3432+
[](lua_State*, void* data)
34333433
{
34343434
dtorhits += *(int*)data;
34353435
}
@@ -3438,7 +3438,7 @@ TEST_CASE("UserdataApi")
34383438
void* ud4 = lua_newuserdatadtor(
34393439
L,
34403440
1,
3441-
[](void* data)
3441+
[](lua_State*, void* data)
34423442
{
34433443
dtorhits += *(char*)data;
34443444
}
@@ -3518,7 +3518,7 @@ TEST_CASE("UserdataAlignment")
35183518

35193519
for (int i = 0; i < 10; i++)
35203520
{
3521-
void* data = lua_newuserdatadtor(L, size, [](void*) {});
3521+
void* data = lua_newuserdatadtor(L, size, [](lua_State*, void* data) {});
35223522
LUAU_ASSERT(uintptr_t(data) % 16 == 0);
35233523
lua_pop(L, 1);
35243524
}

0 commit comments

Comments
 (0)