_errorhandler = _null_;
_debughook = _null_;
temp_reg = _null_;
+ _callstackdata.resize(0);
SQInteger size=_stack.size();
for(SQInteger i=0;i<size;i++)
_stack[i]=_null_;
SQVM::~SQVM()
{
Finalize();
- sq_free(_callsstack,_alloccallsstacksize*sizeof(CallInfo));
+ //sq_free(_callsstack,_alloccallsstacksize*sizeof(CallInfo));
REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
}
_stack.resize(stacksize);
//_callsstack.reserve(4);
_alloccallsstacksize = 4;
+ _callstackdata.resize(_alloccallsstacksize);
_callsstacksize = 0;
- _callsstack = (CallInfo*)sq_malloc(_alloccallsstacksize*sizeof(CallInfo));
+ _callsstack = &_callstackdata[0];
+ //_callsstack = (CallInfo*)sq_malloc(_alloccallsstacksize*sizeof(CallInfo));
_stackbase = 0;
_top = 0;
if(!friendvm)
if (!tailcall) {
CallInfo lc;
+ lc._generator = NULL;
lc._etraps = 0;
lc._prevstkbase = (SQInt32) ( stackbase - _stackbase );
lc._target = (SQInt32) target;
}
ci->_vargs.size = (SQInt32)(nargs - paramssize);
ci->_vargs.base = (SQInt32)(_vargsstack.size()-(ci->_vargs.size));
- ci->_closure._unVal.pClosure = closure;
- ci->_closure._type = OT_CLOSURE;
+ ci->_closure = closure;
ci->_literals = func->_literals;
ci->_ip = func->_instructions;
//grows the stack if needed
case _OP_ARITH: _GUARD(ARITH_OP( arg3 , temp_reg, STK(arg2), STK(arg1))); TARGET = temp_reg; continue;
case _OP_BITW: _GUARD(BW_OP( arg3,TARGET,STK(arg2),STK(arg1))); continue;
case _OP_RETURN:
- if(type((ci)->_generator) == OT_GENERATOR) {
- _generator((ci)->_generator)->Kill();
+ if(ci->_generator) {
+ ci->_generator->Kill();
}
if(Return(arg0, arg1, temp_reg)){
assert(traps==0);
continue;
}
case _OP_YIELD:{
- if(type(ci->_generator) == OT_GENERATOR) {
+ if(ci->_generator) {
if(sarg1 != MAX_FUNC_STACKSIZE) temp_reg = STK(arg1);
- _GUARD(_generator(ci->_generator)->Yield(this));
+ _GUARD(ci->_generator->Yield(this));
traps -= ci->_etraps;
if(sarg1 != MAX_FUNC_STACKSIZE) STK(arg1) = temp_reg;
}
//if is a native closure
if(type(ci->_closure) != OT_CLOSURE && n)
break;
- if(type(ci->_generator) == OT_GENERATOR) _generator(ci->_generator)->Kill();
+ if(ci->_generator) ci->_generator->Kill();
PopVarArgs(ci->_vargs);
POP_CALLINFO(this);
n++;
//remove call stack until a C function is found or the cstack is empty
if(ci) do {
SQBool exitafterthisone = ci->_root;
- if(type(ci->_generator) == OT_GENERATOR) _generator(ci->_generator)->Kill();
+ if(ci->_generator) ci->_generator->Kill();
_stackbase -= ci->_prevstkbase;
_top = _stackbase + ci->_prevtop;
PopVarArgs(ci->_vargs);
SQInteger oldstackbase = _stackbase;
_top = stackbase + nargs;
CallInfo lci;
+ lci._closure = nclosure;
+ lci._generator = NULL;
lci._etraps = 0;
- lci._closure._unVal.pNativeClosure = nclosure;
- lci._closure._type = OT_NATIVECLOSURE;
lci._prevstkbase = (SQInt32) (stackbase - _stackbase);
lci._ncalls = 1;
lci._prevtop = (SQInt32) (oldtop - oldstackbase);
return false;
}
- if (ret != 0){ retval = TOP(); }
+ if (ret != 0){ retval = TOP(); TOP().Null(); }
else { retval = _null_; }
_stackbase = oldstackbase;
_top = oldtop;