예제 #1
0
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;
}
예제 #2
0
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();
        }
    }
}
예제 #3
0
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;
    }
}
예제 #4
0
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;
    }
}