[DEV] remote _class()

This commit is contained in:
Edouard DUPIN 2018-07-03 22:17:47 +02:00
parent 25e0b49c20
commit 36a162e89d
3 changed files with 35 additions and 36 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 _class(obj) ((obj)._unVal.pClass)
#define _instance(obj) ((obj)._unVal.pInstance) #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)

View File

@ -549,7 +549,7 @@ bool rabbit::VirtualMachine::FOREACH_OP(rabbit::ObjectPtr &o1,rabbit::ObjectPtr
if((nrefidx = o1.toString()->next(o4, o2, o3)) == -1)_FINISH(exitpos); if((nrefidx = o1.toString()->next(o4, o2, o3)) == -1)_FINISH(exitpos);
o4 = (int64_t)nrefidx; _FINISH(1); o4 = (int64_t)nrefidx; _FINISH(1);
case rabbit::OT_CLASS: case rabbit::OT_CLASS:
if((nrefidx = _class(o1)->next(o4, o2, o3)) == -1)_FINISH(exitpos); if((nrefidx = o1.toClass()->next(o4, o2, o3)) == -1)_FINISH(exitpos);
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:
@ -636,23 +636,23 @@ bool rabbit::VirtualMachine::CLASS_OP(rabbit::ObjectPtr &target,int64_t baseclas
rabbit::ObjectPtr attrs; rabbit::ObjectPtr attrs;
if(baseclass != -1) { if(baseclass != -1) {
if(sq_type(_stack[_stackbase+baseclass]) != rabbit::OT_CLASS) { raise_error("trying to inherit from a %s",getTypeName(_stack[_stackbase+baseclass])); return false; } if(sq_type(_stack[_stackbase+baseclass]) != rabbit::OT_CLASS) { raise_error("trying to inherit from a %s",getTypeName(_stack[_stackbase+baseclass])); return false; }
base = _class(_stack[_stackbase + baseclass]); base = _stack[_stackbase + baseclass].toClass();
} }
if(attributes != MAX_FUNC_STACKSIZE) { if(attributes != MAX_FUNC_STACKSIZE) {
attrs = _stack[_stackbase+attributes]; attrs = _stack[_stackbase+attributes];
} }
target = rabbit::Class::create(_get_shared_state(this),base); target = rabbit::Class::create(_get_shared_state(this),base);
if(sq_type(_class(target)->_metamethods[MT_INHERITED]) != rabbit::OT_NULL) { if(sq_type(target.toClass()->_metamethods[MT_INHERITED]) != rabbit::OT_NULL) {
int nparams = 2; int nparams = 2;
rabbit::ObjectPtr ret; rabbit::ObjectPtr ret;
push(target); push(attrs); push(target); push(attrs);
if(!call(_class(target)->_metamethods[MT_INHERITED],nparams,_top - nparams, ret, false)) { if(!call(target.toClass()->_metamethods[MT_INHERITED],nparams,_top - nparams, ret, false)) {
pop(nparams); pop(nparams);
return false; return false;
} }
pop(nparams); pop(nparams);
} }
_class(target)->_attributes = attrs; target.toClass()->_attributes = attrs;
return true; return true;
} }
@ -772,7 +772,7 @@ exception_restore:
continue; continue;
case rabbit::OT_CLASS:{ case rabbit::OT_CLASS:{
rabbit::ObjectPtr inst; rabbit::ObjectPtr inst;
_GUARD(createClassInstance(_class(clo),inst,clo)); _GUARD(createClassInstance(clo.toClass(),inst,clo));
if(sarg0 != -1) { if(sarg0 != -1) {
STK(arg0) = inst; STK(arg0) = inst;
} }
@ -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(_class(STK(arg1)))?true:false) : false; TARGET = (sq_type(STK(arg2)) == rabbit::OT_INSTANCE) ? (_instance(STK(arg2))->instanceOf(STK(arg1).toClass())?true:false) : false;
continue; continue;
case _OP_AND: case _OP_AND:
if(IsFalse(STK(arg2))) { if(IsFalse(STK(arg2))) {
@ -1265,7 +1265,7 @@ bool rabbit::VirtualMachine::get(const rabbit::ObjectPtr &self, const rabbit::Ob
} }
break; break;
case rabbit::OT_CLASS: case rabbit::OT_CLASS:
if(_class(self)->get(key,dest)) { if(const_cast<rabbit::Class*>(self.toClass())->get(key,dest)) {
return true; return true;
} }
break; break;
@ -1476,7 +1476,7 @@ bool rabbit::VirtualMachine::newSlotA(const rabbit::ObjectPtr &self,const rabbit
raise_error("object must be a class"); raise_error("object must be a class");
return false; return false;
} }
rabbit::Class *c = _class(self); rabbit::Class *c = const_cast<rabbit::Class*>(self.toClass());
if(!raw) { if(!raw) {
rabbit::ObjectPtr &mm = c->_metamethods[MT_NEWMEMBER]; rabbit::ObjectPtr &mm = c->_metamethods[MT_NEWMEMBER];
if(sq_type(mm) != rabbit::OT_NULL ) { if(sq_type(mm) != rabbit::OT_NULL ) {
@ -1536,8 +1536,8 @@ bool rabbit::VirtualMachine::newSlot(const rabbit::ObjectPtr &self,const rabbit:
return false; return false;
break;} break;}
case rabbit::OT_CLASS: case rabbit::OT_CLASS:
if(!_class(self)->newSlot(_get_shared_state(this),key,val,bstatic)) { if(!const_cast<rabbit::Class*>(self.toClass())->newSlot(_get_shared_state(this),key,val,bstatic)) {
if(_class(self)->_locked) { if(self.toClass()->_locked) {
raise_error("trying to modify a class that has already been instantiated"); raise_error("trying to modify a class that has already been instantiated");
return false; return false;
} }
@ -1614,7 +1614,7 @@ int64_t prevstackbase = _stackbase;
case rabbit::OT_CLASS: { case rabbit::OT_CLASS: {
rabbit::ObjectPtr constr; rabbit::ObjectPtr constr;
rabbit::ObjectPtr temp; rabbit::ObjectPtr temp;
createClassInstance(_class(closure),outres,constr); createClassInstance(closure.toClass(),outres,constr);
rabbit::ObjectType ctype = sq_type(constr); rabbit::ObjectType ctype = sq_type(constr);
if (ctype == rabbit::OT_NATIVECLOSURE || ctype == OT_CLOSURE) { if (ctype == rabbit::OT_NATIVECLOSURE || ctype == OT_CLOSURE) {
_stack[stackbase] = outres; _stack[stackbase] = outres;
@ -1797,7 +1797,7 @@ void rabbit::VirtualMachine::dumpstack(int64_t stackbase,bool dumpall)
case rabbit::OT_GENERATOR: printf("GENERATOR %p",obj.toGenerator());break; case rabbit::OT_GENERATOR: printf("GENERATOR %p",obj.toGenerator());break;
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",_class(obj));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",_instance(obj));break;
case rabbit::OT_WEAKREF: printf("WEAKERF %p",_weakref(obj));break; case rabbit::OT_WEAKREF: printf("WEAKERF %p",_weakref(obj));break;
default: default:

View File

@ -300,7 +300,7 @@ rabbit::Result rabbit::sq_newclass(rabbit::VirtualMachine* v,rabbit::Bool hasbas
rabbit::ObjectPtr &base = stack_get(v,-1); rabbit::ObjectPtr &base = stack_get(v,-1);
if(sq_type(base) != rabbit::OT_CLASS) if(sq_type(base) != rabbit::OT_CLASS)
return sq_throwerror(v,"invalid base type"); return sq_throwerror(v,"invalid base type");
baseclass = _class(base); baseclass = base.toClass();
} }
rabbit::Class *newclass = rabbit::Class::create(_get_shared_state(v), baseclass); rabbit::Class *newclass = rabbit::Class::create(_get_shared_state(v), baseclass);
if(baseclass) v->pop(); if(baseclass) v->pop();
@ -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(_class(cl))?SQTrue:SQFalse; return _instance(inst)->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)
@ -742,7 +742,7 @@ int64_t rabbit::sq_getsize(rabbit::VirtualMachine* v, int64_t idx)
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 _instance(o)->_class->_udsize;
case rabbit::OT_CLASS: return _class(o)->_udsize; case rabbit::OT_CLASS: return o.toClass()->_udsize;
default: default:
return sq_aux_invalidtype(v, type); return sq_aux_invalidtype(v, type);
} }
@ -773,7 +773,7 @@ rabbit::Result rabbit::sq_settypetag(rabbit::VirtualMachine* v,int64_t idx,rabbi
o.toUserData()->setTypeTag(typetag); o.toUserData()->setTypeTag(typetag);
break; break;
case rabbit::OT_CLASS: case rabbit::OT_CLASS:
_class(o)->_typetag = typetag; o.toClass()->_typetag = typetag;
break; break;
default: default:
return sq_throwerror(v,"invalid object type"); return sq_throwerror(v,"invalid object type");
@ -786,7 +786,7 @@ rabbit::Result rabbit::sq_getobjtypetag(const rabbit::Object *o,rabbit::UserPoin
switch(sq_type(*o)) { switch(sq_type(*o)) {
case rabbit::OT_INSTANCE: *typetag = _instance(*o)->_class->_typetag; break; case rabbit::OT_INSTANCE: *typetag = _instance(*o)->_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 = _class(*o)->_typetag; break; case rabbit::OT_CLASS: *typetag = o->toClass()->_typetag; break;
default: return SQ_ERROR; default: return SQ_ERROR;
} }
return SQ_OK; return SQ_OK;
@ -820,8 +820,8 @@ rabbit::Result rabbit::sq_setclassudsize(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_CLASS) return sq_throwerror(v,"the object is not a class"); if(sq_type(o) != rabbit::OT_CLASS) return sq_throwerror(v,"the object is not a class");
if(_class(o)->_locked) return sq_throwerror(v,"the class is locked"); if(o.toClass()->_locked) return sq_throwerror(v,"the class is locked");
_class(o)->_udsize = udsize; o.toClass()->_udsize = udsize;
return SQ_OK; return SQ_OK;
} }
@ -937,7 +937,7 @@ rabbit::Result rabbit::sq_rawset(rabbit::VirtualMachine* v,int64_t idx)
return SQ_OK; return SQ_OK;
break; break;
case rabbit::OT_CLASS: case rabbit::OT_CLASS:
_class(self)->newSlot(_get_shared_state(v), key, v->getUp(-1),false); self.toClass()->newSlot(_get_shared_state(v), key, v->getUp(-1),false);
v->pop(2); v->pop(2);
return SQ_OK; return SQ_OK;
break; break;
@ -1074,7 +1074,7 @@ rabbit::Result rabbit::sq_rawget(rabbit::VirtualMachine* v,int64_t idx)
return SQ_OK; return SQ_OK;
break; break;
case rabbit::OT_CLASS: case rabbit::OT_CLASS:
if(_class(self)->get(obj,obj)) if(self.toClass()->get(obj,obj))
return SQ_OK; return SQ_OK;
break; break;
case rabbit::OT_INSTANCE: case rabbit::OT_INSTANCE:
@ -1270,7 +1270,7 @@ void rabbit::sq_setreleasehook(rabbit::VirtualMachine* v,int64_t idx,SQRELEASEHO
_instance(ud)->_hook = hook; _instance(ud)->_hook = hook;
break; break;
case rabbit::OT_CLASS: case rabbit::OT_CLASS:
_class(ud)->_hook = hook; ud.toClass()->_hook = hook;
break; break;
default: default:
return; return;
@ -1288,7 +1288,7 @@ SQRELEASEHOOK rabbit::sq_getreleasehook(rabbit::VirtualMachine* v,int64_t idx)
return _instance(ud)->_hook; return _instance(ud)->_hook;
break; break;
case rabbit::OT_CLASS: case rabbit::OT_CLASS:
return _class(ud)->_hook; return ud.toClass()->_hook;
break; break;
default: default:
return NULL; return NULL;
@ -1418,13 +1418,13 @@ rabbit::Result rabbit::sq_setattributes(rabbit::VirtualMachine* v,int64_t idx)
rabbit::ObjectPtr &val = stack_get(v,-1); rabbit::ObjectPtr &val = stack_get(v,-1);
rabbit::ObjectPtr attrs; rabbit::ObjectPtr attrs;
if(sq_type(key) == rabbit::OT_NULL) { if(sq_type(key) == rabbit::OT_NULL) {
attrs = _class(*o)->_attributes; attrs = o->toClass()->_attributes;
_class(*o)->_attributes = val; o->toClass()->_attributes = val;
v->pop(2); v->pop(2);
v->push(attrs); v->push(attrs);
return SQ_OK; return SQ_OK;
}else if(_class(*o)->getAttributes(key,attrs)) { }else if(o->toClass()->getAttributes(key,attrs)) {
_class(*o)->setAttributes(key,val); o->toClass()->setAttributes(key,val);
v->pop(2); v->pop(2);
v->push(attrs); v->push(attrs);
return SQ_OK; return SQ_OK;
@ -1439,12 +1439,12 @@ rabbit::Result rabbit::sq_getattributes(rabbit::VirtualMachine* v,int64_t idx)
rabbit::ObjectPtr &key = stack_get(v,-1); rabbit::ObjectPtr &key = stack_get(v,-1);
rabbit::ObjectPtr attrs; rabbit::ObjectPtr attrs;
if(sq_type(key) == rabbit::OT_NULL) { if(sq_type(key) == rabbit::OT_NULL) {
attrs = _class(*o)->_attributes; attrs = o->toClass()->_attributes;
v->pop(); v->pop();
v->push(attrs); v->push(attrs);
return SQ_OK; return SQ_OK;
} }
else if(_class(*o)->getAttributes(key,attrs)) { else if(o->toClass()->getAttributes(key,attrs)) {
v->pop(); v->pop();
v->push(attrs); v->push(attrs);
return SQ_OK; return SQ_OK;
@ -1457,7 +1457,7 @@ rabbit::Result rabbit::sq_getmemberhandle(rabbit::VirtualMachine* v,int64_t idx,
rabbit::ObjectPtr *o = NULL; rabbit::ObjectPtr *o = NULL;
_GETSAFE_OBJ(v, idx, rabbit::OT_CLASS,o); _GETSAFE_OBJ(v, idx, rabbit::OT_CLASS,o);
rabbit::ObjectPtr &key = stack_get(v,-1); rabbit::ObjectPtr &key = stack_get(v,-1);
rabbit::Table *m = _class(*o)->_members; rabbit::Table *m = o->toClass()->_members;
rabbit::ObjectPtr val; rabbit::ObjectPtr val;
if(m->get(key,val)) { if(m->get(key,val)) {
handle->_static = _isfield(val) ? SQFalse : SQTrue; handle->_static = _isfield(val) ? SQFalse : SQTrue;
@ -1484,7 +1484,7 @@ rabbit::Result _getmemberbyhandle(rabbit::VirtualMachine* v,rabbit::ObjectPtr &s
} }
break; break;
case rabbit::OT_CLASS: { case rabbit::OT_CLASS: {
rabbit::Class *c = _class(self); rabbit::Class *c = self.toClass();
if(handle->_static) { if(handle->_static) {
val = &c->_methods[handle->_index].val; val = &c->_methods[handle->_index].val;
} }
@ -1527,8 +1527,8 @@ rabbit::Result rabbit::sq_getbase(rabbit::VirtualMachine* v,int64_t idx)
{ {
rabbit::ObjectPtr *o = NULL; rabbit::ObjectPtr *o = NULL;
_GETSAFE_OBJ(v, idx, rabbit::OT_CLASS,o); _GETSAFE_OBJ(v, idx, rabbit::OT_CLASS,o);
if(_class(*o)->_base) if(o->toClass()->_base)
v->push(rabbit::ObjectPtr(_class(*o)->_base)); v->push(rabbit::ObjectPtr(o->toClass()->_base));
else else
v->pushNull(); v->pushNull();
return SQ_OK; return SQ_OK;
@ -1546,7 +1546,7 @@ rabbit::Result rabbit::sq_createinstance(rabbit::VirtualMachine* v,int64_t idx)
{ {
rabbit::ObjectPtr *o = NULL; rabbit::ObjectPtr *o = NULL;
_GETSAFE_OBJ(v, idx, rabbit::OT_CLASS,o); _GETSAFE_OBJ(v, idx, rabbit::OT_CLASS,o);
v->push(_class(*o)->createInstance()); v->push(o->toClass()->createInstance());
return SQ_OK; return SQ_OK;
} }