1 /* see copyright notice in squirrel.h */
7 struct SQClassMemeber {
9 SQClassMemeber(const SQClassMemeber &o) {
17 typedef sqvector<SQClassMemeber> SQClassMemeberVec;
19 #define MEMBER_TYPE_METHOD 0x01000000
20 #define MEMBER_TYPE_FIELD 0x02000000
22 #define _ismethod(o) (_integer(o)&MEMBER_TYPE_METHOD)
23 #define _isfield(o) (_integer(o)&MEMBER_TYPE_FIELD)
24 #define _make_method_idx(i) ((SQInteger)(MEMBER_TYPE_METHOD|i))
25 #define _make_field_idx(i) ((SQInteger)(MEMBER_TYPE_FIELD|i))
26 #define _member_type(o) (_integer(o)&0xFF000000)
27 #define _member_idx(o) (_integer(o)&0x00FFFFFF)
29 struct SQClass : public CHAINABLE_OBJ
31 SQClass(SQSharedState *ss,SQClass *base);
33 static SQClass* Create(SQSharedState *ss,SQClass *base) {
34 SQClass *newclass = (SQClass *)SQ_MALLOC(sizeof(SQClass));
35 new (newclass) SQClass(ss, base);
39 bool NewSlot(SQSharedState *ss, const SQObjectPtr &key,const SQObjectPtr &val,bool bstatic);
40 bool Get(const SQObjectPtr &key,SQObjectPtr &val) {
41 if(_members->Get(key,val)) {
43 SQObjectPtr &o = _defaultvalues[_member_idx(val)].val;
47 val = _methods[_member_idx(val)].val;
53 bool SetAttributes(const SQObjectPtr &key,const SQObjectPtr &val);
54 bool GetAttributes(const SQObjectPtr &key,SQObjectPtr &outval);
55 void Lock() { _locked = true; if(_base) _base->Lock(); }
57 if (_hook) { _hook(_typetag,0);}
58 sq_delete(this, SQClass);
61 #ifndef NO_GARBAGE_COLLECTOR
62 void Mark(SQCollectable ** );
64 SQInteger Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval);
65 SQInstance *CreateInstance();
68 SQClassMemeberVec _defaultvalues;
69 SQClassMemeberVec _methods;
70 SQObjectPtrVec _metamethods;
71 SQObjectPtr _attributes;
72 SQUserPointer _typetag;
77 #define calcinstancesize(_theclass_) \
78 (sizeof(SQInstance)+(sizeof(SQObjectPtr)*(_theclass_->_defaultvalues.size()>0?_theclass_->_defaultvalues.size()-1:0)))
79 struct SQInstance : public SQDelegable
81 void Init(SQSharedState *ss);
82 SQInstance(SQSharedState *ss, SQClass *c, SQInteger memsize);
83 SQInstance(SQSharedState *ss, SQInstance *c, SQInteger memsize);
85 static SQInstance* Create(SQSharedState *ss,SQClass *theclass) {
87 SQInteger size = calcinstancesize(theclass);
88 SQInstance *newinst = (SQInstance *)SQ_MALLOC(size);
89 new (newinst) SQInstance(ss, theclass,size);
92 SQInstance *Clone(SQSharedState *ss)
94 SQInteger size = calcinstancesize(_class);
95 SQInstance *newinst = (SQInstance *)SQ_MALLOC(size);
96 new (newinst) SQInstance(ss, this,size);
100 bool Get(const SQObjectPtr &key,SQObjectPtr &val) {
101 if(_class->_members->Get(key,val)) {
103 SQObjectPtr &o = _values[_member_idx(val)];
107 val = _class->_methods[_member_idx(val)].val;
113 bool Set(const SQObjectPtr &key,const SQObjectPtr &val) {
115 if(_class->_members->Get(key,idx) && _isfield(idx)) {
116 _values[_member_idx(idx)] = val;
122 if (_hook) { _hook(_userpointer,0);}
123 SQInteger size = _memsize;
128 #ifndef NO_GARBAGE_COLLECTOR
129 void Mark(SQCollectable ** );
131 bool InstanceOf(SQClass *trg);
132 bool GetMetaMethod(SQVM *v,SQMetaMethod mm,SQObjectPtr &res);
135 SQUserPointer _userpointer;
137 SQUnsignedInteger _nvalues;
139 SQObjectPtr _values[1];