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(SQSharedState *ss, const SQObjectPtr &key,const SQObjectPtr &val,bool bstatic);
\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
57 if (_hook) { _hook(_typetag,0);}
\r
58 sq_delete(this, SQClass);
\r
61 #ifndef NO_GARBAGE_COLLECTOR
\r
62 void Mark(SQCollectable ** );
\r
64 SQInteger Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval);
\r
65 SQInstance *CreateInstance();
\r
68 SQClassMemeberVec _defaultvalues;
\r
69 SQClassMemeberVec _methods;
\r
70 SQObjectPtrVec _metamethods;
\r
71 SQObjectPtr _attributes;
\r
72 SQUserPointer _typetag;
\r
73 SQRELEASEHOOK _hook;
\r
77 #define calcinstancesize(_theclass_) \
\r
78 (sizeof(SQInstance)+(sizeof(SQObjectPtr)*(_theclass_->_defaultvalues.size()>0?_theclass_->_defaultvalues.size()-1:0)))
\r
79 struct SQInstance : public SQDelegable
\r
81 void Init(SQSharedState *ss);
\r
82 SQInstance(SQSharedState *ss, SQClass *c, SQInteger memsize);
\r
83 SQInstance(SQSharedState *ss, SQInstance *c, SQInteger memsize);
\r
85 static SQInstance* Create(SQSharedState *ss,SQClass *theclass) {
\r
87 SQInteger size = calcinstancesize(theclass);
\r
88 SQInstance *newinst = (SQInstance *)SQ_MALLOC(size);
\r
89 new (newinst) SQInstance(ss, theclass,size);
\r
92 SQInstance *Clone(SQSharedState *ss)
\r
94 SQInteger size = calcinstancesize(_class);
\r
95 SQInstance *newinst = (SQInstance *)SQ_MALLOC(size);
\r
96 new (newinst) SQInstance(ss, this,size);
\r
100 bool Get(const SQObjectPtr &key,SQObjectPtr &val) {
\r
101 if(_class->_members->Get(key,val)) {
\r
102 if(_isfield(val)) {
\r
103 SQObjectPtr &o = _values[_member_idx(val)];
\r
107 val = _class->_methods[_member_idx(val)].val;
\r
113 bool Set(const SQObjectPtr &key,const SQObjectPtr &val) {
\r
115 if(_class->_members->Get(key,idx) && _isfield(idx)) {
\r
116 _values[_member_idx(idx)] = val;
\r
122 if (_hook) { _hook(_userpointer,0);}
\r
123 SQInteger size = _memsize;
\r
124 this->~SQInstance();
\r
125 SQ_FREE(this, size);
\r
128 #ifndef NO_GARBAGE_COLLECTOR
\r
129 void Mark(SQCollectable ** );
\r
131 bool InstanceOf(SQClass *trg);
\r
132 bool GetMetaMethod(SQVM *v,SQMetaMethod mm,SQObjectPtr &res);
\r
135 SQUserPointer _userpointer;
\r
136 SQRELEASEHOOK _hook;
\r
137 SQUnsignedInteger _nvalues;
\r
138 SQInteger _memsize;
\r
139 SQObjectPtr _values[1];
\r
142 #endif //_SQCLASS_H_
\r