1 /* see copyright notice in squirrel.h */
\r
7 #define SQ_CLOSURESTREAM_HEAD (('S'<<24)|('Q'<<16)|('I'<<8)|('R'))
\r
8 #define SQ_CLOSURESTREAM_PART (('P'<<24)|('A'<<16)|('R'<<8)|('T'))
\r
9 #define SQ_CLOSURESTREAM_TAIL (('T'<<24)|('A'<<16)|('I'<<8)|('L'))
\r
11 struct SQSharedState;
\r
35 #define MM_ADD _SC("_add")
\r
36 #define MM_SUB _SC("_sub")
\r
37 #define MM_MUL _SC("_mul")
\r
38 #define MM_DIV _SC("_div")
\r
39 #define MM_UNM _SC("_unm")
\r
40 #define MM_MODULO _SC("_modulo")
\r
41 #define MM_SET _SC("_set")
\r
42 #define MM_GET _SC("_get")
\r
43 #define MM_TYPEOF _SC("_typeof")
\r
44 #define MM_NEXTI _SC("_nexti")
\r
45 #define MM_CMP _SC("_cmp")
\r
46 #define MM_CALL _SC("_call")
\r
47 #define MM_CLONED _SC("_cloned")
\r
48 #define MM_NEWSLOT _SC("_newslot")
\r
49 #define MM_DELSLOT _SC("_delslot")
\r
50 #define MM_TOSTRING _SC("_tostring")
\r
51 #define MM_NEWMEMBER _SC("_newmember")
\r
52 #define MM_INHERITED _SC("_inherited")
\r
58 SQRefCounted() { _uiRef = 0; _weakref = NULL; }
\r
59 virtual ~SQRefCounted();
\r
60 SQWeakRef *GetWeakRef(SQObjectType type);
\r
61 SQUnsignedInteger _uiRef;
\r
62 struct SQWeakRef *_weakref;
\r
63 virtual void Release()=0;
\r
66 struct SQWeakRef : SQRefCounted
\r
72 #define _realval(o) (type((o)) != OT_WEAKREF?(SQObject)o:_weakref(o)->_obj)
\r
76 #define __AddRef(type,unval) if(ISREFCOUNTED(type)) \
\r
78 unval.pRefCounted->_uiRef++; \
\r
81 #define __Release(type,unval) if(ISREFCOUNTED(type) && ((--unval.pRefCounted->_uiRef)<=0)) \
\r
83 unval.pRefCounted->Release(); \
\r
86 #define __ObjRelease(obj) { \
\r
89 if((obj)->_uiRef == 0) \
\r
95 #define __ObjAddRef(obj) { \
\r
99 #define type(obj) ((obj)._type)
\r
100 #define is_delegable(t) (type(t)&SQOBJECT_DELEGABLE)
\r
101 #define raw_type(obj) _RAW_TYPE((obj)._type)
\r
103 #define _integer(obj) ((obj)._unVal.nInteger)
\r
104 #define _float(obj) ((obj)._unVal.fFloat)
\r
105 #define _string(obj) ((obj)._unVal.pString)
\r
106 #define _table(obj) ((obj)._unVal.pTable)
\r
107 #define _array(obj) ((obj)._unVal.pArray)
\r
108 #define _closure(obj) ((obj)._unVal.pClosure)
\r
109 #define _generator(obj) ((obj)._unVal.pGenerator)
\r
110 #define _nativeclosure(obj) ((obj)._unVal.pNativeClosure)
\r
111 #define _userdata(obj) ((obj)._unVal.pUserData)
\r
112 #define _userpointer(obj) ((obj)._unVal.pUserPointer)
\r
113 #define _thread(obj) ((obj)._unVal.pThread)
\r
114 #define _funcproto(obj) ((obj)._unVal.pFunctionProto)
\r
115 #define _class(obj) ((obj)._unVal.pClass)
\r
116 #define _instance(obj) ((obj)._unVal.pInstance)
\r
117 #define _delegable(obj) ((SQDelegable *)(obj)._unVal.pDelegable)
\r
118 #define _weakref(obj) ((obj)._unVal.pWeakRef)
\r
119 #define _refcounted(obj) ((obj)._unVal.pRefCounted)
\r
120 #define _rawval(obj) ((obj)._unVal.pRefCounted)
\r
122 #define _stringval(obj) (obj)._unVal.pString->_val
\r
123 #define _userdataval(obj) (obj)._unVal.pUserData->_val
\r
125 #define tofloat(num) ((type(num)==OT_INTEGER)?(SQFloat)_integer(num):_float(num))
\r
126 #define tointeger(num) ((type(num)==OT_FLOAT)?(SQInteger)_float(num):_integer(num))
\r
127 /////////////////////////////////////////////////////////////////////////////////////
\r
128 /////////////////////////////////////////////////////////////////////////////////////
\r
129 struct SQObjectPtr : public SQObject
\r
134 _unVal.pUserPointer=NULL;
\r
136 SQObjectPtr(const SQObjectPtr &o)
\r
140 __AddRef(_type,_unVal);
\r
142 SQObjectPtr(const SQObject &o)
\r
146 __AddRef(_type,_unVal);
\r
148 SQObjectPtr(SQTable *pTable)
\r
151 _unVal.pTable=pTable;
\r
152 assert(_unVal.pTable);
\r
153 __AddRef(_type,_unVal);
\r
155 SQObjectPtr(SQClass *pClass)
\r
158 _unVal.pClass=pClass;
\r
159 assert(_unVal.pClass);
\r
160 __AddRef(_type,_unVal);
\r
162 SQObjectPtr(SQInstance *pInstance)
\r
165 _unVal.pInstance=pInstance;
\r
166 assert(_unVal.pInstance);
\r
167 __AddRef(_type,_unVal);
\r
169 SQObjectPtr(SQArray *pArray)
\r
172 _unVal.pArray=pArray;
\r
173 assert(_unVal.pArray);
\r
174 __AddRef(_type,_unVal);
\r
176 SQObjectPtr(SQClosure *pClosure)
\r
179 _unVal.pClosure=pClosure;
\r
180 assert(_unVal.pClosure);
\r
181 __AddRef(_type,_unVal);
\r
183 SQObjectPtr(SQGenerator *pGenerator)
\r
185 _type=OT_GENERATOR;
\r
186 _unVal.pGenerator=pGenerator;
\r
187 assert(_unVal.pGenerator);
\r
188 __AddRef(_type,_unVal);
\r
190 SQObjectPtr(SQNativeClosure *pNativeClosure)
\r
192 _type=OT_NATIVECLOSURE;
\r
193 _unVal.pNativeClosure=pNativeClosure;
\r
194 assert(_unVal.pNativeClosure);
\r
195 __AddRef(_type,_unVal);
\r
197 SQObjectPtr(SQString *pString)
\r
200 _unVal.pString=pString;
\r
201 assert(_unVal.pString);
\r
202 __AddRef(_type,_unVal);
\r
204 SQObjectPtr(SQUserData *pUserData)
\r
207 _unVal.pUserData=pUserData;
\r
208 assert(_unVal.pUserData);
\r
209 __AddRef(_type,_unVal);
\r
211 SQObjectPtr(SQVM *pThread)
\r
214 _unVal.pThread=pThread;
\r
215 assert(_unVal.pThread);
\r
216 __AddRef(_type,_unVal);
\r
218 SQObjectPtr(SQWeakRef *pWeakRef)
\r
221 _unVal.pWeakRef=pWeakRef;
\r
222 assert(_unVal.pWeakRef);
\r
223 __AddRef(_type,_unVal);
\r
225 SQObjectPtr(SQFunctionProto *pFunctionProto)
\r
227 _type=OT_FUNCPROTO;
\r
228 _unVal.pFunctionProto=pFunctionProto;
\r
229 assert(_unVal.pFunctionProto);
\r
230 __AddRef(_type,_unVal);
\r
232 SQObjectPtr(SQInteger nInteger)
\r
234 _unVal.pUserPointer=NULL;
\r
236 _unVal.nInteger=nInteger;
\r
238 SQObjectPtr(SQFloat fFloat)
\r
240 _unVal.pUserPointer=NULL;
\r
242 _unVal.fFloat=fFloat;
\r
244 SQObjectPtr(bool bBool)
\r
246 _unVal.pUserPointer=NULL;
\r
248 _unVal.nInteger = bBool?1:0;
\r
250 SQObjectPtr(SQUserPointer pUserPointer)
\r
252 _type=OT_USERPOINTER;
\r
253 _unVal.pUserPointer=pUserPointer;
\r
257 __Release(_type,_unVal);
\r
261 __Release(_type,_unVal);
\r
263 _unVal.pUserPointer=NULL;
\r
265 inline SQObjectPtr& operator=(const SQObjectPtr& obj)
\r
267 SQObjectType tOldType;
\r
268 SQObjectValue unOldVal;
\r
271 _unVal = obj._unVal;
\r
273 __AddRef(_type,_unVal);
\r
274 __Release(tOldType,unOldVal);
\r
277 inline SQObjectPtr& operator=(const SQObject& obj)
\r
279 SQObjectType tOldType;
\r
280 SQObjectValue unOldVal;
\r
283 _unVal = obj._unVal;
\r
285 __AddRef(_type,_unVal);
\r
286 __Release(tOldType,unOldVal);
\r
290 SQObjectPtr(const SQChar *){} //safety
\r
292 /////////////////////////////////////////////////////////////////////////////////////
\r
293 #ifndef NO_GARBAGE_COLLECTOR
\r
294 #define MARK_FLAG 0x80000000
\r
295 struct SQCollectable : public SQRefCounted {
\r
296 SQCollectable *_next;
\r
297 SQCollectable *_prev;
\r
298 SQSharedState *_sharedstate;
\r
299 virtual void Release()=0;
\r
300 virtual void Mark(SQCollectable **chain)=0;
\r
302 virtual void Finalize()=0;
\r
303 static void AddToChain(SQCollectable **chain,SQCollectable *c);
\r
304 static void RemoveFromChain(SQCollectable **chain,SQCollectable *c);
\r
308 #define ADD_TO_CHAIN(chain,obj) AddToChain(chain,obj)
\r
309 #define REMOVE_FROM_CHAIN(chain,obj) {if(!(_uiRef&MARK_FLAG))RemoveFromChain(chain,obj);}
\r
310 #define CHAINABLE_OBJ SQCollectable
\r
311 #define INIT_CHAIN() {_next=NULL;_prev=NULL;_sharedstate=ss;}
\r
314 #define ADD_TO_CHAIN(chain,obj) ((void)0)
\r
315 #define REMOVE_FROM_CHAIN(chain,obj) ((void)0)
\r
316 #define CHAINABLE_OBJ SQRefCounted
\r
317 #define INIT_CHAIN() ((void)0)
\r
320 struct SQDelegable : public CHAINABLE_OBJ {
\r
321 bool SetDelegate(SQTable *m);
\r
322 virtual bool GetMetaMethod(SQVM *v,SQMetaMethod mm,SQObjectPtr &res);
\r
323 SQTable *_delegate;
\r
326 SQUnsignedInteger TranslateIndex(const SQObjectPtr &idx);
\r
327 typedef sqvector<SQObjectPtr> SQObjectPtrVec;
\r
328 typedef sqvector<SQInteger> SQIntVec;
\r
331 #endif //_SQOBJECT_H_
\r