[DEV] remote _generator()
This commit is contained in:
parent
440bc87551
commit
056190e60b
@ -149,7 +149,6 @@ namespace rabbit {
|
|||||||
#define is_delegable(t) (sq_type(t)&SQOBJECT_DELEGABLE)
|
#define is_delegable(t) (sq_type(t)&SQOBJECT_DELEGABLE)
|
||||||
#define raw_type(obj) _RAW_TYPE((obj)._type)
|
#define raw_type(obj) _RAW_TYPE((obj)._type)
|
||||||
|
|
||||||
#define _generator(obj) ((obj)._unVal.pGenerator)
|
|
||||||
#define _nativeclosure(obj) ((obj)._unVal.pNativeClosure)
|
#define _nativeclosure(obj) ((obj)._unVal.pNativeClosure)
|
||||||
#define _userdata(obj) ((obj)._unVal.pUserData)
|
#define _userdata(obj) ((obj)._unVal.pUserData)
|
||||||
#define _userpointer(obj) ((obj)._unVal.pUserPointer)
|
#define _userpointer(obj) ((obj)._unVal.pUserPointer)
|
||||||
|
@ -577,15 +577,15 @@ bool rabbit::VirtualMachine::FOREACH_OP(rabbit::ObjectPtr &o1,rabbit::ObjectPtr
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case rabbit::OT_GENERATOR:
|
case rabbit::OT_GENERATOR:
|
||||||
if(_generator(o1)->_state == rabbit::Generator::eDead) _FINISH(exitpos);
|
if(o1.toGenerator()->_state == rabbit::Generator::eDead) _FINISH(exitpos);
|
||||||
if(_generator(o1)->_state == rabbit::Generator::eSuspended) {
|
if(o1.toGenerator()->_state == rabbit::Generator::eSuspended) {
|
||||||
int64_t idx = 0;
|
int64_t idx = 0;
|
||||||
if(sq_type(o4) == rabbit::OT_INTEGER) {
|
if(sq_type(o4) == rabbit::OT_INTEGER) {
|
||||||
idx = o4.toInteger() + 1;
|
idx = o4.toInteger() + 1;
|
||||||
}
|
}
|
||||||
o2 = idx;
|
o2 = idx;
|
||||||
o4 = idx;
|
o4 = idx;
|
||||||
_generator(o1)->resume(this, o3);
|
o1.toGenerator()->resume(this, o3);
|
||||||
_FINISH(0);
|
_FINISH(0);
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@ -706,7 +706,7 @@ bool rabbit::VirtualMachine::execute(rabbit::ObjectPtr &closure, int64_t nargs,
|
|||||||
ci->_root = SQTrue;
|
ci->_root = SQTrue;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ET_RESUME_GENERATOR: _generator(closure)->resume(this, outres); ci->_root = SQTrue; traps += ci->_etraps; break;
|
case ET_RESUME_GENERATOR: closure.toGenerator()->resume(this, outres); ci->_root = SQTrue; traps += ci->_etraps; break;
|
||||||
case ET_RESUME_VM:
|
case ET_RESUME_VM:
|
||||||
case ET_RESUME_THROW_VM:
|
case ET_RESUME_THROW_VM:
|
||||||
traps = _suspended_traps;
|
traps = _suspended_traps;
|
||||||
@ -1020,7 +1020,7 @@ exception_restore:
|
|||||||
continue;
|
continue;
|
||||||
case _OP_RESUME:
|
case _OP_RESUME:
|
||||||
if(sq_type(STK(arg1)) != rabbit::OT_GENERATOR){ raise_error("trying to resume a '%s',only genenerator can be resumed", getTypeName(STK(arg1))); SQ_THROW();}
|
if(sq_type(STK(arg1)) != rabbit::OT_GENERATOR){ raise_error("trying to resume a '%s',only genenerator can be resumed", getTypeName(STK(arg1))); SQ_THROW();}
|
||||||
_GUARD(_generator(STK(arg1))->resume(this, TARGET));
|
_GUARD(STK(arg1).toGenerator()->resume(this, TARGET));
|
||||||
traps += ci->_etraps;
|
traps += ci->_etraps;
|
||||||
continue;
|
continue;
|
||||||
case _OP_FOREACH:{ int tojump;
|
case _OP_FOREACH:{ int tojump;
|
||||||
@ -1029,7 +1029,7 @@ exception_restore:
|
|||||||
continue;
|
continue;
|
||||||
case _OP_POSTFOREACH:
|
case _OP_POSTFOREACH:
|
||||||
assert(sq_type(STK(arg0)) == rabbit::OT_GENERATOR);
|
assert(sq_type(STK(arg0)) == rabbit::OT_GENERATOR);
|
||||||
if(_generator(STK(arg0))->_state == rabbit::Generator::eDead)
|
if(STK(arg0).toGenerator()->_state == rabbit::Generator::eDead)
|
||||||
ci->_ip += (sarg1 - 1);
|
ci->_ip += (sarg1 - 1);
|
||||||
continue;
|
continue;
|
||||||
case _OP_CLONE: _GUARD(clone(STK(arg1), TARGET)); continue;
|
case _OP_CLONE: _GUARD(clone(STK(arg1), TARGET)); continue;
|
||||||
@ -1794,7 +1794,7 @@ void rabbit::VirtualMachine::dumpstack(int64_t stackbase,bool dumpall)
|
|||||||
case rabbit::OT_CLOSURE: printf("CLOSURE [%p]",obj.toClosure());break;
|
case rabbit::OT_CLOSURE: printf("CLOSURE [%p]",obj.toClosure());break;
|
||||||
case rabbit::OT_NATIVECLOSURE: printf("NATIVECLOSURE");break;
|
case rabbit::OT_NATIVECLOSURE: printf("NATIVECLOSURE");break;
|
||||||
case rabbit::OT_USERDATA: printf("USERDATA %p[%p]",_userdataval(obj),_userdata(obj)->_delegate);break;
|
case rabbit::OT_USERDATA: printf("USERDATA %p[%p]",_userdataval(obj),_userdata(obj)->_delegate);break;
|
||||||
case rabbit::OT_GENERATOR: printf("GENERATOR %p",_generator(obj));break;
|
case rabbit::OT_GENERATOR: printf("GENERATOR %p",obj.toGenerator());break;
|
||||||
case rabbit::OT_THREAD: printf("THREAD [%p]",_thread(obj));break;
|
case rabbit::OT_THREAD: printf("THREAD [%p]",_thread(obj));break;
|
||||||
case rabbit::OT_USERPOINTER: printf("USERPOINTER %p",_userpointer(obj));break;
|
case rabbit::OT_USERPOINTER: printf("USERPOINTER %p",_userpointer(obj));break;
|
||||||
case rabbit::OT_CLASS: printf("CLASS %p",_class(obj));break;
|
case rabbit::OT_CLASS: printf("CLASS %p",_class(obj));break;
|
||||||
|
@ -1039,7 +1039,7 @@ const rabbit::RegFunction rabbit::SharedState::_closure_default_delegate_funcz[]
|
|||||||
static int64_t generator_getstatus(rabbit::VirtualMachine* v)
|
static int64_t generator_getstatus(rabbit::VirtualMachine* v)
|
||||||
{
|
{
|
||||||
rabbit::Object &o=stack_get(v,1);
|
rabbit::Object &o=stack_get(v,1);
|
||||||
switch(_generator(o)->_state){
|
switch(o.toGenerator()->_state){
|
||||||
case rabbit::Generator::eSuspended:v->push(rabbit::String::create(_get_shared_state(v),"suspended"));break;
|
case rabbit::Generator::eSuspended:v->push(rabbit::String::create(_get_shared_state(v),"suspended"));break;
|
||||||
case rabbit::Generator::eRunning:v->push(rabbit::String::create(_get_shared_state(v),"running"));break;
|
case rabbit::Generator::eRunning:v->push(rabbit::String::create(_get_shared_state(v),"running"));break;
|
||||||
case rabbit::Generator::eDead:v->push(rabbit::String::create(_get_shared_state(v),"dead"));break;
|
case rabbit::Generator::eDead:v->push(rabbit::String::create(_get_shared_state(v),"dead"));break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user