Skip to content

Commit 8abccc6

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 92cce57 commit 8abccc6

File tree

5 files changed

+17
-13
lines changed

5 files changed

+17
-13
lines changed

CLI/src/Repl.cpp

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

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

@@ -189,7 +195,7 @@ LUA_API int lua_pushthread(lua_State* L);
189195
LUA_API void lua_pushlightuserdatatagged(lua_State* L, void* p, int tag);
190196
LUA_API void* lua_newuserdatatagged(lua_State* L, size_t sz, int tag);
191197
LUA_API void* lua_newuserdatataggedwithmetatable(lua_State* L, size_t sz, int tag); // metatable fetched with lua_getuserdatametatable
192-
LUA_API void* lua_newuserdatadtor(lua_State* L, size_t sz, void (*dtor)(void*));
198+
LUA_API void* lua_newuserdatadtor(lua_State* L, size_t sz, lua_Destructor dtor);
193199

194200
LUA_API void* lua_newbuffer(lua_State* L, size_t sz);
195201

@@ -319,8 +325,6 @@ LUA_API double lua_clock();
319325

320326
LUA_API void lua_setuserdatatag(lua_State* L, int idx, int tag);
321327

322-
typedef void (*lua_Destructor)(lua_State* L, void* userdata);
323-
324328
LUA_API void lua_setuserdatadtor(lua_State* L, int tag, lua_Destructor dtor);
325329
LUA_API lua_Destructor lua_getuserdatadtor(lua_State* L, int tag);
326330

VM/src/lapi.cpp

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

1329-
void* lua_newuserdatadtor(lua_State* L, size_t sz, void (*dtor)(void*))
1329+
void* lua_newuserdatadtor(lua_State* L, size_t sz, lua_Destructor dtor)
13301330
{
13311331
luaC_checkGC(L);
13321332
luaC_threadbarrier(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
@@ -1605,15 +1605,15 @@ TEST_CASE("Reference")
16051605
lua_newuserdatadtor(
16061606
L,
16071607
0,
1608-
[](void*)
1608+
[](lua_State*, void* data)
16091609
{
16101610
dtorhits++;
16111611
}
16121612
);
16131613
lua_newuserdatadtor(
16141614
L,
16151615
0,
1616-
[](void*)
1616+
[](lua_State*, void* data)
16171617
{
16181618
dtorhits++;
16191619
}
@@ -1651,7 +1651,7 @@ TEST_CASE("NewUserdataOverflow")
16511651
[](lua_State* L1)
16521652
{
16531653
// The following userdata request might cause an overflow.
1654-
lua_newuserdatadtor(L1, SIZE_MAX, [](void* d) {});
1654+
lua_newuserdatadtor(L1, SIZE_MAX, [](lua_State*, void* d) {});
16551655
// The overflow might segfault in the following call.
16561656
lua_getmetatable(L1, -1);
16571657
return 0;
@@ -2557,7 +2557,7 @@ TEST_CASE("UserdataApi")
25572557
void* ud3 = lua_newuserdatadtor(
25582558
L,
25592559
4,
2560-
[](void* data)
2560+
[](lua_State*, void* data)
25612561
{
25622562
dtorhits += *(int*)data;
25632563
}
@@ -2566,7 +2566,7 @@ TEST_CASE("UserdataApi")
25662566
void* ud4 = lua_newuserdatadtor(
25672567
L,
25682568
1,
2569-
[](void* data)
2569+
[](lua_State*, void* data)
25702570
{
25712571
dtorhits += *(char*)data;
25722572
}
@@ -2646,7 +2646,7 @@ TEST_CASE("UserdataAlignment")
26462646

26472647
for (int i = 0; i < 10; i++)
26482648
{
2649-
void* data = lua_newuserdatadtor(L, size, [](void*) {});
2649+
void* data = lua_newuserdatadtor(L, size, [](lua_State*, void* data) {});
26502650
LUAU_ASSERT(uintptr_t(data) % 16 == 0);
26512651
lua_pop(L, 1);
26522652
}

0 commit comments

Comments
 (0)