Update to SQUIRREL 3.0.4
[supertux.git] / external / squirrel / squirrel / sqclass.cpp
old mode 100755 (executable)
new mode 100644 (file)
index f4bcbea..1f26cc9
@@ -5,33 +5,39 @@
 #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
@@ -47,28 +53,40 @@ SQClass::~SQClass()
 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
@@ -162,9 +180,10 @@ void SQInstance::Finalize()
 {\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