2 see copyright notice in squirrel.h
4 #include "sqpcheader.h"
10 SQClass::SQClass(SQSharedState *ss,SQClass *base)
15 _metamethods.resize(MT_LAST); //size it to max size
17 _defaultvalues.copy(base->_defaultvalues);
18 _methods.copy(base->_methods);
19 _metamethods.copy(base->_metamethods);
22 _members = base?base->_members->Clone() : SQTable::Create(ss,0);
23 __ObjAddRef(_members);
26 ADD_TO_CHAIN(&_sharedstate->_gc_chain, this);
29 void SQClass::Finalize() {
31 _defaultvalues.resize(0);
33 _metamethods.resize(0);
34 __ObjRelease(_members);
42 REMOVE_FROM_CHAIN(&_sharedstate->_gc_chain, this);
46 bool SQClass::NewSlot(SQSharedState *ss,const SQObjectPtr &key,const SQObjectPtr &val,bool bstatic)
50 return false; //the class already has an instance so cannot be modified
51 if(_members->Get(key,temp) && _isfield(temp)) //overrides the default value
53 _defaultvalues[_member_idx(temp)].val = val;
56 if(type(val) == OT_CLOSURE || type(val) == OT_NATIVECLOSURE || bstatic) {
58 if((type(val) == OT_CLOSURE || type(val) == OT_NATIVECLOSURE) &&
59 (mmidx = ss->GetMetaMethodIdxByName(key)) != -1) {
60 _metamethods[mmidx] = val;
63 if(type(temp) == OT_NULL) {
66 _members->NewSlot(key,SQObjectPtr(_make_method_idx(_methods.size())));
67 _methods.push_back(m);
70 _methods[_member_idx(temp)].val = val;
77 _members->NewSlot(key,SQObjectPtr(_make_field_idx(_defaultvalues.size())));
78 _defaultvalues.push_back(m);
82 SQInstance *SQClass::CreateInstance()
85 return SQInstance::Create(_opt_ss(this),this);
88 SQInteger SQClass::Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval)
91 SQInteger idx = _members->Next(false,refpos,outkey,oval);
94 outval = _methods[_member_idx(oval)].val;
97 SQObjectPtr &o = _defaultvalues[_member_idx(oval)].val;
104 bool SQClass::SetAttributes(const SQObjectPtr &key,const SQObjectPtr &val)
107 if(_members->Get(key,idx)) {
109 _defaultvalues[_member_idx(idx)].attrs = val;
111 _methods[_member_idx(idx)].attrs = val;
117 bool SQClass::GetAttributes(const SQObjectPtr &key,SQObjectPtr &outval)
120 if(_members->Get(key,idx)) {
121 outval = (_isfield(idx)?_defaultvalues[_member_idx(idx)].attrs:_methods[_member_idx(idx)].attrs);
127 ///////////////////////////////////////////////////////////////////////
128 void SQInstance::Init(SQSharedState *ss)
133 _delegate = _class->_members;
135 ADD_TO_CHAIN(&_sharedstate->_gc_chain, this);
138 SQInstance::SQInstance(SQSharedState *ss, SQClass *c, SQInteger memsize)
142 _nvalues = _class->_defaultvalues.size();
143 for(SQUnsignedInteger n = 0; n < _nvalues; n++) {
144 new (&_values[n]) SQObjectPtr(_class->_defaultvalues[n].val);
149 SQInstance::SQInstance(SQSharedState *ss, SQInstance *i, SQInteger memsize)
153 _nvalues = _class->_defaultvalues.size();
154 for(SQUnsignedInteger n = 0; n < _nvalues; n++) {
155 new (&_values[n]) SQObjectPtr(i->_values[n]);
160 void SQInstance::Finalize()
162 __ObjRelease(_class);
163 for(SQUnsignedInteger i = 0; i < _nvalues; i++) {
168 SQInstance::~SQInstance()
170 REMOVE_FROM_CHAIN(&_sharedstate->_gc_chain, this);
174 bool SQInstance::GetMetaMethod(SQVM *v,SQMetaMethod mm,SQObjectPtr &res)
176 if(type(_class->_metamethods[mm]) != OT_NULL) {
177 res = _class->_metamethods[mm];
183 bool SQInstance::InstanceOf(SQClass *trg)
185 SQClass *parent = _class;
186 while(parent != NULL) {
189 parent = parent->_base;