[DEV] remote _instance()
This commit is contained in:
parent
36a162e89d
commit
be1fc5ae60
@ -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)
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user