Update to Squirrel 3.0.6
[supertux.git] / external / squirrel / squirrel / sqobject.h
old mode 100755 (executable)
new mode 100644 (file)
index d6f6ef1..e0e235e
@@ -4,6 +4,12 @@
 \r
 #include "squtils.h"\r
 \r
+#ifdef _SQ64\r
+#define UINT_MINUS_ONE (0xFFFFFFFFFFFFFFFF)\r
+#else\r
+#define UINT_MINUS_ONE (0xFFFFFFFF)\r
+#endif\r
+\r
 #define SQ_CLOSURESTREAM_HEAD (('S'<<24)|('Q'<<16)|('I'<<8)|('R'))\r
 #define SQ_CLOSURESTREAM_PART (('P'<<24)|('A'<<16)|('R'<<8)|('T'))\r
 #define SQ_CLOSURESTREAM_TAIL (('T'<<24)|('A'<<16)|('I'<<8)|('L'))\r
@@ -51,16 +57,42 @@ enum SQMetaMethod{
 #define MM_NEWMEMBER _SC("_newmember")\r
 #define MM_INHERITED _SC("_inherited")\r
 \r
+\r
+#define _CONSTRUCT_VECTOR(type,size,ptr) { \\r
+       for(SQInteger n = 0; n < ((SQInteger)size); n++) { \\r
+                       new (&ptr[n]) type(); \\r
+               } \\r
+}\r
+\r
+#define _DESTRUCT_VECTOR(type,size,ptr) { \\r
+       for(SQInteger nl = 0; nl < ((SQInteger)size); nl++) { \\r
+                       ptr[nl].~type(); \\r
+       } \\r
+}\r
+\r
+#define _COPY_VECTOR(dest,src,size) { \\r
+       for(SQInteger _n_ = 0; _n_ < ((SQInteger)size); _n_++) { \\r
+               dest[_n_] = src[_n_]; \\r
+       } \\r
+}\r
+\r
+#define _NULL_SQOBJECT_VECTOR(vec,size) { \\r
+       for(SQInteger _n_ = 0; _n_ < ((SQInteger)size); _n_++) { \\r
+               vec[_n_].Null(); \\r
+       } \\r
+}\r
+\r
 #define MINPOWER2 4\r
 \r
 struct SQRefCounted\r
 {\r
+       SQUnsignedInteger _uiRef;\r
+       struct SQWeakRef *_weakref;\r
        SQRefCounted() { _uiRef = 0; _weakref = NULL; }\r
        virtual ~SQRefCounted();\r
        SQWeakRef *GetWeakRef(SQObjectType type);\r
-       SQUnsignedInteger _uiRef;\r
-       struct SQWeakRef *_weakref;\r
        virtual void Release()=0;\r
+       \r
 };\r
 \r
 struct SQWeakRef : SQRefCounted\r
@@ -78,7 +110,7 @@ struct SQObjectPtr;
                        unval.pRefCounted->_uiRef++; \\r
                }  \r
 \r
-#define __Release(type,unval) if(ISREFCOUNTED(type) && ((--unval.pRefCounted->_uiRef)<=0))     \\r
+#define __Release(type,unval) if(ISREFCOUNTED(type) && ((--unval.pRefCounted->_uiRef)==0))     \\r
                {       \\r
                        unval.pRefCounted->Release();   \\r
                }\r
@@ -116,17 +148,61 @@ struct SQObjectPtr;
 #define _instance(obj) ((obj)._unVal.pInstance)\r
 #define _delegable(obj) ((SQDelegable *)(obj)._unVal.pDelegable)\r
 #define _weakref(obj) ((obj)._unVal.pWeakRef)\r
+#define _outer(obj) ((obj)._unVal.pOuter)\r
 #define _refcounted(obj) ((obj)._unVal.pRefCounted)\r
 #define _rawval(obj) ((obj)._unVal.raw)\r
 \r
 #define _stringval(obj) (obj)._unVal.pString->_val\r
-#define _userdataval(obj) (obj)._unVal.pUserData->_val\r
+#define _userdataval(obj) ((SQUserPointer)sq_aligning((obj)._unVal.pUserData + 1))\r
 \r
 #define tofloat(num) ((type(num)==OT_INTEGER)?(SQFloat)_integer(num):_float(num))\r
-#define tointeger(num) (       (type(num)==OT_FLOAT)?(SQInteger)_float(num):_integer(num))\r
-\r
+#define tointeger(num) ((type(num)==OT_FLOAT)?(SQInteger)_float(num):_integer(num))\r
 /////////////////////////////////////////////////////////////////////////////////////\r
 /////////////////////////////////////////////////////////////////////////////////////\r
+#if defined(SQUSEDOUBLE) && !defined(_SQ64) || !defined(SQUSEDOUBLE) && defined(_SQ64)\r
+#define SQ_REFOBJECT_INIT()    SQ_OBJECT_RAWINIT()\r
+#else\r
+#define SQ_REFOBJECT_INIT()\r
+#endif\r
+\r
+#define _REF_TYPE_DECL(type,_class,sym) \\r
+       SQObjectPtr(_class * x) \\r
+       { \\r
+               SQ_OBJECT_RAWINIT() \\r
+               _type=type; \\r
+               _unVal.sym = x; \\r
+               assert(_unVal.pTable); \\r
+               _unVal.pRefCounted->_uiRef++; \\r
+       } \\r
+       inline SQObjectPtr& operator=(_class *x) \\r
+       {  \\r
+               SQObjectType tOldType; \\r
+               SQObjectValue unOldVal; \\r
+               tOldType=_type; \\r
+               unOldVal=_unVal; \\r
+               _type = type; \\r
+               SQ_REFOBJECT_INIT() \\r
+               _unVal.sym = x; \\r
+               _unVal.pRefCounted->_uiRef++; \\r
+               __Release(tOldType,unOldVal); \\r
+               return *this; \\r
+       }\r
+\r
+#define _SCALAR_TYPE_DECL(type,_class,sym) \\r
+       SQObjectPtr(_class x) \\r
+       { \\r
+               SQ_OBJECT_RAWINIT() \\r
+               _type=type; \\r
+               _unVal.sym = x; \\r
+       } \\r
+       inline SQObjectPtr& operator=(_class x) \\r
+       {  \\r
+               __Release(_type,_unVal); \\r
+               _type = type; \\r
+               SQ_OBJECT_RAWINIT() \\r
+               _unVal.sym = x; \\r
+               return *this; \\r
+       }\r
 struct SQObjectPtr : public SQObject\r
 {\r
        SQObjectPtr()\r
@@ -137,168 +213,54 @@ struct SQObjectPtr : public SQObject
        }\r
        SQObjectPtr(const SQObjectPtr &o)\r
        {\r
-               SQ_OBJECT_RAWINIT()\r
-               _type=o._type;\r
-               _unVal=o._unVal;\r
+               _type = o._type;\r
+               _unVal = o._unVal;\r
                __AddRef(_type,_unVal);\r
        }\r
        SQObjectPtr(const SQObject &o)\r
        {\r
-               SQ_OBJECT_RAWINIT()\r
-               _type=o._type;\r
-               _unVal=o._unVal;\r
-               __AddRef(_type,_unVal);\r
-       }\r
-       SQObjectPtr(SQTable *pTable)\r
-       {\r
-               SQ_OBJECT_RAWINIT()\r
-               _type=OT_TABLE;\r
-               _unVal.pTable=pTable;\r
-               assert(_unVal.pTable);\r
-               __AddRef(_type,_unVal);\r
-       }\r
-       SQObjectPtr(SQClass *pClass)\r
-       {\r
-               SQ_OBJECT_RAWINIT()\r
-               _type=OT_CLASS;\r
-               _unVal.pClass=pClass;\r
-               assert(_unVal.pClass);\r
-               __AddRef(_type,_unVal);\r
-       }\r
-       SQObjectPtr(SQInstance *pInstance)\r
-       {\r
-               SQ_OBJECT_RAWINIT()\r
-               _type=OT_INSTANCE;\r
-               _unVal.pInstance=pInstance;\r
-               assert(_unVal.pInstance);\r
-               __AddRef(_type,_unVal);\r
-       }\r
-       SQObjectPtr(SQArray *pArray)\r
-       {\r
-               SQ_OBJECT_RAWINIT()\r
-               _type=OT_ARRAY;\r
-               _unVal.pArray=pArray;\r
-               assert(_unVal.pArray);\r
-               __AddRef(_type,_unVal);\r
-       }\r
-       SQObjectPtr(SQClosure *pClosure)\r
-       {\r
-               SQ_OBJECT_RAWINIT()\r
-               _type=OT_CLOSURE;\r
-               _unVal.pClosure=pClosure;\r
-               assert(_unVal.pClosure);\r
-               __AddRef(_type,_unVal);\r
-       }\r
-       SQObjectPtr(SQGenerator *pGenerator)\r
-       {\r
-               SQ_OBJECT_RAWINIT()\r
-               _type=OT_GENERATOR;\r
-               _unVal.pGenerator=pGenerator;\r
-               assert(_unVal.pGenerator);\r
-               __AddRef(_type,_unVal);\r
-       }\r
-       SQObjectPtr(SQNativeClosure *pNativeClosure)\r
-       {\r
-               SQ_OBJECT_RAWINIT()\r
-               _type=OT_NATIVECLOSURE;\r
-               _unVal.pNativeClosure=pNativeClosure;\r
-               assert(_unVal.pNativeClosure);\r
-               __AddRef(_type,_unVal);\r
-       }\r
-       SQObjectPtr(SQString *pString)\r
-       {\r
-               SQ_OBJECT_RAWINIT()\r
-               _type=OT_STRING;\r
-               _unVal.pString=pString;\r
-               assert(_unVal.pString);\r
-               __AddRef(_type,_unVal);\r
-       }\r
-       SQObjectPtr(SQUserData *pUserData)\r
-       {\r
-               SQ_OBJECT_RAWINIT()\r
-               _type=OT_USERDATA;\r
-               _unVal.pUserData=pUserData;\r
-               assert(_unVal.pUserData);\r
-               __AddRef(_type,_unVal);\r
-       }\r
-       SQObjectPtr(SQVM *pThread)\r
-       {\r
-               SQ_OBJECT_RAWINIT()\r
-               _type=OT_THREAD;\r
-               _unVal.pThread=pThread;\r
-               assert(_unVal.pThread);\r
-               __AddRef(_type,_unVal);\r
-       }\r
-       SQObjectPtr(SQWeakRef *pWeakRef)\r
-       {\r
-               SQ_OBJECT_RAWINIT()\r
-               _type=OT_WEAKREF;\r
-               _unVal.pWeakRef=pWeakRef;\r
-               assert(_unVal.pWeakRef);\r
-               __AddRef(_type,_unVal);\r
-       }\r
-       SQObjectPtr(SQFunctionProto *pFunctionProto)\r
-       {\r
-               SQ_OBJECT_RAWINIT()\r
-               _type=OT_FUNCPROTO;\r
-               _unVal.pFunctionProto=pFunctionProto;\r
-               assert(_unVal.pFunctionProto);\r
+               _type = o._type;\r
+               _unVal = o._unVal;\r
                __AddRef(_type,_unVal);\r
        }\r
-       SQObjectPtr(SQInteger nInteger)\r
-       {\r
-               SQ_OBJECT_RAWINIT()\r
-               _type=OT_INTEGER;\r
-               _unVal.nInteger=nInteger;\r
-       }\r
-       SQObjectPtr(SQFloat fFloat)\r
-       {\r
-               SQ_OBJECT_RAWINIT()\r
-               _type=OT_FLOAT;\r
-               _unVal.fFloat=fFloat;\r
-       }\r
+       _REF_TYPE_DECL(OT_TABLE,SQTable,pTable)\r
+       _REF_TYPE_DECL(OT_CLASS,SQClass,pClass)\r
+       _REF_TYPE_DECL(OT_INSTANCE,SQInstance,pInstance)\r
+       _REF_TYPE_DECL(OT_ARRAY,SQArray,pArray)\r
+       _REF_TYPE_DECL(OT_CLOSURE,SQClosure,pClosure)\r
+       _REF_TYPE_DECL(OT_NATIVECLOSURE,SQNativeClosure,pNativeClosure)\r
+       _REF_TYPE_DECL(OT_OUTER,SQOuter,pOuter)\r
+       _REF_TYPE_DECL(OT_GENERATOR,SQGenerator,pGenerator)\r
+       _REF_TYPE_DECL(OT_STRING,SQString,pString)\r
+       _REF_TYPE_DECL(OT_USERDATA,SQUserData,pUserData)\r
+       _REF_TYPE_DECL(OT_WEAKREF,SQWeakRef,pWeakRef)\r
+       _REF_TYPE_DECL(OT_THREAD,SQVM,pThread)\r
+       _REF_TYPE_DECL(OT_FUNCPROTO,SQFunctionProto,pFunctionProto)\r
+       \r
+       _SCALAR_TYPE_DECL(OT_INTEGER,SQInteger,nInteger)\r
+       _SCALAR_TYPE_DECL(OT_FLOAT,SQFloat,fFloat)\r
+       _SCALAR_TYPE_DECL(OT_USERPOINTER,SQUserPointer,pUserPointer)\r
+\r
        SQObjectPtr(bool bBool)\r
        {\r
                SQ_OBJECT_RAWINIT()\r
                _type = OT_BOOL;\r
                _unVal.nInteger = bBool?1:0;\r
        }\r
-       SQObjectPtr(SQUserPointer pUserPointer)\r
-       {\r
-               SQ_OBJECT_RAWINIT()\r
-               _type=OT_USERPOINTER;\r
-               _unVal.pUserPointer=pUserPointer;\r
-       }\r
-       ~SQObjectPtr()\r
-       {\r
-               __Release(_type,_unVal);\r
-       }\r
-       inline void Null()\r
-       {\r
-               SQObjectType tOldType;\r
-               SQObjectValue unOldVal;\r
-               tOldType = _type;\r
-               unOldVal = _unVal;\r
-               _type = OT_NULL;\r
-               _unVal.pUserPointer = NULL;\r
-               __Release(tOldType,unOldVal);\r
-       }\r
-       inline SQObjectPtr& operator=(SQInteger i)\r
+       inline SQObjectPtr& operator=(bool b)\r
        { \r
                __Release(_type,_unVal);\r
                SQ_OBJECT_RAWINIT()\r
-               _unVal.nInteger = i;\r
-               _type = OT_INTEGER;\r
+               _type = OT_BOOL;\r
+               _unVal.nInteger = b?1:0;\r
                return *this;\r
        }\r
-       inline SQObjectPtr& operator=(SQFloat f)\r
-       { \r
+\r
+       ~SQObjectPtr()\r
+       {\r
                __Release(_type,_unVal);\r
-               SQ_OBJECT_RAWINIT()\r
-               _unVal.fFloat = f;\r
-               _type = OT_FLOAT;\r
-               return *this;\r
        }\r
+                       \r
        inline SQObjectPtr& operator=(const SQObjectPtr& obj)\r
        { \r
                SQObjectType tOldType;\r
@@ -323,10 +285,19 @@ struct SQObjectPtr : public SQObject
                __Release(tOldType,unOldVal);\r
                return *this;\r
        }\r
+       inline void Null()\r
+       {\r
+               SQObjectType tOldType = _type;\r
+               SQObjectValue unOldVal = _unVal;\r
+               _type = OT_NULL;\r
+               _unVal.raw = (SQRawObjectVal)NULL;\r
+               __Release(tOldType ,unOldVal);\r
+       }\r
        private:\r
                SQObjectPtr(const SQChar *){} //safety\r
 };\r
 \r
+\r
 inline void _Swap(SQObject &a,SQObject &b)\r
 {\r
        SQObjectType tOldType = a._type;\r
@@ -336,6 +307,7 @@ inline void _Swap(SQObject &a,SQObject &b)
        b._type = tOldType;\r
        b._unVal = unOldVal;\r
 }\r
+\r
 /////////////////////////////////////////////////////////////////////////////////////\r
 #ifndef NO_GARBAGE_COLLECTOR\r
 #define MARK_FLAG 0x80000000\r
@@ -343,6 +315,7 @@ struct SQCollectable : public SQRefCounted {
        SQCollectable *_next;\r
        SQCollectable *_prev;\r
        SQSharedState *_sharedstate;\r
+       virtual SQObjectType GetType()=0;\r
        virtual void Release()=0;\r
        virtual void Mark(SQCollectable **chain)=0;\r
        void UnMark();\r