improved stack cleanup for tailcalls

This commit is contained in:
albertodemichelis 2017-04-23 03:54:12 +08:00
parent 14cbc7b2dc
commit a0e46fce11

View File

@ -726,9 +726,13 @@ exception_restore:
if (type(t) == OT_CLOSURE if (type(t) == OT_CLOSURE
&& (!_closure(t)->_function->_bgenerator)){ && (!_closure(t)->_function->_bgenerator)){
SQObjectPtr clo = t; SQObjectPtr clo = t;
SQInteger last_top = _top;
if(_openouters) CloseOuters(&(_stack._vals[_stackbase])); if(_openouters) CloseOuters(&(_stack._vals[_stackbase]));
for (SQInteger i = 0; i < arg3; i++) STK(i) = STK(arg2 + i); for (SQInteger i = 0; i < arg3; i++) STK(i) = STK(arg2 + i);
_GUARD(StartCall(_closure(clo), ci->_target, arg3, _stackbase, true)); _GUARD(StartCall(_closure(clo), ci->_target, arg3, _stackbase, true));
if (last_top >= _top) {
_top = last_top;
}
continue; continue;
} }
} }