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;