Tweak inlined VM_OnEvent() internals, biggest change being the removal of two instances of EDUKE32_PREDICT_FALSE

git-svn-id: https://svn.eduke32.com/eduke32@7637 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
terminx 2019-05-19 03:53:30 +00:00 committed by Christoph Oelckers
parent 562e6f419c
commit f8fba45117

View file

@ -157,30 +157,29 @@ static inline void VM_DummySprite(void)
static FORCE_INLINE int32_t VM_EventInlineInternal__(int const &eventNum, int const &spriteNum, int const &playerNum, static FORCE_INLINE int32_t VM_EventInlineInternal__(int const &eventNum, int const &spriteNum, int const &playerNum,
int const playerDist = -1, int32_t returnValue = 0) int const playerDist = -1, int32_t returnValue = 0)
{ {
vmstate_t const tempvm = { spriteNum, playerNum, playerDist, 0, &sprite[spriteNum], &actor[spriteNum].t_data[0], g_player[playerNum].ps, &actor[spriteNum] }; vmstate_t const newVMstate = { spriteNum, playerNum, playerDist, 0, &sprite[spriteNum],
&actor[spriteNum].t_data[0], g_player[playerNum].ps, &actor[spriteNum] };
auto &globalReturn = aGameVars[g_returnVarID].global;
typedef struct struct
{ {
vmstate_t vm; vmstate_t vm;
intptr_t returnVar; intptr_t globalReturn;
int currentEvent; int eventNum;
intptr_t const *insptr; intptr_t const *insptr;
} eventbackup_t; } const saved = { vm, globalReturn, g_currentEvent, insptr };
auto &returnVar = aGameVars[g_returnVarID].global; vm = newVMstate;
eventbackup_t const backup = { vm, returnVar, eventNum, insptr };
g_currentEvent = eventNum; g_currentEvent = eventNum;
insptr = apScript + apScriptEvents[eventNum];
globalReturn = returnValue;
double const t = timerGetHiTicks(); double const t = timerGetHiTicks();
vm = tempvm; if ((unsigned)spriteNum >= MAXSPRITES)
returnVar = returnValue;
insptr = apScript + apScriptEvents[eventNum];
if (EDUKE32_PREDICT_FALSE((unsigned)spriteNum >= MAXSPRITES))
VM_DummySprite(); VM_DummySprite();
if (EDUKE32_PREDICT_FALSE((unsigned)playerNum >= (unsigned)g_mostConcurrentPlayers)) if ((unsigned)playerNum >= (unsigned)g_mostConcurrentPlayers)
vm.pPlayer = g_player[0].ps; vm.pPlayer = g_player[0].ps;
VM_Execute(true); VM_Execute(true);
@ -188,19 +187,17 @@ static FORCE_INLINE int32_t VM_EventInlineInternal__(int const &eventNum, int co
if (vm.flags & VM_KILL) if (vm.flags & VM_KILL)
VM_DeleteSprite(vm.spriteNum, vm.playerNum); VM_DeleteSprite(vm.spriteNum, vm.playerNum);
// this needs to happen after VM_DeleteSprite() because VM_DeleteSprite()
// can trigger additional events
returnValue = returnVar;
vm = backup.vm;
returnVar = backup.returnVar;
g_currentEvent = backup.currentEvent;
insptr = backup.insptr;
g_eventTotalMs[eventNum] += timerGetHiTicks()-t; g_eventTotalMs[eventNum] += timerGetHiTicks()-t;
g_eventCalls[eventNum]++; g_eventCalls[eventNum]++;
// restoring these needs to happen after VM_DeleteSprite() due to event recursion
returnValue = globalReturn;
vm = saved.vm;
globalReturn = saved.globalReturn;
g_currentEvent = saved.eventNum;
insptr = saved.insptr;
return returnValue; return returnValue;
} }
#endif #endif
@ -228,6 +225,7 @@ int32_t VM_ExecuteEventWithValue(int const nEventID, int const spriteNum, int co
return VM_EventInlineInternal__(nEventID, spriteNum, playerNum, -1, nReturn); return VM_EventInlineInternal__(nEventID, spriteNum, playerNum, -1, nReturn);
} }
static bool VM_CheckSquished(void) static bool VM_CheckSquished(void)
{ {
auto const pSector = (usectorptr_t)&sector[vm.pSprite->sectnum]; auto const pSector = (usectorptr_t)&sector[vm.pSprite->sectnum];