1 /* see copyright notice in squirrel.h */
\r
7 struct SQClassMember {
\r
12 typedef sqvector<SQClassMember> SQClassMemberVec;
\r
14 #define MEMBER_TYPE_METHOD 0x01000000
\r
15 #define MEMBER_TYPE_FIELD 0x02000000
\r
17 #define _ismethod(o) (_integer(o)&MEMBER_TYPE_METHOD)
\r
18 #define _isfield(o) (_integer(o)&MEMBER_TYPE_FIELD)
\r
19 #define _make_method_idx(i) ((SQInteger)(MEMBER_TYPE_METHOD|i))
\r
20 #define _make_field_idx(i) ((SQInteger)(MEMBER_TYPE_FIELD|i))
\r
21 #define _member_type(o) (_integer(o)&0xFF000000)
\r
22 #define _member_idx(o) (_integer(o)&0x00FFFFFF)
\r
24 struct SQClass : public CHAINABLE_OBJ
\r
26 SQClass(SQSharedState *ss,SQClass *base);
\r
28 static SQClass* Create(SQSharedState *ss,SQClass *base) {
\r
29 SQClass *newclass = (SQClass *)SQ_MALLOC(sizeof(SQClass));
\r
30 new (newclass) SQClass(ss, base);
\r
34 bool NewSlot(SQSharedState *ss, const SQObjectPtr &key,const SQObjectPtr &val,bool bstatic);
\r
35 bool Get(const SQObjectPtr &key,SQObjectPtr &val) {
\r
36 if(_members->Get(key,val)) {
\r
38 SQObjectPtr &o = _defaultvalues[_member_idx(val)].val;
\r
42 val = _methods[_member_idx(val)].val;
\r
48 bool GetConstructor(SQObjectPtr &ctor)
\r
50 if(_constructoridx != -1) {
\r
51 ctor = _methods[_constructoridx].val;
\r
56 bool SetAttributes(const SQObjectPtr &key,const SQObjectPtr &val);
\r
57 bool GetAttributes(const SQObjectPtr &key,SQObjectPtr &outval);
\r
58 void Lock() { _locked = true; if(_base) _base->Lock(); }
\r
60 if (_hook) { _hook(_typetag,0);}
\r
61 sq_delete(this, SQClass);
\r
64 #ifndef NO_GARBAGE_COLLECTOR
\r
65 void Mark(SQCollectable ** );
\r
66 SQObjectType GetType() {return OT_CLASS;}
\r
68 SQInteger Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval);
\r
69 SQInstance *CreateInstance();
\r
72 SQClassMemberVec _defaultvalues;
\r
73 SQClassMemberVec _methods;
\r
74 SQObjectPtr _metamethods[MT_LAST];
\r
75 SQObjectPtr _attributes;
\r
76 SQUserPointer _typetag;
\r
77 SQRELEASEHOOK _hook;
\r
79 SQInteger _constructoridx;
\r
83 #define calcinstancesize(_theclass_) \
\r
84 (_theclass_->_udsize + sq_aligning(sizeof(SQInstance) + (sizeof(SQObjectPtr)*(_theclass_->_defaultvalues.size()>0?_theclass_->_defaultvalues.size()-1:0))))
\r
86 struct SQInstance : public SQDelegable
\r
88 void Init(SQSharedState *ss);
\r
89 SQInstance(SQSharedState *ss, SQClass *c, SQInteger memsize);
\r
90 SQInstance(SQSharedState *ss, SQInstance *c, SQInteger memsize);
\r
92 static SQInstance* Create(SQSharedState *ss,SQClass *theclass) {
\r
94 SQInteger size = calcinstancesize(theclass);
\r
95 SQInstance *newinst = (SQInstance *)SQ_MALLOC(size);
\r
96 new (newinst) SQInstance(ss, theclass,size);
\r
97 if(theclass->_udsize) {
\r
98 newinst->_userpointer = ((unsigned char *)newinst) + (size - theclass->_udsize);
\r
102 SQInstance *Clone(SQSharedState *ss)
\r
104 SQInteger size = calcinstancesize(_class);
\r
105 SQInstance *newinst = (SQInstance *)SQ_MALLOC(size);
\r
106 new (newinst) SQInstance(ss, this,size);
\r
107 if(_class->_udsize) {
\r
108 newinst->_userpointer = ((unsigned char *)newinst) + (size - _class->_udsize);
\r
113 bool Get(const SQObjectPtr &key,SQObjectPtr &val) {
\r
114 if(_class->_members->Get(key,val)) {
\r
115 if(_isfield(val)) {
\r
116 SQObjectPtr &o = _values[_member_idx(val)];
\r
120 val = _class->_methods[_member_idx(val)].val;
\r
126 bool Set(const SQObjectPtr &key,const SQObjectPtr &val) {
\r
128 if(_class->_members->Get(key,idx) && _isfield(idx)) {
\r
129 _values[_member_idx(idx)] = val;
\r
136 if (_hook) { _hook(_userpointer,0);}
\r
138 if(_uiRef > 0) return;
\r
139 SQInteger size = _memsize;
\r
140 this->~SQInstance();
\r
141 SQ_FREE(this, size);
\r
144 #ifndef NO_GARBAGE_COLLECTOR
\r
145 void Mark(SQCollectable ** );
\r
146 SQObjectType GetType() {return OT_INSTANCE;}
\r
148 bool InstanceOf(SQClass *trg);
\r
149 bool GetMetaMethod(SQVM *v,SQMetaMethod mm,SQObjectPtr &res);
\r
152 SQUserPointer _userpointer;
\r
153 SQRELEASEHOOK _hook;
\r
154 SQInteger _memsize;
\r
155 SQObjectPtr _values[1];
\r
158 #endif //_SQCLASS_H_
\r