Improve handling of errors in lua functions and speed up calls. (#1427)

This commit is contained in:
Kyzentun
2017-04-04 11:36:23 -07:00
committed by Colby Klein
parent 86dbab0100
commit f10e3ae36a
21 changed files with 38 additions and 86 deletions
+1 -2
View File
@@ -1297,8 +1297,7 @@ void Actor::RunCommands( const LuaReference& cmds, const LuaReference *pParamTab
pParamTable->PushSelf( L );
// call function with 2 arguments and 0 results
RString Error= "Error playing command:";
LuaHelpers::RunScriptOnStack(L, Error, 2, 0, true);
LuaHelpers::RunScriptOnStack(L, 2, 0);
LUA->Release(L);
}
+2 -4
View File
@@ -243,8 +243,7 @@ void ActorFrame::DrawPrimitives()
return;
}
this->PushSelf( L );
RString Error= "Error running DrawFunction: ";
LuaHelpers::RunScriptOnStack(L, Error, 1, 0, true); // 1 arg, 0 results
LuaHelpers::RunScriptOnStack(L, 1, 0); // 1 arg, 0 results
LUA->Release(L);
return;
}
@@ -494,8 +493,7 @@ void ActorFrame::UpdateInternal( float fDeltaTime )
}
this->PushSelf( L );
lua_pushnumber( L, fDeltaTime );
RString Error= "Error running UpdateFunction: ";
LuaHelpers::RunScriptOnStack(L, Error, 2, 0, true); // 1 args, 0 results
LuaHelpers::RunScriptOnStack(L, 2, 0); // 1 args, 0 results
LUA->Release(L);
}
}
+2 -3
View File
@@ -272,8 +272,7 @@ bool ActorUtil::LoadTableFromStackShowErrors( Lua *L )
lua_pushvalue( L, -1 );
func.SetFromStack( L );
RString Error= "Lua runtime error: ";
if( !LuaHelpers::RunScriptOnStack(L, Error, 0, 1, true) )
if( !LuaHelpers::RunScriptOnStack(L, 0, 1) )
{
lua_pop( L, 1 );
return false;
@@ -287,7 +286,7 @@ bool ActorUtil::LoadTableFromStackShowErrors( Lua *L )
lua_Debug debug;
lua_getinfo( L, ">nS", &debug );
Error = ssprintf( "%s: must return a table", debug.short_src );
RString Error = ssprintf( "%s: must return a table", debug.short_src );
LuaHelpers::ReportScriptError(Error, "LUA_ERROR");
return false;
+2 -4
View File
@@ -52,8 +52,7 @@ void DynamicActorScroller::LoadFromNode( const XNode *pNode )
lua_pushnil( L );
lua_pushnil( L );
RString Error= "Error running LoadFunction: ";
LuaHelpers::RunScriptOnStack(L, Error, 2, 1, true); // 2 args, 1 result
LuaHelpers::RunScriptOnStack(L, 2, 1); // 2 args, 1 result
m_iNumItems = (int) luaL_checknumber( L, -1 );
lua_pop( L, 1 );
@@ -126,8 +125,7 @@ void DynamicActorScroller::ConfigureActor( Actor *pActor, int iItem )
pActor->PushSelf( L );
LuaHelpers::Push( L, iItem );
RString Error= "Error running LoadFunction: ";
LuaHelpers::RunScriptOnStack(L, Error, 2, 0, true); // 2 args, 0 results
LuaHelpers::RunScriptOnStack(L, 2, 0); // 2 args, 0 results
LUA->Release(L);
}
+1 -2
View File
@@ -762,8 +762,7 @@ void GameCommand::ApplySelf( const vector<PlayerNumber> &vpns ) const
ASSERT( !lua_isnil(L, -1) );
lua_pushnumber( L, *pn ); // 1st parameter
RString error= "Lua GameCommand error: ";
LuaHelpers::RunScriptOnStack(L, error, 1, 0, true);
LuaHelpers::RunScriptOnStack(L, 1, 0);
}
LUA->Release(L);
}
+1 -2
View File
@@ -98,8 +98,7 @@ void LifeMeterBattery::OnSongEnded()
COURSE_SONG_REWARD_LIVES.PushSelf(L);
PushSelf(L);
LuaHelpers::Push(L, pn);
RString error= "Error running CourseSongRewardLives callback: ";
LuaHelpers::RunScriptOnStack(L, error, 2, 1, true);
LuaHelpers::RunScriptOnStack(L, 2, 1);
m_iLivesLeft += luaL_optnumber(L, -1, 0);
lua_settop(L, 0);
LUA->Release(L);
+1 -2
View File
@@ -26,8 +26,7 @@ void LuaExpressionTransform::TransformItemDirect( Actor &a, float fPositionOffse
LuaHelpers::Push( L, fPositionOffsetFromCenter );
LuaHelpers::Push( L, iItemIndex );
LuaHelpers::Push( L, iNumItems );
RString error= "Lua error in Transform function: ";
LuaHelpers::RunScriptOnStack(L, error, 4, 0, true);
LuaHelpers::RunScriptOnStack(L, 4, 0);
LUA->Release(L);
}
+6 -23
View File
@@ -829,36 +829,19 @@ void LuaHelpers::ReportScriptErrorFmt(const char *fmt, ...)
ReportScriptError(Buff);
}
bool LuaHelpers::RunScriptOnStack( Lua *L, RString &Error, int Args, int ReturnValues, bool ReportError )
bool LuaHelpers::RunScriptOnStack(Lua *L, int Args, int ReturnValues)
{
lua_pushcfunction( L, GetLuaStack );
// move the error function above the function and params
int ErrFunc = lua_gettop(L) - Args - 1;
lua_insert( L, ErrFunc );
// evaluate
int ret = lua_pcall( L, Args, ReturnValues, ErrFunc );
int ret = lua_pcall(L, Args, ReturnValues, 0);
if( ret )
{
if(ReportError)
{
RString lerror;
LuaHelpers::Pop( L, lerror );
Error+= lerror;
ReportScriptError(Error);
}
else
{
LuaHelpers::Pop( L, Error );
}
lua_remove( L, ErrFunc );
lua_pop(L, 1);
for( int i = 0; i < ReturnValues; ++i )
{
lua_pushnil( L );
}
return false;
}
lua_remove( L, ErrFunc );
return true;
}
@@ -881,7 +864,7 @@ bool LuaHelpers::RunScript( Lua *L, const RString &Script, const RString &Name,
// move the function above the params
lua_insert( L, lua_gettop(L) - Args );
return LuaHelpers::RunScriptOnStack( L, Error, Args, ReturnValues, ReportError );
return LuaHelpers::RunScriptOnStack(L, Args, ReturnValues);
}
bool LuaHelpers::RunExpression( Lua *L, const RString &sExpression, const RString &sName )
+1 -1
View File
@@ -80,7 +80,7 @@ namespace LuaHelpers
* when reporting. The error is reported through LOG->Warn and
* SCREENMAN->SystemMessage.
*/
bool RunScriptOnStack( Lua *L, RString &Error, int Args = 0, int ReturnValues = 0, bool ReportError = false );
bool RunScriptOnStack(Lua *L, int Args = 0, int ReturnValues = 0);
/* LoadScript the given script, and RunScriptOnStack it.
* iArgs arguments are at the top of the stack. */
+1 -3
View File
@@ -183,9 +183,7 @@ void MenuTimer::SetText( float fSeconds )
LuaHelpers::Push( L, fSeconds );
// call function with 1 argument and 1 result
RString Error= "Error running Text" + (i+1);
Error+= "FormatFunction: ";
LuaHelpers::RunScriptOnStack(L, Error, 1, 1, true);
LuaHelpers::RunScriptOnStack(L, 1, 1);
RString sText;
LuaHelpers::Pop( L, sText );
+1 -2
View File
@@ -1076,8 +1076,7 @@ void NoteField::FadeToFail()
member_name.PushSelf(L);
#define OPEN_RUN_BLOCK(arg_count) \
RString error= "Error running callback: "; \
if(LuaHelpers::RunScriptOnStack(L, error, arg_count, arg_count, true)) \
if(LuaHelpers::RunScriptOnStack(L, arg_count, arg_count)) \
{
#define CLOSE_RUN_AND_CALLBACK_BLOCKS } lua_settop(L, 0); LUA->Release(L); }
+5 -10
View File
@@ -904,8 +904,7 @@ public:
return false;
}
m_pLuaTable->PushSelf( L );
RString error= RowName + " \"EnabledForPlayers\": ";
LuaHelpers::RunScriptOnStack(L, error, 1, 1, true);
LuaHelpers::RunScriptOnStack(L, 1, 1);
if(!lua_istable(L, -1))
{
LuaHelpers::ReportScriptErrorFmt("LUA_ERROR: \"%s\" \"EnabledForPlayers\" did not return a table.", RowName.c_str());
@@ -988,8 +987,7 @@ public:
// Argument 1 (self):
m_pLuaTable->PushSelf( L );
RString error= "EnabledForPlayers: ";
LuaHelpers::RunScriptOnStack( L, error, 1, 1, true );
LuaHelpers::RunScriptOnStack( L, 1, 1 );
m_Def.m_vEnabledForPlayers.clear(); // and fill in with supplied PlayerNumbers below
lua_pushnil( L );
@@ -1149,8 +1147,7 @@ public:
ASSERT( lua_gettop(L) == 6 ); // vbSelectedOut, m_iLuaTable, function, self, arg, arg
RString error= "LoadSelections: ";
LuaHelpers::RunScriptOnStack( L, error, 3, 0, true );
LuaHelpers::RunScriptOnStack( L, 3, 0 );
ASSERT( lua_gettop(L) == 2 );
lua_pop( L, 1 ); // pop option table
@@ -1205,8 +1202,7 @@ public:
ASSERT( lua_gettop(L) == 6 ); // vbSelectedOut, m_iLuaTable, function, self, arg, arg
RString error= "SaveSelections: ";
LuaHelpers::RunScriptOnStack( L, error, 3, 0, true );
LuaHelpers::RunScriptOnStack( L, 3, 0 );
ASSERT( lua_gettop(L) == 2 );
lua_pop( L, 1 ); // pop option table
@@ -1237,8 +1233,7 @@ public:
LuaHelpers::Push(L, pn);
// Convert choice to a lua index so it matches up with the Choices table.
lua_pushinteger(L, choice+1);
RString error= "NotifyOfSelection: ";
LuaHelpers::RunScriptOnStack(L, error, 3, 1, true);
LuaHelpers::RunScriptOnStack(L, 3, 1);
if(lua_toboolean(L, -1))
{
lua_pop(L, 1);
+1 -2
View File
@@ -177,8 +177,7 @@ void PercentageDisplay::Refresh()
Lua *L = LUA->Get();
m_FormatPercentScore.PushSelf( L );
LuaHelpers::Push( L, fPercentDancePoints );
RString Error= "Error running FormatPercentScore: ";
LuaHelpers::RunScriptOnStack(L, Error, 1, 1, true); // 1 arg, 1 result
LuaHelpers::RunScriptOnStack(L, 1, 1); // 1 arg, 1 result
LuaHelpers::Pop( L, sNumToDisplay );
LUA->Release(L);
}
+2 -4
View File
@@ -1060,8 +1060,7 @@ void Profile::LoadCustomFunction( RString sDir )
LuaHelpers::Push(L, sDir);
// Run it
RString Error= "Error running CustomLoadFunction: ";
LuaHelpers::RunScriptOnStack(L, Error, 2, 0, true);
LuaHelpers::RunScriptOnStack(L, 2, 0);
LUA->Release(L);
}
@@ -1344,8 +1343,7 @@ bool Profile::SaveAllToDir( RString sDir, bool bSignData ) const
LuaHelpers::Push(L, sDir);
// Run it
RString Error= "Error running CustomSaveFunction: ";
LuaHelpers::RunScriptOnStack(L, Error, 2, 0, true);
LuaHelpers::RunScriptOnStack(L, 2, 0);
LUA->Release(L);
+1 -2
View File
@@ -344,10 +344,9 @@ int ScoreKeeperNormal::CalcNextToastyAt(int level)
break;
case LUA_TFUNCTION:
{
RString err= "Error running ToastyTriggersAt: ";
LuaHelpers::Push(L, m_pPlayerState->m_PlayerNumber);
lua_pushnumber(L, level);
if(LuaHelpers::RunScriptOnStack(L, err, 2, 1, true))
if(LuaHelpers::RunScriptOnStack(L, 2, 1))
{
if(lua_isnumber(L, -1))
{
+1 -2
View File
@@ -360,8 +360,7 @@ bool Screen::PassInputToLua(const InputEventPlus& input)
{
callback->second.PushSelf(L);
lua_pushvalue(L, -2);
RString error= "Error running input callback: ";
LuaHelpers::RunScriptOnStack(L, error, 1, 1, true);
LuaHelpers::RunScriptOnStack(L, 1, 1);
handled= lua_toboolean(L, -1);
lua_pop(L, 1);
}
+1 -2
View File
@@ -547,8 +547,7 @@ void ScreenGameplay::Init()
++next_player_slot;
}
Enum::Push(L, GAMESTATE->GetCurrentStyle(PLAYER_INVALID)->m_StyleType);
RString err= "Error running MarginFunction: ";
if(LuaHelpers::RunScriptOnStack(L, err, 2, 3, true))
if(LuaHelpers::RunScriptOnStack(L, 2, 3))
{
RString marge= "Margin value must be a number.";
margins[PLAYER_1][0]= SafeFArg(L, -3, marge, 40);
+1 -2
View File
@@ -120,8 +120,7 @@ void ScreenSelectMaster::Init()
Lua* L= LUA->Get();
command.PushSelf(L);
lua_pushnumber(L, m_aGameCommands.size());
RString err= m_sName + "::IconChoicePosFunction: ";
if(!LuaHelpers::RunScriptOnStack(L, err, 1, 1, true))
if(!LuaHelpers::RunScriptOnStack(L, 1, 1))
{
positions_set_by_lua= false;
}
+5 -10
View File
@@ -458,8 +458,7 @@ static bool ValidateFromLua( const RString &sAnswer, RString &sErrorOut )
bool valid= false;
RString error= "Lua error in ScreenTextEntry Validate: ";
if(LuaHelpers::RunScriptOnStack(L, error, 2, 2, true))
if(LuaHelpers::RunScriptOnStack(L, 2, 2))
{
if(!lua_isstring(L, -1) || !lua_isboolean(L, -2))
{
@@ -492,8 +491,7 @@ static void OnOKFromLua( const RString &sAnswer )
g_OnOKFunc.PushSelf( L );
// Argument 1 (answer):
lua_pushstring( L, sAnswer );
RString error= "Lua error in ScreenTextEntry OnOK: ";
LuaHelpers::RunScriptOnStack(L, error, 1, 0, true);
LuaHelpers::RunScriptOnStack(L, 1, 0);
LUA->Release(L);
}
@@ -507,8 +505,7 @@ static void OnCancelFromLua()
Lua *L = LUA->Get();
g_OnCancelFunc.PushSelf( L );
RString error= "Lua error in ScreenTextEntry OnCancel: ";
LuaHelpers::RunScriptOnStack(L, error, 0, 0, true);
LuaHelpers::RunScriptOnStack(L, 0, 0);
LUA->Release(L);
}
@@ -531,8 +528,7 @@ static bool ValidateAppendFromLua( const RString &sAnswerBeforeChar, RString &sA
bool append= false;
RString error= "Lua error in ScreenTextEntry ValidateAppend: ";
if(LuaHelpers::RunScriptOnStack(L, error, 2, 1, true))
if(LuaHelpers::RunScriptOnStack(L, 2, 1))
{
if( !lua_isboolean(L, -1) )
{
@@ -561,8 +557,7 @@ static RString FormatAnswerForDisplayFromLua( const RString &sAnswer )
lua_pushstring( L, sAnswer );
RString answer;
RString error= "Lua error in ScreenTextEntry FormatAnswerForDisplay: ";
if(LuaHelpers::RunScriptOnStack(L, error, 1, 1, true))
if(LuaHelpers::RunScriptOnStack(L, 1, 1))
{
if( !lua_isstring(L, -1) )
{
+1 -2
View File
@@ -146,8 +146,7 @@ public:
// call function with 0 arguments and 1 result
m_Value.PushSelf( L );
RString error= m_sGroup + ": " + m_sName + ": ";
LuaHelpers::RunScriptOnStack(L, error, 0, 1, true);
LuaHelpers::RunScriptOnStack(L, 0, 1);
if(!lua_isnil(L, -1))
{
LuaHelpers::Pop( L, m_currentValue );
+1 -2
View File
@@ -502,8 +502,7 @@ void UnlockManager::Load()
current.PushSelf( L );
// call function with 1 argument and 0 results
RString error= "Lua error in command: ";
LuaHelpers::RunScriptOnStack(L, error, 1, 0, true);
LuaHelpers::RunScriptOnStack(L, 1, 0);
if( current.m_bRoulette )
m_RouletteCodes.insert( current.m_sEntryID );