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); }
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; }