#include "sqvm.h"\r
#include "sqtable.h"\r
#include "sqclass.h"\r
+#include "sqfuncproto.h"\r
#include "sqclosure.h"\r
\r
+\r
+\r
SQClass::SQClass(SQSharedState *ss,SQClass *base)\r
{\r
_base = base;\r
_typetag = 0;\r
_hook = NULL;\r
_udsize = 0;\r
- _metamethods.resize(MT_LAST); //size it to max size\r
+ _locked = false;\r
+ _constructoridx = -1;\r
if(_base) {\r
+ _constructoridx = _base->_constructoridx;\r
+ _udsize = _base->_udsize;\r
_defaultvalues.copy(base->_defaultvalues);\r
_methods.copy(base->_methods);\r
- _metamethods.copy(base->_metamethods);\r
+ _COPY_VECTOR(_metamethods,base->_metamethods,MT_LAST);\r
__ObjAddRef(_base);\r
}\r
_members = base?base->_members->Clone() : SQTable::Create(ss,0);\r
__ObjAddRef(_members);\r
- _locked = false;\r
+ \r
INIT_CHAIN();\r
ADD_TO_CHAIN(&_sharedstate->_gc_chain, this);\r
}\r
\r
void SQClass::Finalize() { \r
- _attributes = _null_;\r
+ _attributes.Null();\r
_defaultvalues.resize(0);\r
_methods.resize(0);\r
- _metamethods.resize(0);\r
+ _NULL_SQOBJECT_VECTOR(_metamethods,MT_LAST);\r
__ObjRelease(_members);\r
if(_base) {\r
__ObjRelease(_base);\r
bool SQClass::NewSlot(SQSharedState *ss,const SQObjectPtr &key,const SQObjectPtr &val,bool bstatic)\r
{\r
SQObjectPtr temp;\r
- if(_locked) \r
+ bool belongs_to_static_table = type(val) == OT_CLOSURE || type(val) == OT_NATIVECLOSURE || bstatic;\r
+ if(_locked && !belongs_to_static_table) \r
return false; //the class already has an instance so cannot be modified\r
if(_members->Get(key,temp) && _isfield(temp)) //overrides the default value\r
{\r
_defaultvalues[_member_idx(temp)].val = val;\r
return true;\r
}\r
- if(type(val) == OT_CLOSURE || type(val) == OT_NATIVECLOSURE || bstatic) {\r
+ if(belongs_to_static_table) {\r
SQInteger mmidx;\r
if((type(val) == OT_CLOSURE || type(val) == OT_NATIVECLOSURE) && \r
(mmidx = ss->GetMetaMethodIdxByName(key)) != -1) {\r
_metamethods[mmidx] = val;\r
} \r
else {\r
+ SQObjectPtr theval = val;\r
+ if(_base && type(val) == OT_CLOSURE) {\r
+ theval = _closure(val)->Clone();\r
+ _closure(theval)->_base = _base;\r
+ __ObjAddRef(_base); //ref for the closure\r
+ }\r
if(type(temp) == OT_NULL) {\r
+ bool isconstructor;\r
+ SQVM::IsEqual(ss->_constructoridx, key, isconstructor);\r
+ if(isconstructor) {\r
+ _constructoridx = (SQInteger)_methods.size();\r
+ }\r
SQClassMember m;\r
- m.val = val;\r
+ m.val = theval;\r
_members->NewSlot(key,SQObjectPtr(_make_method_idx(_methods.size())));\r
_methods.push_back(m);\r
}\r
else {\r
- _methods[_member_idx(temp)].val = val;\r
+ _methods[_member_idx(temp)].val = theval;\r
}\r
}\r
return true;\r
{\r
SQUnsignedInteger nvalues = _class->_defaultvalues.size();\r
__ObjRelease(_class);\r
- for(SQUnsignedInteger i = 0; i < nvalues; i++) {\r
- _values[i] = _null_;\r
- }\r
+ _NULL_SQOBJECT_VECTOR(_values,nvalues);\r
+ //for(SQUnsignedInteger i = 0; i < nvalues; i++) {\r
+// _values[i].Null();\r
+// }\r
}\r
\r
SQInstance::~SQInstance()\r