mirror of
https://github.com/VCMP-SqMod/SqMod.git
synced 2025-02-21 20:27:13 +01:00
Fix bug in plugin caused by not popping the closure from the stack after calling it.
This would've caused the plugin to run out of stack memory eventually.
This commit is contained in:
parent
50dec8d958
commit
f51b4968ac
@ -1506,7 +1506,7 @@ struct StackGuard
|
|||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
~StackGuard()
|
~StackGuard()
|
||||||
{
|
{
|
||||||
sq_pop(m_VM, sq_gettop(m_VM) - m_Top);
|
Restore();
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
@ -1519,6 +1519,20 @@ struct StackGuard
|
|||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
StackGuard & operator = (StackGuard &&) = delete;
|
StackGuard & operator = (StackGuard &&) = delete;
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// Restore the stack to what was known to be.
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
void Restore() const
|
||||||
|
{
|
||||||
|
// Retrieve the new stack top
|
||||||
|
const SQInteger top = sq_gettop(m_VM);
|
||||||
|
// Did the stack size change?
|
||||||
|
if (top > m_Top)
|
||||||
|
{
|
||||||
|
sq_pop(m_VM, top - m_Top); // Trim the stack
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
HSQUIRRELVM m_VM; ///< The VM where the stack should be restored.
|
HSQUIRRELVM m_VM; ///< The VM where the stack should be restored.
|
||||||
|
@ -146,6 +146,8 @@ private:
|
|||||||
}
|
}
|
||||||
// Make the function call and store the result
|
// Make the function call and store the result
|
||||||
const SQRESULT res = sq_call(vm, mArgc + 1, false, !mQuiet);
|
const SQRESULT res = sq_call(vm, mArgc + 1, false, !mQuiet);
|
||||||
|
// Pop the callback object from the stack
|
||||||
|
sq_pop(vm, 1);
|
||||||
// Validate the result
|
// Validate the result
|
||||||
if (SQ_FAILED(res))
|
if (SQ_FAILED(res))
|
||||||
{
|
{
|
||||||
|
@ -86,6 +86,8 @@ Tasks::Interval Tasks::Task::Execute()
|
|||||||
}
|
}
|
||||||
// Make the function call and store the result
|
// Make the function call and store the result
|
||||||
const SQRESULT res = sq_call(vm, mArgc + 1, false, ErrorHandling::IsEnabled());
|
const SQRESULT res = sq_call(vm, mArgc + 1, false, ErrorHandling::IsEnabled());
|
||||||
|
// Pop the callback object from the stack
|
||||||
|
sq_pop(vm, 1);
|
||||||
// Validate the result
|
// Validate the result
|
||||||
if (SQ_FAILED(res))
|
if (SQ_FAILED(res))
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user