@@ -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
541551static 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
596599static 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-
601602int 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