@@ -63,6 +63,7 @@ CLuaMain::CLuaMain ( CLuaManager* pLuaManager,
6363
6464 m_bEnableOOP = bEnableOOP;
6565
66+ m_iPackageLoadedRef = -1 ;
6667
6768 CPerfStatLuaMemory::GetSingleton ()->OnLuaMainCreate ( this );
6869 CPerfStatLuaTiming::GetSingleton ()->OnLuaMainCreate ( this );
@@ -712,7 +713,11 @@ void CLuaMain::InitPackageStorage(lua_State* L)
712713 lua_settable (L, -3 ); // stack: [tbl_new,"loaded",tbl_new2]
713714 }
714715
715- // Finally, store our original table as package.loaded
716+ // Keep our package.loaded table safely in registry
717+ m_iPackageLoadedRef = luaL_ref (L, LUA_REGISTRYINDEX); // stack: [tbl_new,"loaded"]
718+ lua_rawgeti (L, LUA_REGISTRYINDEX, m_iPackageLoadedRef); // stack: [tbl_new,"loaded",tbl_new2]
719+
720+ // Finally, store our original table as global package.loaded
716721 lua_settable (L, -3 ); // stack: [tbl_new]
717722 lua_setglobal (L, " package" ); // stack: []
718723}
@@ -721,33 +726,28 @@ void CLuaMain::InitPackageStorage(lua_State* L)
721726//
722727// CLuaMain::SetPackage
723728//
724- // Pop the top most value as a package
729+ // Set the top most value as a package (No pop)
725730//
726731// /////////////////////////////////////////////////////////////
727732void CLuaMain::SetPackage (lua_State* L, SString &strName )
728733{
734+ if (m_iPackageLoadedRef < 0 )
735+ return ;
729736 // We set varPkg, which is already on the stack, into package.loaded.moduleName = varPkg.
730- // stack: [varPkg]
731- int iPkg = luaL_ref (L, LUA_REGISTRYINDEX); // stack: []
732- lua_getglobal (L, " package" ); // stack: [tbl_package]
733- if (lua_type (L, -1 ) == LUA_TNIL )
734- InitPackageStorage (L);
735-
736- lua_pushstring (L, " loaded" ); // stack: [tbl_package,"loaded"]
737- lua_rawget (L, -2 ); // stack: [tbl_package,tbl_loaded]
738- if (lua_type (L, -1 ) == LUA_TNIL)
739- InitPackageStorage (L);
737+ // stack: [varPkg]
738+ int iPkg = luaL_ref (L, LUA_REGISTRYINDEX); // stack: []
739+ lua_rawgeti (L, LUA_REGISTRYINDEX, m_iPackageLoadedRef); // [tbl_loaded]
740740
741741
742- lua_pushstring (L, strName.c_str ()); // stack: [tbl_package, tbl_loaded,"moduleName"]
743- lua_rawgeti (L, LUA_REGISTRYINDEX, iPkg); // stack: [tbl_package, tbl_loaded,"moduleName",varPkg]
744- lua_rawset (L, -3 ); // stack: [tbl_package, tbl_loaded]
745- lua_pop (L, 2 ); // stack: []
746- lua_rawgeti (L, LUA_REGISTRYINDEX, iPkg); // stack: [varPkg]
742+ lua_pushstring (L, strName.c_str ()); // stack: [tbl_loaded,"moduleName"]
743+ lua_rawgeti (L, LUA_REGISTRYINDEX, iPkg); // stack: [tbl_loaded,"moduleName",varPkg]
744+ lua_rawset (L, -3 ); // stack: [tbl_loaded]
745+ lua_pop (L, 2 ); // stack: []
746+ lua_rawgeti (L, LUA_REGISTRYINDEX, iPkg); // stack: [varPkg]
747747
748- // Cleanup our used registry entry, REGISTRY[i] = nil.
749- lua_pushnil (L); // stack: [varPkg,nil]
750- lua_rawseti (L, LUA_REGISTRYINDEX, iPkg); // stack: [varPkg]
748+ // Cleanup our used registry entry, i.e. REGISTRY[i] = nil.
749+ lua_pushnil (L); // stack: [varPkg,nil]
750+ lua_rawseti (L, LUA_REGISTRYINDEX, iPkg); // stack: [varPkg]
751751}
752752
753753// /////////////////////////////////////////////////////////////
@@ -759,18 +759,13 @@ void CLuaMain::SetPackage(lua_State* L, SString &strName )
759759// /////////////////////////////////////////////////////////////
760760void CLuaMain::GetPackage (lua_State* L, SString &strName)
761761{
762- lua_getglobal (L, " package" ); // stack: [tbl_package]
763- if (lua_type (L, -1 ) == LUA_TNIL )
764- InitPackageStorage (m_luaVM);
765-
766- lua_pushstring (L, " loaded" ); // stack: [tbl_package,"loaded"]
767- if (lua_type (L, -1 ) == LUA_TNIL)
768- InitPackageStorage (m_luaVM);
762+ if (m_iPackageLoadedRef < 0 )
763+ return ;
769764
770- lua_rawget (L, - 2 ); // stack: [tbl_package, tbl_loaded]
771- lua_pushstring (L, strName.c_str ()); // stack: [tbl_package, tbl_loaded,"moduleName"]
772- lua_rawget (L, -2 ); // stack: [tbl_package ,varPkg]
773- lua_remove (L, -2 ); // stack: [varPkg]
765+ lua_rawgeti (L, LUA_REGISTRYINDEX, m_iPackageLoadedRef ); // stack: [tbl_loaded]
766+ lua_pushstring (L, strName.c_str ()); // stack: [tbl_loaded,"moduleName"]
767+ lua_rawget (L, -2 ); // stack: [tbl_loaded ,varPkg]
768+ lua_remove (L, -2 ); // stack: [varPkg]
774769}
775770
776771// /////////////////////////////////////////////////////////////
@@ -812,7 +807,6 @@ bool CLuaMain::LoadLuaLib(lua_State *L, SString strName)
812807 lua_settop (L, luaSavedTop+1 );
813808
814809 SetPackage (L, strName); // Store our package into package.loaded
815- GetPackage (L, strName); // Grab it back as a return value.
816810 return true ;
817811 }
818812
0 commit comments