[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 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 _instance(obj) ((obj)._unVal.pInstance)
#define _delegable(obj) ((rabbit::Delegable *)(obj)._unVal.pDelegable) #define _delegable(obj) ((rabbit::Delegable *)(obj)._unVal.pDelegable)
#define _weakref(obj) ((obj)._unVal.pWeakRef) #define _weakref(obj) ((obj)._unVal.pWeakRef)
#define _outer(obj) ((obj)._unVal.pOuter) #define _outer(obj) ((obj)._unVal.pOuter)

View File

@ -972,7 +972,7 @@ exception_restore:
case _OP_INSTANCEOF: case _OP_INSTANCEOF:
if(sq_type(STK(arg1)) != rabbit::OT_CLASS) 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();} {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; continue;
case _OP_AND: case _OP_AND:
if(IsFalse(STK(arg2))) { if(IsFalse(STK(arg2))) {
@ -1260,7 +1260,7 @@ bool rabbit::VirtualMachine::get(const rabbit::ObjectPtr &self, const rabbit::Ob
} }
break; break;
case rabbit::OT_INSTANCE: case rabbit::OT_INSTANCE:
if(_instance(self)->get(key,dest)) { if(const_cast<rabbit::Instance*>(self.toInstance())->get(key,dest)) {
return true; return true;
} }
break; break;
@ -1377,7 +1377,7 @@ bool rabbit::VirtualMachine::set(const rabbit::ObjectPtr &self,const rabbit::Obj
if(self.toTable()->set(key,val)) return true; if(self.toTable()->set(key,val)) return true;
break; break;
case rabbit::OT_INSTANCE: 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; break;
case rabbit::OT_ARRAY: case rabbit::OT_ARRAY:
if(!sq_isnumeric(key)) { raise_error("indexing %s with %s",getTypeName(self),getTypeName(key)); return false; } 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(); newobj = self.toTable()->clone();
goto cloned_mt; goto cloned_mt;
case rabbit::OT_INSTANCE: { 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: cloned_mt:
rabbit::ObjectPtr closure; rabbit::ObjectPtr closure;
if(_delegable(newobj)->_delegate && _delegable(newobj)->getMetaMethod(this,MT_CLONED,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_THREAD: printf("THREAD [%p]",obj.toVirtualMachine());break;
case rabbit::OT_USERPOINTER: printf("USERPOINTER %p",obj.toUserPointer());break; case rabbit::OT_USERPOINTER: printf("USERPOINTER %p",obj.toUserPointer());break;
case rabbit::OT_CLASS: printf("CLASS %p",obj.toClass());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; case rabbit::OT_WEAKREF: printf("WEAKERF %p",_weakref(obj));break;
default: default:
assert(0); assert(0);

View File

@ -315,7 +315,7 @@ rabbit::Bool rabbit::sq_instanceof(rabbit::VirtualMachine* v)
if( sq_type(inst) != rabbit::OT_INSTANCE if( sq_type(inst) != rabbit::OT_INSTANCE
|| sq_type(cl) != rabbit::OT_CLASS) || sq_type(cl) != rabbit::OT_CLASS)
return sq_throwerror(v,"invalid param type"); 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) 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_TABLE: return o.toTable()->countUsed();
case rabbit::OT_ARRAY: return o.toArray()->size(); case rabbit::OT_ARRAY: return o.toArray()->size();
case rabbit::OT_USERDATA: return o.toUserData()->getsize(); 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; case rabbit::OT_CLASS: return o.toClass()->_udsize;
default: default:
return sq_aux_invalidtype(v, type); 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) rabbit::Result rabbit::sq_getobjtypetag(const rabbit::Object *o,rabbit::UserPointer * typetag)
{ {
switch(sq_type(*o)) { 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_USERDATA: *typetag = o->toUserData()->getTypeTag(); break;
case rabbit::OT_CLASS: *typetag = o->toClass()->_typetag; break; case rabbit::OT_CLASS: *typetag = o->toClass()->_typetag; break;
default: return SQ_ERROR; 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); 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"); 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; 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); 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"); 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) { if(typetag != 0) {
rabbit::Class *cl = _instance(o)->_class; rabbit::Class *cl = o.toInstance()->_class;
do{ do{
if(cl->_typetag == typetag) if(cl->_typetag == typetag)
return SQ_OK; return SQ_OK;
@ -942,7 +942,7 @@ rabbit::Result rabbit::sq_rawset(rabbit::VirtualMachine* v,int64_t idx)
return SQ_OK; return SQ_OK;
break; break;
case rabbit::OT_INSTANCE: case rabbit::OT_INSTANCE:
if(_instance(self)->set(key, v->getUp(-1))) { if(self.toInstance()->set(key, v->getUp(-1))) {
v->pop(2); v->pop(2);
return SQ_OK; return SQ_OK;
} }
@ -1078,7 +1078,7 @@ rabbit::Result rabbit::sq_rawget(rabbit::VirtualMachine* v,int64_t idx)
return SQ_OK; return SQ_OK;
break; break;
case rabbit::OT_INSTANCE: case rabbit::OT_INSTANCE:
if(_instance(self)->get(obj,obj)) if(self.toInstance()->get(obj,obj))
return SQ_OK; return SQ_OK;
break; break;
case rabbit::OT_ARRAY: case rabbit::OT_ARRAY:
@ -1267,7 +1267,7 @@ void rabbit::sq_setreleasehook(rabbit::VirtualMachine* v,int64_t idx,SQRELEASEHO
ud.toUserData()->setHook(hook); ud.toUserData()->setHook(hook);
break; break;
case rabbit::OT_INSTANCE: case rabbit::OT_INSTANCE:
_instance(ud)->_hook = hook; ud.toInstance()->_hook = hook;
break; break;
case rabbit::OT_CLASS: case rabbit::OT_CLASS:
ud.toClass()->_hook = hook; ud.toClass()->_hook = hook;
@ -1285,7 +1285,7 @@ SQRELEASEHOOK rabbit::sq_getreleasehook(rabbit::VirtualMachine* v,int64_t idx)
return ud.toUserData()->getHook(); return ud.toUserData()->getHook();
break; break;
case rabbit::OT_INSTANCE: case rabbit::OT_INSTANCE:
return _instance(ud)->_hook; return ud.toInstance()->_hook;
break; break;
case rabbit::OT_CLASS: case rabbit::OT_CLASS:
return ud.toClass()->_hook; return ud.toClass()->_hook;
@ -1472,7 +1472,7 @@ rabbit::Result _getmemberbyhandle(rabbit::VirtualMachine* v,rabbit::ObjectPtr &s
{ {
switch(sq_type(self)) { switch(sq_type(self)) {
case rabbit::OT_INSTANCE: { case rabbit::OT_INSTANCE: {
rabbit::Instance *i = _instance(self); rabbit::Instance *i = self.toInstance();
if(handle->_static) { if(handle->_static) {
rabbit::Class *c = i->_class; rabbit::Class *c = i->_class;
val = &c->_methods[handle->_index].val; 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; rabbit::ObjectPtr *o = NULL;
_GETSAFE_OBJ(v, idx, rabbit::OT_INSTANCE,o); _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; return SQ_OK;
} }