[DEV] remote _generator()

This commit is contained in:
Edouard DUPIN 2018-07-03 22:04:48 +02:00
parent 440bc87551
commit 056190e60b
3 changed files with 8 additions and 9 deletions

View File

@ -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)

View File

@ -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;

View File

@ -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;