int LuaInterface::luaCppFunctionCallback(lua_State* L) { // retrieves function pointer from userdata auto funcPtr = static_cast<LuaCppFunctionPtr*>(g_lua.popUpvalueUserdata()); assert(funcPtr); int numRets = 0; // do the call try { g_lua.m_cppCallbackDepth++; numRets = (*(funcPtr->get()))(&g_lua); g_lua.m_cppCallbackDepth--; assert(numRets == g_lua.stackSize()); } catch(stdext::exception& e) { // cleanup stack while(g_lua.stackSize() > 0) g_lua.pop(); numRets = 0; g_lua.pushString(stdext::format("C++ call failed: %s", g_lua.traceback(e.what()))); g_lua.error(); } return numRets; }
void LuaInterface::loadFiles(std::string directory, bool recursive, std::string contains) { for(const std::string& fileName : g_resources.listDirectoryFiles(directory)) { std::string fullPath = directory + "/" + fileName; if(recursive && g_resources.directoryExists(fullPath)) { loadFiles(fullPath, true, contains); continue; } if(!g_resources.isFileType(fileName, "lua")) continue; if(!contains.empty() && fileName.find(contains) == std::string::npos) continue; try { g_lua.loadScript(fullPath); g_lua.call(0, 0); } catch(stdext::exception& e) { g_lua.pushString(e.what()); g_lua.error(); } } }
int LuaInterface::lua_loadfile(lua_State* L) { std::string fileName = g_lua.popString(); try { g_lua.loadScript(fileName); return 1; } catch(stdext::exception& e) { g_lua.pushNil(); g_lua.pushString(e.what()); g_lua.error(); return 2; } }
int LuaInterface::lua_dofile(lua_State* L) { std::string file = g_lua.popString(); try { g_lua.loadScript(file); g_lua.call(0, LUA_MULTRET); return g_lua.stackSize(); } catch(stdext::exception& e) { g_lua.pushString(e.what()); g_lua.error(); return 0; } }