\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
#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
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
#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
}\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
__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
b._type = tOldType;\r
b._unVal = unOldVal;\r
}\r
+\r
/////////////////////////////////////////////////////////////////////////////////////\r
#ifndef NO_GARBAGE_COLLECTOR\r
#define MARK_FLAG 0x80000000\r
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