1 /* see copyright notice in squirrel.h */
\r
7 struct SQClassMemeber {
\r
9 SQClassMemeber(const SQClassMemeber &o) {
\r
17 typedef sqvector<SQClassMemeber> SQClassMemeberVec;
\r
19 #define MEMBER_TYPE_METHOD 0x01000000
\r
20 #define MEMBER_TYPE_FIELD 0x02000000
\r
22 #define _ismethod(o) (_integer(o)&MEMBER_TYPE_METHOD)
\r
23 #define _isfield(o) (_integer(o)&MEMBER_TYPE_FIELD)
\r
24 #define _make_method_idx(i) ((SQInteger)(MEMBER_TYPE_METHOD|i))
\r
25 #define _make_field_idx(i) ((SQInteger)(MEMBER_TYPE_FIELD|i))
\r
26 #define _member_type(o) (_integer(o)&0xFF000000)
\r
27 #define _member_idx(o) (_integer(o)&0x00FFFFFF)
\r
29 struct SQClass : public CHAINABLE_OBJ
\r
31 SQClass(SQSharedState *ss,SQClass *base);
\r
33 static SQClass* Create(SQSharedState *ss,SQClass *base) {
\r
34 SQClass *newclass = (SQClass *)SQ_MALLOC(sizeof(SQClass));
\r
35 new (newclass) SQClass(ss, base);
\r
39 bool NewSlot(const SQObjectPtr &key,const SQObjectPtr &val);
\r
40 bool Get(const SQObjectPtr &key,SQObjectPtr &val) {
\r
41 if(_members->Get(key,val)) {
\r
43 SQObjectPtr &o = _defaultvalues[_member_idx(val)].val;
\r
47 val = _methods[_member_idx(val)].val;
\r
53 bool SetAttributes(const SQObjectPtr &key,const SQObjectPtr &val);
\r
54 bool GetAttributes(const SQObjectPtr &key,SQObjectPtr &outval);
\r
55 void Lock() { _locked = true; if(_base) _base->Lock(); }
\r
56 void Release() { sq_delete(this, SQClass); }
\r
58 void Mark(SQCollectable ** );
\r
59 SQInteger Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval);
\r
60 SQInstance *CreateInstance();
\r
62 //SQTable *_properties;
\r
64 SQClassMemeberVec _defaultvalues;
\r
65 SQClassMemeberVec _methods;
\r
66 SQObjectPtrVec _metamethods;
\r
67 SQObjectPtr _attributes;
\r
68 SQUserPointer _typetag;
\r
72 #define calcinstancesize(_theclass_) \
\r
73 (sizeof(SQInstance)+(sizeof(SQObjectPtr)*(_theclass_->_defaultvalues.size()>0?_theclass_->_defaultvalues.size()-1:0)))
\r
74 struct SQInstance : public SQDelegable
\r
76 void Init(SQSharedState *ss);
\r
77 SQInstance(SQSharedState *ss, SQClass *c, SQInteger memsize);
\r
78 SQInstance(SQSharedState *ss, SQInstance *c, SQInteger memsize);
\r
80 static SQInstance* Create(SQSharedState *ss,SQClass *theclass) {
\r
82 SQInteger size = calcinstancesize(theclass);
\r
83 SQInstance *newinst = (SQInstance *)SQ_MALLOC(size);
\r
84 new (newinst) SQInstance(ss, theclass,size);
\r
87 SQInstance *Clone(SQSharedState *ss)
\r
89 SQInteger size = calcinstancesize(_class);
\r
90 SQInstance *newinst = (SQInstance *)SQ_MALLOC(size);
\r
91 new (newinst) SQInstance(ss, this,size);
\r
95 bool Get(const SQObjectPtr &key,SQObjectPtr &val) {
\r
96 if(_class->_members->Get(key,val)) {
\r
98 SQObjectPtr &o = _values[_member_idx(val)];
\r
102 val = _class->_methods[_member_idx(val)].val;
\r
108 bool Set(const SQObjectPtr &key,const SQObjectPtr &val) {
\r
110 if(_class->_members->Get(key,idx) && _isfield(idx)) {
\r
111 _values[_member_idx(idx)] = val;
\r
117 if (_hook) { _hook(_userpointer,0);}
\r
118 SQInteger size = _memsize;
\r
119 this->~SQInstance();
\r
120 SQ_FREE(this, size);
\r
123 void Mark(SQCollectable ** );
\r
124 bool InstanceOf(SQClass *trg);
\r
125 bool GetMetaMethod(SQMetaMethod mm,SQObjectPtr &res);
\r
128 SQUserPointer _userpointer;
\r
129 SQRELEASEHOOK _hook;
\r
130 SQUnsignedInteger _nvalues;
\r
131 SQInteger _memsize;
\r
132 SQObjectPtr _values[1];
\r
135 #endif //_SQCLASS_H_
\r