|
@@ -952,35 +952,36 @@ exception_restore:
|
|
|
}
|
|
}
|
|
|
OPCODE_TARGET(CALL) {
|
|
OPCODE_TARGET(CALL) {
|
|
|
SQObjectPtr clo = STK(arg1);
|
|
SQObjectPtr clo = STK(arg1);
|
|
|
|
|
+ int tgt0 = arg0 == 255 ? -1 : arg0;
|
|
|
switch (sq_type(clo)) {
|
|
switch (sq_type(clo)) {
|
|
|
case OT_CLOSURE:
|
|
case OT_CLOSURE:
|
|
|
- _GUARD(StartCall(_closure(clo), sarg0, arg3, _stackbase+arg2, false));
|
|
|
|
|
|
|
+ _GUARD(StartCall(_closure(clo), tgt0, arg3, _stackbase+arg2, false));
|
|
|
continue;
|
|
continue;
|
|
|
case OT_NATIVECLOSURE: {
|
|
case OT_NATIVECLOSURE: {
|
|
|
bool suspend;
|
|
bool suspend;
|
|
|
bool tailcall;
|
|
bool tailcall;
|
|
|
- _GUARD(CallNative(_nativeclosure(clo), arg3, _stackbase+arg2, clo, (SQInt32)sarg0, suspend, tailcall));
|
|
|
|
|
|
|
+ _GUARD(CallNative(_nativeclosure(clo), arg3, _stackbase+arg2, clo, tgt0, suspend, tailcall));
|
|
|
#ifdef SQ_WITH_DELAYED_RELEASE_HOOKS
|
|
#ifdef SQ_WITH_DELAYED_RELEASE_HOOKS
|
|
|
if(_check_delayed_relase_hooks) _sharedstate->CallDelayedReleaseHooks(this);
|
|
if(_check_delayed_relase_hooks) _sharedstate->CallDelayedReleaseHooks(this);
|
|
|
#endif
|
|
#endif
|
|
|
if(suspend){
|
|
if(suspend){
|
|
|
_suspended = SQTrue;
|
|
_suspended = SQTrue;
|
|
|
- _suspended_target = sarg0;
|
|
|
|
|
|
|
+ _suspended_target = tgt0;
|
|
|
_suspended_root = ci->_root;
|
|
_suspended_root = ci->_root;
|
|
|
_suspended_traps = traps;
|
|
_suspended_traps = traps;
|
|
|
outres = clo;
|
|
outres = clo;
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
- if((sarg0 != -1) && !tailcall) {
|
|
|
|
|
- STK(arg0) = clo;
|
|
|
|
|
|
|
+ if((tgt0 != -1) && !tailcall) {
|
|
|
|
|
+ STK(tgt0) = clo;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
continue;
|
|
continue;
|
|
|
case OT_CLASS:{
|
|
case OT_CLASS:{
|
|
|
SQObjectPtr inst;
|
|
SQObjectPtr inst;
|
|
|
_GUARD(CreateClassInstance(_class(clo),inst,clo));
|
|
_GUARD(CreateClassInstance(_class(clo),inst,clo));
|
|
|
- if(sarg0 != -1) {
|
|
|
|
|
- STK(arg0) = inst;
|
|
|
|
|
|
|
+ if(tgt0 != -1) {
|
|
|
|
|
+ STK(tgt0) = inst;
|
|
|
}
|
|
}
|
|
|
SQInteger stkbase;
|
|
SQInteger stkbase;
|
|
|
switch(sq_type(clo)) {
|
|
switch(sq_type(clo)) {
|
|
@@ -1007,8 +1008,8 @@ exception_restore:
|
|
|
Push(clo);
|
|
Push(clo);
|
|
|
for (SQInteger i = 0; i < arg3; i++) Push(STK(arg2 + i));
|
|
for (SQInteger i = 0; i < arg3; i++) Push(STK(arg2 + i));
|
|
|
if(!CallMetaMethod(closure, MT_CALL, arg3+1, clo)) SQ_THROW();
|
|
if(!CallMetaMethod(closure, MT_CALL, arg3+1, clo)) SQ_THROW();
|
|
|
- if(sarg0 != -1) {
|
|
|
|
|
- STK(arg0) = clo;
|
|
|
|
|
|
|
+ if(tgt0 != -1) {
|
|
|
|
|
+ STK(tgt0) = clo;
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|