_base = base;
_typetag = 0;
_hook = NULL;
+ _udsize = 0;
_metamethods.resize(MT_LAST); //size it to max size
if(_base) {
_defaultvalues.copy(base->_defaultvalues);
ADD_TO_CHAIN(&_sharedstate->_gc_chain, this);
}
-void SQClass::Finalize() {
+void SQClass::Finalize() {
_attributes = _null_;
_defaultvalues.resize(0);
_methods.resize(0);
bool SQClass::NewSlot(SQSharedState *ss,const SQObjectPtr &key,const SQObjectPtr &val,bool bstatic)
{
SQObjectPtr temp;
- if(_locked)
+ if(_locked)
return false; //the class already has an instance so cannot be modified
if(_members->Get(key,temp) && _isfield(temp)) //overrides the default value
{
}
if(type(val) == OT_CLOSURE || type(val) == OT_NATIVECLOSURE || bstatic) {
SQInteger mmidx;
- if((type(val) == OT_CLOSURE || type(val) == OT_NATIVECLOSURE) &&
+ if((type(val) == OT_CLOSURE || type(val) == OT_NATIVECLOSURE) &&
(mmidx = ss->GetMetaMethodIdxByName(key)) != -1) {
_metamethods[mmidx] = val;
- }
+ }
else {
if(type(temp) == OT_NULL) {
- SQClassMemeber m;
+ SQClassMember m;
m.val = val;
_members->NewSlot(key,SQObjectPtr(_make_method_idx(_methods.size())));
_methods.push_back(m);
}
return true;
}
- SQClassMemeber m;
+ SQClassMember m;
m.val = val;
_members->NewSlot(key,SQObjectPtr(_make_field_idx(_defaultvalues.size())));
_defaultvalues.push_back(m);
{
_memsize = memsize;
_class = c;
- _nvalues = _class->_defaultvalues.size();
- for(SQUnsignedInteger n = 0; n < _nvalues; n++) {
+ SQUnsignedInteger nvalues = _class->_defaultvalues.size();
+ for(SQUnsignedInteger n = 0; n < nvalues; n++) {
new (&_values[n]) SQObjectPtr(_class->_defaultvalues[n].val);
}
Init(ss);
{
_memsize = memsize;
_class = i->_class;
- _nvalues = _class->_defaultvalues.size();
- for(SQUnsignedInteger n = 0; n < _nvalues; n++) {
+ SQUnsignedInteger nvalues = _class->_defaultvalues.size();
+ for(SQUnsignedInteger n = 0; n < nvalues; n++) {
new (&_values[n]) SQObjectPtr(i->_values[n]);
}
Init(ss);
}
-void SQInstance::Finalize()
+void SQInstance::Finalize()
{
+ SQUnsignedInteger nvalues = _class->_defaultvalues.size();
__ObjRelease(_class);
- for(SQUnsignedInteger i = 0; i < _nvalues; i++) {
+ for(SQUnsignedInteger i = 0; i < nvalues; i++) {
_values[i] = _null_;
}
}
SQInstance::~SQInstance()
{
REMOVE_FROM_CHAIN(&_sharedstate->_gc_chain, this);
- Finalize();
+ if(_class){ Finalize(); } //if _class is null it was already finalized by the GC
}
bool SQInstance::GetMetaMethod(SQVM *v,SQMetaMethod mm,SQObjectPtr &res)