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];