Made Mr_Tree graphic smaller, from 99 to 85 pixels.
[supertux.git] / src / squirrel / squirrel / sqclass.h
index b510f26..3ef4f19 100644 (file)
@@ -16,6 +16,16 @@ struct SQClassMemeber {
 \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
@@ -29,7 +39,13 @@ public:
        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
@@ -40,7 +56,7 @@ public:
        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
@@ -49,46 +65,59 @@ public:
        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
@@ -98,7 +127,9 @@ public:
        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