[DEV] remote _instance()

This commit is contained in:
Edouard DUPIN 2018-07-03 22:19:33 +02:00
parent 36a162e89d
commit be1fc5ae60
3 changed files with 17 additions and 18 deletions

View File

@ -149,7 +149,6 @@ namespace rabbit {
#define is_delegable(t) (sq_type(t)&SQOBJECT_DELEGABLE)
#define raw_type(obj) _RAW_TYPE((obj)._type)
#define _instance(obj) ((obj)._unVal.pInstance)
#define _delegable(obj) ((rabbit::Delegable *)(obj)._unVal.pDelegable)
#define _weakref(obj) ((obj)._unVal.pWeakRef)
#define _outer(obj) ((obj)._unVal.pOuter)

View File

@ -972,7 +972,7 @@ exception_restore:
case _OP_INSTANCEOF:
if(sq_type(STK(arg1)) != rabbit::OT_CLASS)
{raise_error("cannot apply instanceof between a %s and a %s",getTypeName(STK(arg1)),getTypeName(STK(arg2))); SQ_THROW();}
TARGET = (sq_type(STK(arg2)) == rabbit::OT_INSTANCE) ? (_instance(STK(arg2))->instanceOf(STK(arg1).toClass())?true:false) : false;
TARGET = (sq_type(STK(arg2)) == rabbit::OT_INSTANCE) ? (STK(arg2).toInstance()->instanceOf(STK(arg1).toClass())?true:false) : false;
continue;
case _OP_AND:
if(IsFalse(STK(arg2))) {
@ -1260,7 +1260,7 @@ bool rabbit::VirtualMachine::get(const rabbit::ObjectPtr &self, const rabbit::Ob
}
break;
case rabbit::OT_INSTANCE:
if(_instance(self)->get(key,dest)) {
if(const_cast<rabbit::Instance*>(self.toInstance())->get(key,dest)) {
return true;
}
break;
@ -1377,7 +1377,7 @@ bool rabbit::VirtualMachine::set(const rabbit::ObjectPtr &self,const rabbit::Obj
if(self.toTable()->set(key,val)) return true;
break;
case rabbit::OT_INSTANCE:
if(_instance(self)->set(key,val)) return true;
if(const_cast<rabbit::Instance*>(self.toInstance())->set(key,val)) return true;
break;
case rabbit::OT_ARRAY:
if(!sq_isnumeric(key)) { raise_error("indexing %s with %s",getTypeName(self),getTypeName(key)); return false; }
@ -1449,7 +1449,7 @@ bool rabbit::VirtualMachine::clone(const rabbit::ObjectPtr &self,rabbit::ObjectP
newobj = self.toTable()->clone();
goto cloned_mt;
case rabbit::OT_INSTANCE: {
newobj = _instance(self)->clone(_get_shared_state(this));
newobj = const_cast<rabbit::Instance*>(self.toInstance())->clone(_get_shared_state(this));
cloned_mt:
rabbit::ObjectPtr closure;
if(_delegable(newobj)->_delegate && _delegable(newobj)->getMetaMethod(this,MT_CLONED,closure)) {
@ -1798,7 +1798,7 @@ void rabbit::VirtualMachine::dumpstack(int64_t stackbase,bool dumpall)
case rabbit::OT_THREAD: printf("THREAD [%p]",obj.toVirtualMachine());break;
case rabbit::OT_USERPOINTER: printf("USERPOINTER %p",obj.toUserPointer());break;
case rabbit::OT_CLASS: printf("CLASS %p",obj.toClass());break;
case rabbit::OT_INSTANCE: printf("INSTANCE %p",_instance(obj));break;
case rabbit::OT_INSTANCE: printf("INSTANCE %p",obj.toInstance());break;
case rabbit::OT_WEAKREF: printf("WEAKERF %p",_weakref(obj));break;
default:
assert(0);

View File

@ -315,7 +315,7 @@ rabbit::Bool rabbit::sq_instanceof(rabbit::VirtualMachine* v)
if( sq_type(inst) != rabbit::OT_INSTANCE
|| sq_type(cl) != rabbit::OT_CLASS)
return sq_throwerror(v,"invalid param type");
return _instance(inst)->instanceOf(cl.toClass())?SQTrue:SQFalse;
return inst.toInstance()->instanceOf(cl.toClass())?SQTrue:SQFalse;
}
rabbit::Result rabbit::sq_arrayappend(rabbit::VirtualMachine* v,int64_t idx)
@ -741,7 +741,7 @@ int64_t rabbit::sq_getsize(rabbit::VirtualMachine* v, int64_t idx)
case rabbit::OT_TABLE: return o.toTable()->countUsed();
case rabbit::OT_ARRAY: return o.toArray()->size();
case rabbit::OT_USERDATA: return o.toUserData()->getsize();
case rabbit::OT_INSTANCE: return _instance(o)->_class->_udsize;
case rabbit::OT_INSTANCE: return o.toInstance()->_class->_udsize;
case rabbit::OT_CLASS: return o.toClass()->_udsize;
default:
return sq_aux_invalidtype(v, type);
@ -784,7 +784,7 @@ rabbit::Result rabbit::sq_settypetag(rabbit::VirtualMachine* v,int64_t idx,rabbi
rabbit::Result rabbit::sq_getobjtypetag(const rabbit::Object *o,rabbit::UserPointer * typetag)
{
switch(sq_type(*o)) {
case rabbit::OT_INSTANCE: *typetag = _instance(*o)->_class->_typetag; break;
case rabbit::OT_INSTANCE: *typetag = o->toInstance()->_class->_typetag; break;
case rabbit::OT_USERDATA: *typetag = o->toUserData()->getTypeTag(); break;
case rabbit::OT_CLASS: *typetag = o->toClass()->_typetag; break;
default: return SQ_ERROR;
@ -812,7 +812,7 @@ rabbit::Result rabbit::sq_setinstanceup(rabbit::VirtualMachine* v, int64_t idx,
{
rabbit::ObjectPtr &o = stack_get(v,idx);
if(sq_type(o) != rabbit::OT_INSTANCE) return sq_throwerror(v,"the object is not a class instance");
_instance(o)->_userpointer = p;
o.toInstance()->_userpointer = p;
return SQ_OK;
}
@ -830,9 +830,9 @@ rabbit::Result rabbit::sq_getinstanceup(rabbit::VirtualMachine* v, int64_t idx,
{
rabbit::ObjectPtr &o = stack_get(v,idx);
if(sq_type(o) != rabbit::OT_INSTANCE) return sq_throwerror(v,"the object is not a class instance");
(*p) = _instance(o)->_userpointer;
(*p) = o.toInstance()->_userpointer;
if(typetag != 0) {
rabbit::Class *cl = _instance(o)->_class;
rabbit::Class *cl = o.toInstance()->_class;
do{
if(cl->_typetag == typetag)
return SQ_OK;
@ -942,7 +942,7 @@ rabbit::Result rabbit::sq_rawset(rabbit::VirtualMachine* v,int64_t idx)
return SQ_OK;
break;
case rabbit::OT_INSTANCE:
if(_instance(self)->set(key, v->getUp(-1))) {
if(self.toInstance()->set(key, v->getUp(-1))) {
v->pop(2);
return SQ_OK;
}
@ -1078,7 +1078,7 @@ rabbit::Result rabbit::sq_rawget(rabbit::VirtualMachine* v,int64_t idx)
return SQ_OK;
break;
case rabbit::OT_INSTANCE:
if(_instance(self)->get(obj,obj))
if(self.toInstance()->get(obj,obj))
return SQ_OK;
break;
case rabbit::OT_ARRAY:
@ -1267,7 +1267,7 @@ void rabbit::sq_setreleasehook(rabbit::VirtualMachine* v,int64_t idx,SQRELEASEHO
ud.toUserData()->setHook(hook);
break;
case rabbit::OT_INSTANCE:
_instance(ud)->_hook = hook;
ud.toInstance()->_hook = hook;
break;
case rabbit::OT_CLASS:
ud.toClass()->_hook = hook;
@ -1285,7 +1285,7 @@ SQRELEASEHOOK rabbit::sq_getreleasehook(rabbit::VirtualMachine* v,int64_t idx)
return ud.toUserData()->getHook();
break;
case rabbit::OT_INSTANCE:
return _instance(ud)->_hook;
return ud.toInstance()->_hook;
break;
case rabbit::OT_CLASS:
return ud.toClass()->_hook;
@ -1472,7 +1472,7 @@ rabbit::Result _getmemberbyhandle(rabbit::VirtualMachine* v,rabbit::ObjectPtr &s
{
switch(sq_type(self)) {
case rabbit::OT_INSTANCE: {
rabbit::Instance *i = _instance(self);
rabbit::Instance *i = self.toInstance();
if(handle->_static) {
rabbit::Class *c = i->_class;
val = &c->_methods[handle->_index].val;
@ -1538,7 +1538,7 @@ rabbit::Result rabbit::sq_getclass(rabbit::VirtualMachine* v,int64_t idx)
{
rabbit::ObjectPtr *o = NULL;
_GETSAFE_OBJ(v, idx, rabbit::OT_INSTANCE,o);
v->push(rabbit::ObjectPtr(_instance(*o)->_class));
v->push(rabbit::ObjectPtr(o->toInstance()->_class));
return SQ_OK;
}