(svn r17515) -Fix [FS#3189]: [Squirrel] In some cases the call stack would not be cleaned up properly during crash handling. Occasionally this causes asserts to be triggered or crashes.

This commit is contained in:
rubidium 2009-09-12 20:31:41 +00:00
parent e720d23d86
commit afc7f576f7

View File

@ -1165,6 +1165,8 @@ bool SQVM::CallNative(SQNativeClosure *nclosure,SQInteger nargs,SQInteger stackb
} }
/* Store the call stack size, so we can restore that */
SQInteger cstksize = _callsstacksize;
SQInteger ret; SQInteger ret;
try { try {
SQBool can_suspend = this->_can_suspend; SQBool can_suspend = this->_can_suspend;
@ -1175,6 +1177,7 @@ bool SQVM::CallNative(SQNativeClosure *nclosure,SQInteger nargs,SQInteger stackb
_nnativecalls--; _nnativecalls--;
suspend = false; suspend = false;
_callsstacksize = cstksize;
_stackbase = oldstackbase; _stackbase = oldstackbase;
_top = oldtop; _top = oldtop;
@ -1184,6 +1187,8 @@ bool SQVM::CallNative(SQNativeClosure *nclosure,SQInteger nargs,SQInteger stackb
throw; throw;
} }
assert(cstksize == _callsstacksize);
_nnativecalls--; _nnativecalls--;
suspend = false; suspend = false;
if( ret == SQ_SUSPEND_FLAG) suspend = true; if( ret == SQ_SUSPEND_FLAG) suspend = true;