1 /* see copyright notice in squirrel.h */
9 SQClassMember(const SQClassMember &o) {
17 typedef sqvector<SQClassMember> SQClassMemberVec;
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 SQClassMemberVec _defaultvalues;
69 SQClassMemberVec _methods;
70 SQObjectPtrVec _metamethods;
71 SQObjectPtr _attributes;
72 SQUserPointer _typetag;
78 #define calcinstancesize(_theclass_) \
79 (_theclass_->_udsize + sizeof(SQInstance) + (sizeof(SQObjectPtr)*(_theclass_->_defaultvalues.size()>0?_theclass_->_defaultvalues.size()-1:0)))
81 struct SQInstance : public SQDelegable
83 void Init(SQSharedState *ss);
84 SQInstance(SQSharedState *ss, SQClass *c, SQInteger memsize);
85 SQInstance(SQSharedState *ss, SQInstance *c, SQInteger memsize);
87 static SQInstance* Create(SQSharedState *ss,SQClass *theclass) {
89 SQInteger size = calcinstancesize(theclass);
90 SQInstance *newinst = (SQInstance *)SQ_MALLOC(size);
91 new (newinst) SQInstance(ss, theclass,size);
92 if(theclass->_udsize) {
93 newinst->_userpointer = ((unsigned char *)newinst) + (size - theclass->_udsize);
97 SQInstance *Clone(SQSharedState *ss)
99 SQInteger size = calcinstancesize(_class);
100 SQInstance *newinst = (SQInstance *)SQ_MALLOC(size);
101 new (newinst) SQInstance(ss, this,size);
102 if(_class->_udsize) {
103 newinst->_userpointer = ((unsigned char *)newinst) + (size - _class->_udsize);
108 bool Get(const SQObjectPtr &key,SQObjectPtr &val) {
109 if(_class->_members->Get(key,val)) {
111 SQObjectPtr &o = _values[_member_idx(val)];
115 val = _class->_methods[_member_idx(val)].val;
121 bool Set(const SQObjectPtr &key,const SQObjectPtr &val) {
123 if(_class->_members->Get(key,idx) && _isfield(idx)) {
124 _values[_member_idx(idx)] = val;
131 if (_hook) { _hook(_userpointer,0);}
133 if(_uiRef > 0) return;
134 SQInteger size = _memsize;
139 #ifndef NO_GARBAGE_COLLECTOR
140 void Mark(SQCollectable ** );
142 bool InstanceOf(SQClass *trg);
143 bool GetMetaMethod(SQVM *v,SQMetaMethod mm,SQObjectPtr &res);
146 SQUserPointer _userpointer;
149 SQObjectPtr _values[1];