Beispiel #1
0
int Lua::Return(lua_State* L, const Variable& retVals)
{
    if (ShowInfo())
    {
        std::cout << "LUA: c++: returning these vals: " << retVals.ToString() << "\n";
    }

    // Return total number of args pushed after flattening
    return PushLuaArgs(L, retVals);
}
Beispiel #2
0
bool Lua::Call(
    const Lua::LuaFuncName& funcName,
    const Variable& args,
    Variable* pResults,
    int numRetVals)
{
    if (ShowInfo())
    {
        std::cout << "LUA: c++: calling lua function \"" << funcName
                  << "\" Args: "
                  << args.ToString() << "\n";
    }

    lua_getglobal(m_pL, funcName.c_str());

    // Push each arg on to the lua stack
    int numArgs = PushLuaArgs(m_pL, args);

    // Call func, give no of args and no of return values
    int retcode = lua_pcall(m_pL, numArgs, numRetVals, 0);
    if (retcode != 0)
    {
        // Pop error message off stack.
        const char* msg = lua_tostring(m_pL, -1);
        lua_pop(m_pL, 1);
        std::string err = "LUA: c++: attempt to call lua function \"" + funcName + "\" ";
        if (m_filename.empty())
        {
            err += "(no file name) ";
        }
        else
        {
            err += "in file \"" + m_filename + "\" ";
        }
        err += "failed: ";
        ReportError(err + msg);

        return false;
    }

    // Get return vals
    if (numRetVals == 0)
    {
        // Nothing to do
    }
    else if (numRetVals == 1)
    {
        Variable v = GetVariableFromLua(m_pL, -1);
        lua_pop(m_pL, 1);
        *pResults = v;
    }
    else
    {
        VariableVec vec;
        for (int j = 0; j < numRetVals; j++)
        {
            Variable v = GetVariableFromLua(m_pL, -1);
            vec.push_back(v);
            lua_pop(m_pL, 1);
        }
        std::reverse(vec.begin(), vec.end()); // !
        *pResults = vec;
    }

    if (ShowInfo())
    {
        std::cout << "LUA: c++ call to lua function \"" << funcName << "\" succeeded. Return values: "
                  << pResults->ToString() << "\n";
    }

    return true;
}