-/* see copyright notice in squirrel.h */
-#ifndef _SQOBJECT_H_
-#define _SQOBJECT_H_
-
-#include "squtils.h"
-
-#define SQ_CLOSURESTREAM_HEAD (('S'<<24)|('Q'<<16)|('I'<<8)|('R'))
-#define SQ_CLOSURESTREAM_PART (('P'<<24)|('A'<<16)|('R'<<8)|('T'))
-#define SQ_CLOSURESTREAM_TAIL (('T'<<24)|('A'<<16)|('I'<<8)|('L'))
-
-#define SQ_TRY try
-#define SQ_CATCH(type, ex) catch(type &ex)
-
-struct SQSharedState;
-
-enum SQMetaMethod{
- MT_ADD=0,
- MT_SUB=1,
- MT_MUL=2,
- MT_DIV=3,
- MT_UNM=4,
- MT_MODULO=5,
- MT_SET=6,
- MT_GET=7,
- MT_TYPEOF=8,
- MT_NEXTI=9,
- MT_CMP=10,
- MT_CALL=11,
- MT_CLONED=12,
- MT_NEWSLOT=13,
- MT_DELSLOT=14,
- MT_LAST = 15,
-};
-
-#define MM_ADD _SC("_add")
-#define MM_SUB _SC("_sub")
-#define MM_MUL _SC("_mul")
-#define MM_DIV _SC("_div")
-#define MM_UNM _SC("_unm")
-#define MM_MODULO _SC("_modulo")
-#define MM_SET _SC("_set")
-#define MM_GET _SC("_get")
-#define MM_TYPEOF _SC("_typeof")
-#define MM_NEXTI _SC("_nexti")
-#define MM_CMP _SC("_cmp")
-#define MM_CALL _SC("_call")
-#define MM_CLONED _SC("_cloned")
-#define MM_NEWSLOT _SC("_newslot")
-#define MM_DELSLOT _SC("_delslot")
-
-#define MINPOWER2 4
-
-struct SQRefCounted
-{
- virtual ~SQRefCounted()
- {}
- unsigned int _uiRef;
- virtual void Release()=0;
-};
-
-struct SQObjectPtr;
-
-#define __AddRef(type,unval) if(ISREFCOUNTED(type)) \
- { \
- unval.pRefCounted->_uiRef++; \
- }
-
-#define __Release(type,unval) if(ISREFCOUNTED(type) && ((--unval.pRefCounted->_uiRef)<=0)) \
- { \
- unval.pRefCounted->Release(); \
- }
-
-#define __ObjRelease(obj) { \
- if((obj)) { \
- (obj)->_uiRef--; \
- if((obj)->_uiRef == 0) \
- (obj)->Release(); \
- (obj) = NULL; \
- } \
-}
-
-#define __ObjAddRef(obj) { \
- (obj)->_uiRef++; \
-}
-
-#define type(obj) ((obj)._type)
-#define is_delegable(t) (type(t)&SQOBJECT_DELEGABLE)
-#define raw_type(obj) _RAW_TYPE((obj)._type)
-
-#define _integer(obj) ((obj)._unVal.nInteger)
-#define _float(obj) ((obj)._unVal.fFloat)
-#define _string(obj) ((obj)._unVal.pString)
-#define _table(obj) ((obj)._unVal.pTable)
-#define _array(obj) ((obj)._unVal.pArray)
-#define _closure(obj) ((obj)._unVal.pClosure)
-#define _generator(obj) ((obj)._unVal.pGenerator)
-#define _nativeclosure(obj) ((obj)._unVal.pNativeClosure)
-#define _userdata(obj) ((obj)._unVal.pUserData)
-#define _userpointer(obj) ((obj)._unVal.pUserPointer)
-#define _thread(obj) ((obj)._unVal.pThread)
-#define _funcproto(obj) ((obj)._unVal.pFunctionProto)
-#define _class(obj) ((obj)._unVal.pClass)
-#define _instance(obj) ((obj)._unVal.pInstance)
-#define _delegable(obj) ((SQDelegable *)(obj)._unVal.pDelegable)
-#define _rawval(obj) ((obj)._unVal.pRefCounted)
-
-#define _stringval(obj) (obj)._unVal.pString->_val
-#define _userdataval(obj) (obj)._unVal.pUserData->_val
-
-#define tofloat(num) ((type(num)==OT_INTEGER)?(SQFloat)_integer(num):_float(num))
-#define tointeger(num) ((type(num)==OT_FLOAT)?(SQInteger)_float(num):_integer(num))
-/////////////////////////////////////////////////////////////////////////////////////
-/////////////////////////////////////////////////////////////////////////////////////
-struct SQObjectPtr : public SQObject
-{
- SQObjectPtr()
- {
- _type=OT_NULL;
- _unVal.pUserPointer=NULL;
- }
- SQObjectPtr(const SQObjectPtr &o)
- {
- _type=o._type;
- _unVal=o._unVal;
- __AddRef(_type,_unVal);
- }
- SQObjectPtr(const SQObject &o)
- {
- _type=o._type;
- _unVal=o._unVal;
- __AddRef(_type,_unVal);
- }
- SQObjectPtr(SQTable *pTable)
- {
- _type=OT_TABLE;
- _unVal.pTable=pTable;
- assert(_unVal.pTable);
- __AddRef(_type,_unVal);
- }
- SQObjectPtr(SQClass *pClass)
- {
- _type=OT_CLASS;
- _unVal.pClass=pClass;
- assert(_unVal.pClass);
- __AddRef(_type,_unVal);
- }
- SQObjectPtr(SQInstance *pInstance)
- {
- _type=OT_INSTANCE;
- _unVal.pInstance=pInstance;
- assert(_unVal.pInstance);
- __AddRef(_type,_unVal);
- }
- SQObjectPtr(SQArray *pArray)
- {
- _type=OT_ARRAY;
- _unVal.pArray=pArray;
- assert(_unVal.pArray);
- __AddRef(_type,_unVal);
- }
- SQObjectPtr(SQClosure *pClosure)
- {
- _type=OT_CLOSURE;
- _unVal.pClosure=pClosure;
- assert(_unVal.pClosure);
- __AddRef(_type,_unVal);
- }
- SQObjectPtr(SQGenerator *pGenerator)
- {
- _type=OT_GENERATOR;
- _unVal.pGenerator=pGenerator;
- assert(_unVal.pGenerator);
- __AddRef(_type,_unVal);
- }
- SQObjectPtr(SQNativeClosure *pNativeClosure)
- {
- _type=OT_NATIVECLOSURE;
- _unVal.pNativeClosure=pNativeClosure;
- assert(_unVal.pNativeClosure);
- __AddRef(_type,_unVal);
- }
- SQObjectPtr(SQString *pString)
- {
- _type=OT_STRING;
- _unVal.pString=pString;
- assert(_unVal.pString);
- __AddRef(_type,_unVal);
- }
- SQObjectPtr(SQUserData *pUserData)
- {
- _type=OT_USERDATA;
- _unVal.pUserData=pUserData;
- assert(_unVal.pUserData);
- __AddRef(_type,_unVal);
- }
- SQObjectPtr(SQVM *pThread)
- {
- _type=OT_THREAD;
- _unVal.pThread=pThread;
- assert(_unVal.pThread);
- __AddRef(_type,_unVal);
- }
- SQObjectPtr(SQFunctionProto *pFunctionProto)
- {
- _type=OT_FUNCPROTO;
- _unVal.pFunctionProto=pFunctionProto;
- assert(_unVal.pFunctionProto);
- __AddRef(_type,_unVal);
- }
- SQObjectPtr(SQInteger nInteger)
- {
- _type=OT_INTEGER;
- _unVal.nInteger=nInteger;
- }
- SQObjectPtr(SQFloat fFloat)
- {
- _type=OT_FLOAT;
- _unVal.fFloat=fFloat;
- }
- SQObjectPtr(bool bBool)
- {
- _type = OT_BOOL;
- _unVal.nInteger = bBool?1:0;
- }
- SQObjectPtr(SQUserPointer pUserPointer)
- {
- _type=OT_USERPOINTER;
- _unVal.pUserPointer=pUserPointer;
- }
- ~SQObjectPtr()
- {
- __Release(_type,_unVal);
- }
- void Null()
- {
- __Release(_type,_unVal);
- _type=OT_NULL;
- _unVal.pUserPointer=NULL;
- }
- SQObjectPtr& operator=(const SQObjectPtr& obj)
- {
- SQObjectType tOldType;
- SQObjectValue unOldVal;
- tOldType=_type;
- unOldVal=_unVal;
- _unVal = obj._unVal;
- _type = obj._type;
- __AddRef(_type,_unVal);
- __Release(tOldType,unOldVal);
- return *this;
- }
- SQObjectPtr& operator=(const SQObject& obj)
- {
- SQObjectType tOldType;
- SQObjectValue unOldVal;
- tOldType=_type;
- unOldVal=_unVal;
- _unVal = obj._unVal;
- _type = obj._type;
- __AddRef(_type,_unVal);
- __Release(tOldType,unOldVal);
- return *this;
- }
- private:
- SQObjectPtr(const SQChar *){} //safety
-};
-/////////////////////////////////////////////////////////////////////////////////////
-#ifndef NO_GARBAGE_COLLECTOR
-#define MARK_FLAG 0x80000000
-struct SQCollectable : public SQRefCounted {
- SQCollectable *_next;
- SQCollectable *_prev;
- SQSharedState *_sharedstate;
- virtual void Release()=0;
- virtual void Mark(SQCollectable **chain)=0;
- void UnMark();
- virtual void Finalize()=0;
- static void AddToChain(SQCollectable **chain,SQCollectable *c);
- static void RemoveFromChain(SQCollectable **chain,SQCollectable *c);
-};
-
-
-#define ADD_TO_CHAIN(chain,obj) AddToChain(chain,obj)
-#define REMOVE_FROM_CHAIN(chain,obj) {if(!(_uiRef&MARK_FLAG))RemoveFromChain(chain,obj);}
-#define CHAINABLE_OBJ SQCollectable
-#define INIT_CHAIN() {_next=NULL;_prev=NULL;_sharedstate=ss;}
-#else
-
-#define ADD_TO_CHAIN(chain,obj) ((void)0)
-#define REMOVE_FROM_CHAIN(chain,obj) ((void)0)
-#define CHAINABLE_OBJ SQRefCounted
-#define INIT_CHAIN() ((void)0)
-#endif
-
-struct SQDelegable : public CHAINABLE_OBJ {
- virtual bool GetMetaMethod(SQMetaMethod mm,SQObjectPtr &res);
- SQTable *_delegate;
-};
-
-unsigned int TranslateIndex(const SQObjectPtr &idx);
-typedef sqvector<SQObjectPtr> SQObjectPtrVec;
-typedef sqvector<int> SQIntVec;
-
-#endif //_SQOBJECT_H_
+/* see copyright notice in squirrel.h */\r
+#ifndef _SQOBJECT_H_\r
+#define _SQOBJECT_H_\r
+\r
+#include "squtils.h"\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
+\r
+struct SQSharedState;\r
+\r
+enum SQMetaMethod{\r
+ MT_ADD=0,\r
+ MT_SUB=1,\r
+ MT_MUL=2,\r
+ MT_DIV=3,\r
+ MT_UNM=4,\r
+ MT_MODULO=5,\r
+ MT_SET=6,\r
+ MT_GET=7,\r
+ MT_TYPEOF=8,\r
+ MT_NEXTI=9,\r
+ MT_CMP=10,\r
+ MT_CALL=11,\r
+ MT_CLONED=12,\r
+ MT_NEWSLOT=13,\r
+ MT_DELSLOT=14,\r
+ MT_TOSTRING=15,\r
+ MT_NEWMEMBER=16,\r
+ MT_INHERITED=17,\r
+ MT_LAST = 18\r
+};\r
+\r
+#define MM_ADD _SC("_add")\r
+#define MM_SUB _SC("_sub")\r
+#define MM_MUL _SC("_mul")\r
+#define MM_DIV _SC("_div")\r
+#define MM_UNM _SC("_unm")\r
+#define MM_MODULO _SC("_modulo")\r
+#define MM_SET _SC("_set")\r
+#define MM_GET _SC("_get")\r
+#define MM_TYPEOF _SC("_typeof")\r
+#define MM_NEXTI _SC("_nexti")\r
+#define MM_CMP _SC("_cmp")\r
+#define MM_CALL _SC("_call")\r
+#define MM_CLONED _SC("_cloned")\r
+#define MM_NEWSLOT _SC("_newslot")\r
+#define MM_DELSLOT _SC("_delslot")\r
+#define MM_TOSTRING _SC("_tostring")\r
+#define MM_NEWMEMBER _SC("_newmember")\r
+#define MM_INHERITED _SC("_inherited")\r
+\r
+#define MINPOWER2 4\r
+\r
+struct SQRefCounted\r
+{\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
+struct SQWeakRef : SQRefCounted\r
+{\r
+ void Release();\r
+ SQObject _obj;\r
+};\r
+\r
+#define _realval(o) (type((o)) != OT_WEAKREF?(SQObject)o:_weakref(o)->_obj)\r
+\r
+struct SQObjectPtr;\r
+\r
+#define __AddRef(type,unval) if(ISREFCOUNTED(type)) \\r
+ { \\r
+ unval.pRefCounted->_uiRef++; \\r
+ } \r
+\r
+#define __Release(type,unval) if(ISREFCOUNTED(type) && ((--unval.pRefCounted->_uiRef)<=0)) \\r
+ { \\r
+ unval.pRefCounted->Release(); \\r
+ }\r
+\r
+#define __ObjRelease(obj) { \\r
+ if((obj)) { \\r
+ (obj)->_uiRef--; \\r
+ if((obj)->_uiRef == 0) \\r
+ (obj)->Release(); \\r
+ (obj) = NULL; \\r
+ } \\r
+}\r
+\r
+#define __ObjAddRef(obj) { \\r
+ (obj)->_uiRef++; \\r
+}\r
+\r
+#define type(obj) ((obj)._type)\r
+#define is_delegable(t) (type(t)&SQOBJECT_DELEGABLE)\r
+#define raw_type(obj) _RAW_TYPE((obj)._type)\r
+\r
+#define _integer(obj) ((obj)._unVal.nInteger)\r
+#define _float(obj) ((obj)._unVal.fFloat)\r
+#define _string(obj) ((obj)._unVal.pString)\r
+#define _table(obj) ((obj)._unVal.pTable)\r
+#define _array(obj) ((obj)._unVal.pArray)\r
+#define _closure(obj) ((obj)._unVal.pClosure)\r
+#define _generator(obj) ((obj)._unVal.pGenerator)\r
+#define _nativeclosure(obj) ((obj)._unVal.pNativeClosure)\r
+#define _userdata(obj) ((obj)._unVal.pUserData)\r
+#define _userpointer(obj) ((obj)._unVal.pUserPointer)\r
+#define _thread(obj) ((obj)._unVal.pThread)\r
+#define _funcproto(obj) ((obj)._unVal.pFunctionProto)\r
+#define _class(obj) ((obj)._unVal.pClass)\r
+#define _instance(obj) ((obj)._unVal.pInstance)\r
+#define _delegable(obj) ((SQDelegable *)(obj)._unVal.pDelegable)\r
+#define _weakref(obj) ((obj)._unVal.pWeakRef)\r
+#define _refcounted(obj) ((obj)._unVal.pRefCounted)\r
+#define _rawval(obj) ((obj)._unVal.pRefCounted)\r
+\r
+#define _stringval(obj) (obj)._unVal.pString->_val\r
+#define _userdataval(obj) (obj)._unVal.pUserData->_val\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
+/////////////////////////////////////////////////////////////////////////////////////\r
+struct SQObjectPtr : public SQObject\r
+{\r
+ SQObjectPtr()\r
+ {\r
+ _type=OT_NULL;\r
+ _unVal.pUserPointer=NULL;\r
+ }\r
+ SQObjectPtr(const SQObjectPtr &o)\r
+ {\r
+ _type=o._type;\r
+ _unVal=o._unVal;\r
+ __AddRef(_type,_unVal);\r
+ }\r
+ SQObjectPtr(const SQObject &o)\r
+ {\r
+ _type=o._type;\r
+ _unVal=o._unVal;\r
+ __AddRef(_type,_unVal);\r
+ }\r
+ SQObjectPtr(SQTable *pTable)\r
+ {\r
+ _type=OT_TABLE;\r
+ _unVal.pTable=pTable;\r
+ assert(_unVal.pTable);\r
+ __AddRef(_type,_unVal);\r
+ }\r
+ SQObjectPtr(SQClass *pClass)\r
+ {\r
+ _type=OT_CLASS;\r
+ _unVal.pClass=pClass;\r
+ assert(_unVal.pClass);\r
+ __AddRef(_type,_unVal);\r
+ }\r
+ SQObjectPtr(SQInstance *pInstance)\r
+ {\r
+ _type=OT_INSTANCE;\r
+ _unVal.pInstance=pInstance;\r
+ assert(_unVal.pInstance);\r
+ __AddRef(_type,_unVal);\r
+ }\r
+ SQObjectPtr(SQArray *pArray)\r
+ {\r
+ _type=OT_ARRAY;\r
+ _unVal.pArray=pArray;\r
+ assert(_unVal.pArray);\r
+ __AddRef(_type,_unVal);\r
+ }\r
+ SQObjectPtr(SQClosure *pClosure)\r
+ {\r
+ _type=OT_CLOSURE;\r
+ _unVal.pClosure=pClosure;\r
+ assert(_unVal.pClosure);\r
+ __AddRef(_type,_unVal);\r
+ }\r
+ SQObjectPtr(SQGenerator *pGenerator)\r
+ {\r
+ _type=OT_GENERATOR;\r
+ _unVal.pGenerator=pGenerator;\r
+ assert(_unVal.pGenerator);\r
+ __AddRef(_type,_unVal);\r
+ }\r
+ SQObjectPtr(SQNativeClosure *pNativeClosure)\r
+ {\r
+ _type=OT_NATIVECLOSURE;\r
+ _unVal.pNativeClosure=pNativeClosure;\r
+ assert(_unVal.pNativeClosure);\r
+ __AddRef(_type,_unVal);\r
+ }\r
+ SQObjectPtr(SQString *pString)\r
+ {\r
+ _type=OT_STRING;\r
+ _unVal.pString=pString;\r
+ assert(_unVal.pString);\r
+ __AddRef(_type,_unVal);\r
+ }\r
+ SQObjectPtr(SQUserData *pUserData)\r
+ {\r
+ _type=OT_USERDATA;\r
+ _unVal.pUserData=pUserData;\r
+ assert(_unVal.pUserData);\r
+ __AddRef(_type,_unVal);\r
+ }\r
+ SQObjectPtr(SQVM *pThread)\r
+ {\r
+ _type=OT_THREAD;\r
+ _unVal.pThread=pThread;\r
+ assert(_unVal.pThread);\r
+ __AddRef(_type,_unVal);\r
+ }\r
+ SQObjectPtr(SQWeakRef *pWeakRef)\r
+ {\r
+ _type=OT_WEAKREF;\r
+ _unVal.pWeakRef=pWeakRef;\r
+ assert(_unVal.pWeakRef);\r
+ __AddRef(_type,_unVal);\r
+ }\r
+ SQObjectPtr(SQFunctionProto *pFunctionProto)\r
+ {\r
+ _type=OT_FUNCPROTO;\r
+ _unVal.pFunctionProto=pFunctionProto;\r
+ assert(_unVal.pFunctionProto);\r
+ __AddRef(_type,_unVal);\r
+ }\r
+ SQObjectPtr(SQInteger nInteger)\r
+ {\r
+ _unVal.pUserPointer=NULL;\r
+ _type=OT_INTEGER;\r
+ _unVal.nInteger=nInteger;\r
+ }\r
+ SQObjectPtr(SQFloat fFloat)\r
+ {\r
+ _unVal.pUserPointer=NULL;\r
+ _type=OT_FLOAT;\r
+ _unVal.fFloat=fFloat;\r
+ }\r
+ SQObjectPtr(bool bBool)\r
+ {\r
+ _unVal.pUserPointer=NULL;\r
+ _type = OT_BOOL;\r
+ _unVal.nInteger = bBool?1:0;\r
+ }\r
+ SQObjectPtr(SQUserPointer pUserPointer)\r
+ {\r
+ _type=OT_USERPOINTER;\r
+ _unVal.pUserPointer=pUserPointer;\r
+ }\r
+ ~SQObjectPtr()\r
+ {\r
+ __Release(_type,_unVal);\r
+ }\r
+ inline void Null()\r
+ {\r
+ __Release(_type,_unVal);\r
+ _type=OT_NULL;\r
+ _unVal.pUserPointer=NULL;\r
+ }\r
+ inline SQObjectPtr& operator=(const SQObjectPtr& obj)\r
+ { \r
+ SQObjectType tOldType;\r
+ SQObjectValue unOldVal;\r
+ tOldType=_type;\r
+ unOldVal=_unVal;\r
+ _unVal = obj._unVal;\r
+ _type = obj._type;\r
+ __AddRef(_type,_unVal);\r
+ __Release(tOldType,unOldVal);\r
+ return *this;\r
+ }\r
+ inline SQObjectPtr& operator=(const SQObject& obj)\r
+ { \r
+ SQObjectType tOldType;\r
+ SQObjectValue unOldVal;\r
+ tOldType=_type;\r
+ unOldVal=_unVal;\r
+ _unVal = obj._unVal;\r
+ _type = obj._type;\r
+ __AddRef(_type,_unVal);\r
+ __Release(tOldType,unOldVal);\r
+ return *this;\r
+ }\r
+ private:\r
+ SQObjectPtr(const SQChar *){} //safety\r
+};\r
+/////////////////////////////////////////////////////////////////////////////////////\r
+#ifndef NO_GARBAGE_COLLECTOR\r
+#define MARK_FLAG 0x80000000\r
+struct SQCollectable : public SQRefCounted {\r
+ SQCollectable *_next;\r
+ SQCollectable *_prev;\r
+ SQSharedState *_sharedstate;\r
+ virtual void Release()=0;\r
+ virtual void Mark(SQCollectable **chain)=0;\r
+ void UnMark();\r
+ virtual void Finalize()=0;\r
+ static void AddToChain(SQCollectable **chain,SQCollectable *c);\r
+ static void RemoveFromChain(SQCollectable **chain,SQCollectable *c);\r
+};\r
+\r
+\r
+#define ADD_TO_CHAIN(chain,obj) AddToChain(chain,obj)\r
+#define REMOVE_FROM_CHAIN(chain,obj) {if(!(_uiRef&MARK_FLAG))RemoveFromChain(chain,obj);}\r
+#define CHAINABLE_OBJ SQCollectable\r
+#define INIT_CHAIN() {_next=NULL;_prev=NULL;_sharedstate=ss;}\r
+#else\r
+\r
+#define ADD_TO_CHAIN(chain,obj) ((void)0)\r
+#define REMOVE_FROM_CHAIN(chain,obj) ((void)0)\r
+#define CHAINABLE_OBJ SQRefCounted\r
+#define INIT_CHAIN() ((void)0)\r
+#endif\r
+\r
+struct SQDelegable : public CHAINABLE_OBJ {\r
+ bool SetDelegate(SQTable *m);\r
+ virtual bool GetMetaMethod(SQVM *v,SQMetaMethod mm,SQObjectPtr &res);\r
+ SQTable *_delegate;\r
+};\r
+\r
+SQUnsignedInteger TranslateIndex(const SQObjectPtr &idx);\r
+typedef sqvector<SQObjectPtr> SQObjectPtrVec;\r
+typedef sqvector<SQInteger> SQIntVec;\r
+\r
+\r
+#endif //_SQOBJECT_H_\r