[DEV] remote _delegable()
This commit is contained in:
parent
be1fc5ae60
commit
0f8fe6003f
@ -13,7 +13,7 @@
|
|||||||
#include <rabbit/SharedState.hpp>
|
#include <rabbit/SharedState.hpp>
|
||||||
|
|
||||||
|
|
||||||
bool rabbit::Delegable::getMetaMethod(rabbit::VirtualMachine *v,rabbit::MetaMethod mm,rabbit::ObjectPtr &res) {
|
bool rabbit::Delegable::getMetaMethod(rabbit::VirtualMachine *v,rabbit::MetaMethod mm,rabbit::ObjectPtr &res) const {
|
||||||
if(_delegate) {
|
if(_delegate) {
|
||||||
return _delegate->get((*_get_shared_state(v)->_metamethods)[mm],res);
|
return _delegate->get((*_get_shared_state(v)->_metamethods)[mm],res);
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ namespace rabbit {
|
|||||||
public:
|
public:
|
||||||
bool setDelegate(rabbit::Table *m);
|
bool setDelegate(rabbit::Table *m);
|
||||||
public:
|
public:
|
||||||
virtual bool getMetaMethod(rabbit::VirtualMachine *v, rabbit::MetaMethod mm, rabbit::ObjectPtr& res);
|
virtual bool getMetaMethod(rabbit::VirtualMachine *v, rabbit::MetaMethod mm, rabbit::ObjectPtr& res) const;
|
||||||
rabbit::Table *_delegate;
|
mutable rabbit::Table *_delegate;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -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 _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)
|
||||||
#define _refcounted(obj) ((obj)._unVal.pRefCounted)
|
#define _refcounted(obj) ((obj)._unVal.pRefCounted)
|
||||||
|
@ -180,10 +180,10 @@ bool rabbit::VirtualMachine::arithMetaMethod(int64_t op,const rabbit::ObjectPtr
|
|||||||
case '%': mm=MT_MODULO; break;
|
case '%': mm=MT_MODULO; break;
|
||||||
default: mm = MT_ADD; assert(0); break; //shutup compiler
|
default: mm = MT_ADD; assert(0); break; //shutup compiler
|
||||||
}
|
}
|
||||||
if(is_delegable(o1) && _delegable(o1)->_delegate) {
|
if(is_delegable(o1) && o1.toDelegable()->_delegate) {
|
||||||
|
|
||||||
rabbit::ObjectPtr closure;
|
rabbit::ObjectPtr closure;
|
||||||
if(_delegable(o1)->getMetaMethod(this, mm, closure)) {
|
if(o1.toDelegable()->getMetaMethod(this, mm, closure)) {
|
||||||
push(o1);
|
push(o1);
|
||||||
push(o2);
|
push(o2);
|
||||||
return callMetaMethod(closure,mm,2,dest);
|
return callMetaMethod(closure,mm,2,dest);
|
||||||
@ -206,9 +206,9 @@ bool rabbit::VirtualMachine::NEG_OP(rabbit::ObjectPtr &trg,const rabbit::ObjectP
|
|||||||
case rabbit::OT_TABLE:
|
case rabbit::OT_TABLE:
|
||||||
case rabbit::OT_USERDATA:
|
case rabbit::OT_USERDATA:
|
||||||
case rabbit::OT_INSTANCE:
|
case rabbit::OT_INSTANCE:
|
||||||
if(_delegable(o)->_delegate) {
|
if(o.toDelegable()->_delegate) {
|
||||||
rabbit::ObjectPtr closure;
|
rabbit::ObjectPtr closure;
|
||||||
if(_delegable(o)->getMetaMethod(this, MT_UNM, closure)) {
|
if(o.toDelegable()->getMetaMethod(this, MT_UNM, closure)) {
|
||||||
push(o);
|
push(o);
|
||||||
if(!callMetaMethod(closure, MT_UNM, 1, temp_reg)) return false;
|
if(!callMetaMethod(closure, MT_UNM, 1, temp_reg)) return false;
|
||||||
_Swap(trg,temp_reg);
|
_Swap(trg,temp_reg);
|
||||||
@ -239,9 +239,9 @@ bool rabbit::VirtualMachine::objCmp(const rabbit::ObjectPtr &o1,const rabbit::Ob
|
|||||||
case rabbit::OT_TABLE:
|
case rabbit::OT_TABLE:
|
||||||
case rabbit::OT_USERDATA:
|
case rabbit::OT_USERDATA:
|
||||||
case rabbit::OT_INSTANCE:
|
case rabbit::OT_INSTANCE:
|
||||||
if(_delegable(o1)->_delegate) {
|
if(o1.toDelegable()->_delegate) {
|
||||||
rabbit::ObjectPtr closure;
|
rabbit::ObjectPtr closure;
|
||||||
if(_delegable(o1)->getMetaMethod(this, MT_CMP, closure)) {
|
if(o1.toDelegable()->getMetaMethod(this, MT_CMP, closure)) {
|
||||||
push(o1);push(o2);
|
push(o1);push(o2);
|
||||||
if(callMetaMethod(closure,MT_CMP,2,res)) {
|
if(callMetaMethod(closure,MT_CMP,2,res)) {
|
||||||
if(sq_type(res) != rabbit::OT_INTEGER) {
|
if(sq_type(res) != rabbit::OT_INTEGER) {
|
||||||
@ -318,9 +318,9 @@ bool rabbit::VirtualMachine::toString(const rabbit::ObjectPtr &o,rabbit::ObjectP
|
|||||||
case rabbit::OT_TABLE:
|
case rabbit::OT_TABLE:
|
||||||
case rabbit::OT_USERDATA:
|
case rabbit::OT_USERDATA:
|
||||||
case rabbit::OT_INSTANCE:
|
case rabbit::OT_INSTANCE:
|
||||||
if(_delegable(o)->_delegate) {
|
if(o.toDelegable()->_delegate) {
|
||||||
rabbit::ObjectPtr closure;
|
rabbit::ObjectPtr closure;
|
||||||
if(_delegable(o)->getMetaMethod(this, MT_TOSTRING, closure)) {
|
if(o.toDelegable()->getMetaMethod(this, MT_TOSTRING, closure)) {
|
||||||
push(o);
|
push(o);
|
||||||
if(callMetaMethod(closure,MT_TOSTRING,1,res)) {
|
if(callMetaMethod(closure,MT_TOSTRING,1,res)) {
|
||||||
if(sq_type(res) == rabbit::OT_STRING)
|
if(sq_type(res) == rabbit::OT_STRING)
|
||||||
@ -354,9 +354,9 @@ bool rabbit::VirtualMachine::stringCat(const rabbit::ObjectPtr &str,const rabbit
|
|||||||
|
|
||||||
bool rabbit::VirtualMachine::typeOf(const rabbit::ObjectPtr &obj1,rabbit::ObjectPtr &dest)
|
bool rabbit::VirtualMachine::typeOf(const rabbit::ObjectPtr &obj1,rabbit::ObjectPtr &dest)
|
||||||
{
|
{
|
||||||
if(is_delegable(obj1) && _delegable(obj1)->_delegate) {
|
if(is_delegable(obj1) && obj1.toDelegable()->_delegate) {
|
||||||
rabbit::ObjectPtr closure;
|
rabbit::ObjectPtr closure;
|
||||||
if(_delegable(obj1)->getMetaMethod(this, MT_TYPEOF, closure)) {
|
if(obj1.toDelegable()->getMetaMethod(this, MT_TYPEOF, closure)) {
|
||||||
push(obj1);
|
push(obj1);
|
||||||
return callMetaMethod(closure,MT_TYPEOF,1,dest);
|
return callMetaMethod(closure,MT_TYPEOF,1,dest);
|
||||||
}
|
}
|
||||||
@ -553,10 +553,10 @@ bool rabbit::VirtualMachine::FOREACH_OP(rabbit::ObjectPtr &o1,rabbit::ObjectPtr
|
|||||||
o4 = (int64_t)nrefidx; _FINISH(1);
|
o4 = (int64_t)nrefidx; _FINISH(1);
|
||||||
case rabbit::OT_USERDATA:
|
case rabbit::OT_USERDATA:
|
||||||
case rabbit::OT_INSTANCE:
|
case rabbit::OT_INSTANCE:
|
||||||
if(_delegable(o1)->_delegate) {
|
if(o1.toDelegable()->_delegate) {
|
||||||
rabbit::ObjectPtr itr;
|
rabbit::ObjectPtr itr;
|
||||||
rabbit::ObjectPtr closure;
|
rabbit::ObjectPtr closure;
|
||||||
if(_delegable(o1)->getMetaMethod(this, MT_NEXTI, closure)) {
|
if(o1.toDelegable()->getMetaMethod(this, MT_NEXTI, closure)) {
|
||||||
push(o1);
|
push(o1);
|
||||||
push(o4);
|
push(o4);
|
||||||
if(callMetaMethod(closure, MT_NEXTI, 2, itr)) {
|
if(callMetaMethod(closure, MT_NEXTI, 2, itr)) {
|
||||||
@ -797,7 +797,7 @@ exception_restore:
|
|||||||
case rabbit::OT_USERDATA:
|
case rabbit::OT_USERDATA:
|
||||||
case rabbit::OT_INSTANCE:{
|
case rabbit::OT_INSTANCE:{
|
||||||
rabbit::ObjectPtr closure;
|
rabbit::ObjectPtr closure;
|
||||||
if(_delegable(clo)->_delegate && _delegable(clo)->getMetaMethod(this,MT_CALL,closure)) {
|
if(clo.toDelegable()->_delegate && clo.toDelegable()->getMetaMethod(this,MT_CALL,closure)) {
|
||||||
push(clo);
|
push(clo);
|
||||||
for (int64_t i = 0; i < arg3; i++) push(STK(arg2 + i));
|
for (int64_t i = 0; i < arg3; i++) push(STK(arg2 + i));
|
||||||
if(!callMetaMethod(closure, MT_CALL, arg3+1, clo)) SQ_THROW();
|
if(!callMetaMethod(closure, MT_CALL, arg3+1, clo)) SQ_THROW();
|
||||||
@ -1338,8 +1338,8 @@ int64_t rabbit::VirtualMachine::fallBackGet(const rabbit::ObjectPtr &self,const
|
|||||||
case rabbit::OT_TABLE:
|
case rabbit::OT_TABLE:
|
||||||
case rabbit::OT_USERDATA:
|
case rabbit::OT_USERDATA:
|
||||||
//delegation
|
//delegation
|
||||||
if(_delegable(self)->_delegate) {
|
if(self.toDelegable()->_delegate) {
|
||||||
if(get(rabbit::ObjectPtr(_delegable(self)->_delegate),key,dest,0,DONT_FALL_BACK)) return FALLBACK_OK;
|
if(get(rabbit::ObjectPtr(self.toDelegable()->_delegate),key,dest,0,DONT_FALL_BACK)) return FALLBACK_OK;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return FALLBACK_NO_MATCH;
|
return FALLBACK_NO_MATCH;
|
||||||
@ -1347,7 +1347,7 @@ int64_t rabbit::VirtualMachine::fallBackGet(const rabbit::ObjectPtr &self,const
|
|||||||
//go through
|
//go through
|
||||||
case rabbit::OT_INSTANCE: {
|
case rabbit::OT_INSTANCE: {
|
||||||
rabbit::ObjectPtr closure;
|
rabbit::ObjectPtr closure;
|
||||||
if(_delegable(self)->getMetaMethod(this, MT_GET, closure)) {
|
if(self.toDelegable()->getMetaMethod(this, MT_GET, closure)) {
|
||||||
push(self);push(key);
|
push(self);push(key);
|
||||||
_nmetamethodscall++;
|
_nmetamethodscall++;
|
||||||
AutoDec ad(&_nmetamethodscall);
|
AutoDec ad(&_nmetamethodscall);
|
||||||
@ -1417,7 +1417,7 @@ int64_t rabbit::VirtualMachine::fallBackSet(const rabbit::ObjectPtr &self,const
|
|||||||
case rabbit::OT_USERDATA:{
|
case rabbit::OT_USERDATA:{
|
||||||
rabbit::ObjectPtr closure;
|
rabbit::ObjectPtr closure;
|
||||||
rabbit::ObjectPtr t;
|
rabbit::ObjectPtr t;
|
||||||
if(_delegable(self)->getMetaMethod(this, MT_SET, closure)) {
|
if(self.toDelegable()->getMetaMethod(this, MT_SET, closure)) {
|
||||||
push(self);push(key);push(val);
|
push(self);push(key);push(val);
|
||||||
_nmetamethodscall++;
|
_nmetamethodscall++;
|
||||||
AutoDec ad(&_nmetamethodscall);
|
AutoDec ad(&_nmetamethodscall);
|
||||||
@ -1452,7 +1452,7 @@ bool rabbit::VirtualMachine::clone(const rabbit::ObjectPtr &self,rabbit::ObjectP
|
|||||||
newobj = const_cast<rabbit::Instance*>(self.toInstance())->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(newobj.toDelegable()->_delegate && newobj.toDelegable()->getMetaMethod(this,MT_CLONED,closure)) {
|
||||||
push(newobj);
|
push(newobj);
|
||||||
push(self);
|
push(self);
|
||||||
if(!callMetaMethod(closure,MT_CLONED,2,temp_reg))
|
if(!callMetaMethod(closure,MT_CLONED,2,temp_reg))
|
||||||
@ -1505,7 +1505,7 @@ bool rabbit::VirtualMachine::newSlot(const rabbit::ObjectPtr &self,const rabbit:
|
|||||||
rabbit::ObjectPtr res;
|
rabbit::ObjectPtr res;
|
||||||
if(!self.toTable()->get(key,res)) {
|
if(!self.toTable()->get(key,res)) {
|
||||||
rabbit::ObjectPtr closure;
|
rabbit::ObjectPtr closure;
|
||||||
if(_delegable(self)->_delegate && _delegable(self)->getMetaMethod(this,MT_NEWSLOT,closure)) {
|
if(self.toDelegable()->_delegate && self.toDelegable()->getMetaMethod(this,MT_NEWSLOT,closure)) {
|
||||||
push(self);push(key);push(val);
|
push(self);push(key);push(val);
|
||||||
if(!callMetaMethod(closure,MT_NEWSLOT,3,res)) {
|
if(!callMetaMethod(closure,MT_NEWSLOT,3,res)) {
|
||||||
return false;
|
return false;
|
||||||
@ -1525,7 +1525,7 @@ bool rabbit::VirtualMachine::newSlot(const rabbit::ObjectPtr &self,const rabbit:
|
|||||||
case rabbit::OT_INSTANCE: {
|
case rabbit::OT_INSTANCE: {
|
||||||
rabbit::ObjectPtr res;
|
rabbit::ObjectPtr res;
|
||||||
rabbit::ObjectPtr closure;
|
rabbit::ObjectPtr closure;
|
||||||
if(_delegable(self)->_delegate && _delegable(self)->getMetaMethod(this,MT_NEWSLOT,closure)) {
|
if(self.toDelegable()->_delegate && self.toDelegable()->getMetaMethod(this,MT_NEWSLOT,closure)) {
|
||||||
push(self);push(key);push(val);
|
push(self);push(key);push(val);
|
||||||
if(!callMetaMethod(closure,MT_NEWSLOT,3,res)) {
|
if(!callMetaMethod(closure,MT_NEWSLOT,3,res)) {
|
||||||
return false;
|
return false;
|
||||||
@ -1567,7 +1567,7 @@ bool rabbit::VirtualMachine::deleteSlot(const rabbit::ObjectPtr &self,const rabb
|
|||||||
rabbit::ObjectPtr t;
|
rabbit::ObjectPtr t;
|
||||||
//bool handled = false;
|
//bool handled = false;
|
||||||
rabbit::ObjectPtr closure;
|
rabbit::ObjectPtr closure;
|
||||||
if(_delegable(self)->_delegate && _delegable(self)->getMetaMethod(this,MT_DELSLOT,closure)) {
|
if(self.toDelegable()->_delegate && self.toDelegable()->getMetaMethod(this,MT_DELSLOT,closure)) {
|
||||||
push(self);push(key);
|
push(self);push(key);
|
||||||
return callMetaMethod(closure,MT_DELSLOT,2,res);
|
return callMetaMethod(closure,MT_DELSLOT,2,res);
|
||||||
}
|
}
|
||||||
|
@ -1042,11 +1042,11 @@ rabbit::Result rabbit::sq_getdelegate(rabbit::VirtualMachine* v,int64_t idx)
|
|||||||
switch(sq_type(self)){
|
switch(sq_type(self)){
|
||||||
case rabbit::OT_TABLE:
|
case rabbit::OT_TABLE:
|
||||||
case rabbit::OT_USERDATA:
|
case rabbit::OT_USERDATA:
|
||||||
if(!_delegable(self)->_delegate){
|
if(!self.toDelegable()->_delegate){
|
||||||
v->pushNull();
|
v->pushNull();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
v->push(rabbit::ObjectPtr(_delegable(self)->_delegate));
|
v->push(rabbit::ObjectPtr(self.toDelegable()->_delegate));
|
||||||
break;
|
break;
|
||||||
default: return sq_throwerror(v,"wrong type"); break;
|
default: return sq_throwerror(v,"wrong type"); break;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user