Skip to content

Commit 3b61c9b

Browse files
authored
Properly handle process.env GC (#253)
1 parent f1ad5fe commit 3b61c9b

File tree

1 file changed

+19
-22
lines changed

1 file changed

+19
-22
lines changed

process/src/process.cpp

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,16 @@ struct EnvIter
536536
uv_env_item_t* items;
537537
int count;
538538
int index;
539+
540+
~EnvIter()
541+
{
542+
if (items)
543+
{
544+
uv_os_free_environ(items, count);
545+
items = nullptr;
546+
count = 0;
547+
}
548+
}
539549
};
540550

541551
static int envIterNext(lua_State* L)
@@ -565,39 +575,30 @@ static int envIter(lua_State* L)
565575
return 0;
566576
}
567577

568-
EnvIter* iter = (EnvIter*)lua_newuserdata(L, sizeof(EnvIter));
578+
EnvIter* iter = (EnvIter*)lua_newuserdatadtor(
579+
L,
580+
sizeof(EnvIter),
581+
[](void* ptr)
582+
{
583+
static_cast<EnvIter*>(ptr)->~EnvIter();
584+
}
585+
);
586+
569587
iter->items = items;
570588
iter->count = count;
571589
iter->index = 0;
572590

573-
luaL_getmetatable(L, "process.env.iterator");
574-
lua_setmetatable(L, -2);
575-
576591
lua_pushvalue(L, -1);
577592
lua_pushcclosure(L, envIterNext, "envIterNext", 1);
578593

579594
return 1;
580595
}
581596

582-
static int envIterGc(lua_State* L)
583-
{
584-
EnvIter* iter = (EnvIter*)lua_touserdata(L, 1);
585-
if (iter->items)
586-
{
587-
uv_os_free_environ(iter->items, iter->count);
588-
iter->items = nullptr;
589-
iter->count = 0;
590-
}
591-
return 0;
592-
}
593-
594597
} // namespace process
595598

596599
static const luaL_Reg processEnvMeta[] =
597600
{{"__index", process::envIndex}, {"__newindex", process::envNewindex}, {"__iter", process::envIter}, {nullptr, nullptr}};
598601

599-
static const luaL_Reg processEnvIterMeta[] = {{"__gc", process::envIterGc}, {nullptr, nullptr}};
600-
601602
int luaopen_process(lua_State* L)
602603
{
603604
luaL_register(L, "process", process::lib);
@@ -617,10 +618,6 @@ int luteopen_process(lua_State* L)
617618
lua_setfield(L, -2, name);
618619
}
619620

620-
luaL_newmetatable(L, "process.env.iterator");
621-
luaL_register(L, nullptr, processEnvIterMeta);
622-
lua_pop(L, 1);
623-
624621
lua_newtable(L);
625622
luaL_newmetatable(L, "process.env");
626623
luaL_register(L, nullptr, processEnvMeta);

0 commit comments

Comments
 (0)