\r
typedef sqvector<SQClassMemeber> SQClassMemeberVec;\r
\r
+#define MEMBER_TYPE_METHOD 0x01000000\r
+#define MEMBER_TYPE_FIELD 0x02000000\r
+\r
+#define _ismethod(o) (_integer(o)&MEMBER_TYPE_METHOD)\r
+#define _isfield(o) (_integer(o)&MEMBER_TYPE_FIELD)\r
+#define _make_method_idx(i) ((SQInteger)(MEMBER_TYPE_METHOD|i))\r
+#define _make_field_idx(i) ((SQInteger)(MEMBER_TYPE_FIELD|i))\r
+#define _member_type(o) (_integer(o)&0xFF000000)\r
+#define _member_idx(o) (_integer(o)&0x00FFFFFF)\r
+\r
struct SQClass : public CHAINABLE_OBJ\r
{\r
SQClass(SQSharedState *ss,SQClass *base);\r
bool NewSlot(const SQObjectPtr &key,const SQObjectPtr &val);\r
bool Get(const SQObjectPtr &key,SQObjectPtr &val) {\r
if(_members->Get(key,val)) {\r
- val = (type(val) == OT_INTEGER?_defaultvalues[_integer(val)].val:_methods[(int)_userpointer(val)].val);\r
+ if(_isfield(val)) {\r
+ SQObjectPtr &o = _defaultvalues[_member_idx(val)].val;\r
+ val = _realval(o);\r
+ }\r
+ else {\r
+ val = _methods[_member_idx(val)].val;\r
+ }\r
return true;\r
}\r
return false;\r
void Release() { sq_delete(this, SQClass); }\r
void Finalize();\r
void Mark(SQCollectable ** );\r
- int Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval);\r
+ SQInteger Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval);\r
SQInstance *CreateInstance();\r
SQTable *_members;\r
//SQTable *_properties;\r
SQClassMemeberVec _methods;\r
SQObjectPtrVec _metamethods;\r
SQObjectPtr _attributes;\r
- unsigned int _typetag;\r
+ SQUserPointer _typetag;\r
bool _locked;\r
};\r
\r
+#define calcinstancesize(_theclass_) \\r
+ (sizeof(SQInstance)+(sizeof(SQObjectPtr)*(_theclass_->_defaultvalues.size()>0?_theclass_->_defaultvalues.size()-1:0)))\r
struct SQInstance : public SQDelegable \r
{\r
void Init(SQSharedState *ss);\r
- SQInstance(SQSharedState *ss, SQClass *c);\r
- SQInstance(SQSharedState *ss, SQInstance *c);\r
+ SQInstance(SQSharedState *ss, SQClass *c, SQInteger memsize);\r
+ SQInstance(SQSharedState *ss, SQInstance *c, SQInteger memsize);\r
public:\r
static SQInstance* Create(SQSharedState *ss,SQClass *theclass) {\r
- SQInstance *newinst = (SQInstance *)SQ_MALLOC(sizeof(SQInstance));\r
- new (newinst) SQInstance(ss, theclass);\r
+ \r
+ SQInteger size = calcinstancesize(theclass);\r
+ SQInstance *newinst = (SQInstance *)SQ_MALLOC(size);\r
+ new (newinst) SQInstance(ss, theclass,size);\r
return newinst;\r
}\r
SQInstance *Clone(SQSharedState *ss)\r
{\r
- SQInstance *newinst = (SQInstance *)SQ_MALLOC(sizeof(SQInstance));\r
- new (newinst) SQInstance(ss, this);\r
+ SQInteger size = calcinstancesize(_class);\r
+ SQInstance *newinst = (SQInstance *)SQ_MALLOC(size);\r
+ new (newinst) SQInstance(ss, this,size);\r
return newinst;\r
}\r
~SQInstance();\r
bool Get(const SQObjectPtr &key,SQObjectPtr &val) {\r
if(_class->_members->Get(key,val)) {\r
- val = (type(val) == OT_INTEGER?_values[_integer(val)]:_class->_methods[(int)_userpointer(val)].val);\r
+ if(_isfield(val)) {\r
+ SQObjectPtr &o = _values[_member_idx(val)];\r
+ val = _realval(o);\r
+ }\r
+ else {\r
+ val = _class->_methods[_member_idx(val)].val;\r
+ }\r
return true;\r
}\r
return false;\r
}\r
bool Set(const SQObjectPtr &key,const SQObjectPtr &val) {\r
SQObjectPtr idx;\r
- if(_class->_members->Get(key,idx) && type(idx) == OT_INTEGER) {\r
- _values[_integer(idx)] = val;\r
+ if(_class->_members->Get(key,idx) && _isfield(idx)) {\r
+ _values[_member_idx(idx)] = val;\r
return true;\r
}\r
return false;\r
}\r
void Release() { \r
if (_hook) { _hook(_userpointer,0);}\r
- sq_delete(this, SQInstance);\r
+ SQInteger size = _memsize;\r
+ this->~SQInstance();\r
+ SQ_FREE(this, size);\r
}\r
void Finalize();\r
void Mark(SQCollectable ** );\r
SQClass *_class;\r
SQUserPointer _userpointer;\r
SQRELEASEHOOK _hook;\r
- SQObjectPtrVec _values;\r
+ SQUnsignedInteger _nvalues;\r
+ SQInteger _memsize;\r
+ SQObjectPtr _values[1];\r
};\r
\r
#endif //_SQCLASS_H_\r