1 /* see copyright notice in squirrel.h */
7 #define SQ_CLOSURESTREAM_HEAD (('S'<<24)|('Q'<<16)|('I'<<8)|('R'))
8 #define SQ_CLOSURESTREAM_PART (('P'<<24)|('A'<<16)|('R'<<8)|('T'))
9 #define SQ_CLOSURESTREAM_TAIL (('T'<<24)|('A'<<16)|('I'<<8)|('L'))
35 #define MM_ADD _SC("_add")
36 #define MM_SUB _SC("_sub")
37 #define MM_MUL _SC("_mul")
38 #define MM_DIV _SC("_div")
39 #define MM_UNM _SC("_unm")
40 #define MM_MODULO _SC("_modulo")
41 #define MM_SET _SC("_set")
42 #define MM_GET _SC("_get")
43 #define MM_TYPEOF _SC("_typeof")
44 #define MM_NEXTI _SC("_nexti")
45 #define MM_CMP _SC("_cmp")
46 #define MM_CALL _SC("_call")
47 #define MM_CLONED _SC("_cloned")
48 #define MM_NEWSLOT _SC("_newslot")
49 #define MM_DELSLOT _SC("_delslot")
50 #define MM_TOSTRING _SC("_tostring")
51 #define MM_NEWMEMBER _SC("_newmember")
52 #define MM_INHERITED _SC("_inherited")
58 SQRefCounted() { _uiRef = 0; _weakref = NULL; }
59 virtual ~SQRefCounted();
60 SQWeakRef *GetWeakRef(SQObjectType type);
61 SQUnsignedInteger _uiRef;
62 struct SQWeakRef *_weakref;
63 virtual void Release()=0;
66 struct SQWeakRef : SQRefCounted
72 #define _realval(o) (type((o)) != OT_WEAKREF?(SQObject)o:_weakref(o)->_obj)
76 #define __AddRef(type,unval) if(ISREFCOUNTED(type)) \
78 unval.pRefCounted->_uiRef++; \
81 #define __Release(type,unval) if(ISREFCOUNTED(type) && ((--unval.pRefCounted->_uiRef)<=0)) \
83 unval.pRefCounted->Release(); \
86 #define __ObjRelease(obj) { \
89 if((obj)->_uiRef == 0) \
95 #define __ObjAddRef(obj) { \
99 #define type(obj) ((obj)._type)
100 #define is_delegable(t) (type(t)&SQOBJECT_DELEGABLE)
101 #define raw_type(obj) _RAW_TYPE((obj)._type)
103 #define _integer(obj) ((obj)._unVal.nInteger)
104 #define _float(obj) ((obj)._unVal.fFloat)
105 #define _string(obj) ((obj)._unVal.pString)
106 #define _table(obj) ((obj)._unVal.pTable)
107 #define _array(obj) ((obj)._unVal.pArray)
108 #define _closure(obj) ((obj)._unVal.pClosure)
109 #define _generator(obj) ((obj)._unVal.pGenerator)
110 #define _nativeclosure(obj) ((obj)._unVal.pNativeClosure)
111 #define _userdata(obj) ((obj)._unVal.pUserData)
112 #define _userpointer(obj) ((obj)._unVal.pUserPointer)
113 #define _thread(obj) ((obj)._unVal.pThread)
114 #define _funcproto(obj) ((obj)._unVal.pFunctionProto)
115 #define _class(obj) ((obj)._unVal.pClass)
116 #define _instance(obj) ((obj)._unVal.pInstance)
117 #define _delegable(obj) ((SQDelegable *)(obj)._unVal.pDelegable)
118 #define _weakref(obj) ((obj)._unVal.pWeakRef)
119 #define _refcounted(obj) ((obj)._unVal.pRefCounted)
120 #define _rawval(obj) ((obj)._unVal.raw)
122 #define _stringval(obj) (obj)._unVal.pString->_val
123 #define _userdataval(obj) (obj)._unVal.pUserData->_val
125 #define tofloat(num) ((type(num)==OT_INTEGER)?(SQFloat)_integer(num):_float(num))
126 #define tointeger(num) ((type(num)==OT_FLOAT)?(SQInteger)_float(num):_integer(num))
127 /////////////////////////////////////////////////////////////////////////////////////
128 /////////////////////////////////////////////////////////////////////////////////////
129 struct SQObjectPtr : public SQObject
135 _unVal.pUserPointer=NULL;
137 SQObjectPtr(const SQObjectPtr &o)
142 __AddRef(_type,_unVal);
144 SQObjectPtr(const SQObject &o)
149 __AddRef(_type,_unVal);
151 SQObjectPtr(SQTable *pTable)
155 _unVal.pTable=pTable;
156 assert(_unVal.pTable);
157 __AddRef(_type,_unVal);
159 SQObjectPtr(SQClass *pClass)
163 _unVal.pClass=pClass;
164 assert(_unVal.pClass);
165 __AddRef(_type,_unVal);
167 SQObjectPtr(SQInstance *pInstance)
171 _unVal.pInstance=pInstance;
172 assert(_unVal.pInstance);
173 __AddRef(_type,_unVal);
175 SQObjectPtr(SQArray *pArray)
179 _unVal.pArray=pArray;
180 assert(_unVal.pArray);
181 __AddRef(_type,_unVal);
183 SQObjectPtr(SQClosure *pClosure)
187 _unVal.pClosure=pClosure;
188 assert(_unVal.pClosure);
189 __AddRef(_type,_unVal);
191 SQObjectPtr(SQGenerator *pGenerator)
195 _unVal.pGenerator=pGenerator;
196 assert(_unVal.pGenerator);
197 __AddRef(_type,_unVal);
199 SQObjectPtr(SQNativeClosure *pNativeClosure)
202 _type=OT_NATIVECLOSURE;
203 _unVal.pNativeClosure=pNativeClosure;
204 assert(_unVal.pNativeClosure);
205 __AddRef(_type,_unVal);
207 SQObjectPtr(SQString *pString)
211 _unVal.pString=pString;
212 assert(_unVal.pString);
213 __AddRef(_type,_unVal);
215 SQObjectPtr(SQUserData *pUserData)
219 _unVal.pUserData=pUserData;
220 assert(_unVal.pUserData);
221 __AddRef(_type,_unVal);
223 SQObjectPtr(SQVM *pThread)
227 _unVal.pThread=pThread;
228 assert(_unVal.pThread);
229 __AddRef(_type,_unVal);
231 SQObjectPtr(SQWeakRef *pWeakRef)
235 _unVal.pWeakRef=pWeakRef;
236 assert(_unVal.pWeakRef);
237 __AddRef(_type,_unVal);
239 SQObjectPtr(SQFunctionProto *pFunctionProto)
243 _unVal.pFunctionProto=pFunctionProto;
244 assert(_unVal.pFunctionProto);
245 __AddRef(_type,_unVal);
247 SQObjectPtr(SQInteger nInteger)
251 _unVal.nInteger=nInteger;
253 SQObjectPtr(SQFloat fFloat)
257 _unVal.fFloat=fFloat;
259 SQObjectPtr(bool bBool)
263 _unVal.nInteger = bBool?1:0;
265 SQObjectPtr(SQUserPointer pUserPointer)
268 _type=OT_USERPOINTER;
269 _unVal.pUserPointer=pUserPointer;
273 __Release(_type,_unVal);
277 SQObjectType tOldType;
278 SQObjectValue unOldVal;
282 _unVal.pUserPointer = NULL;
283 __Release(tOldType,unOldVal);
285 inline SQObjectPtr& operator=(SQInteger i)
287 __Release(_type,_unVal);
292 inline SQObjectPtr& operator=(SQFloat f)
294 __Release(_type,_unVal);
299 inline SQObjectPtr& operator=(const SQObjectPtr& obj)
301 SQObjectType tOldType;
302 SQObjectValue unOldVal;
307 __AddRef(_type,_unVal);
308 __Release(tOldType,unOldVal);
311 inline SQObjectPtr& operator=(const SQObject& obj)
313 SQObjectType tOldType;
314 SQObjectValue unOldVal;
319 __AddRef(_type,_unVal);
320 __Release(tOldType,unOldVal);
324 SQObjectPtr(const SQChar *){} //safety
326 /////////////////////////////////////////////////////////////////////////////////////
327 #ifndef NO_GARBAGE_COLLECTOR
328 #define MARK_FLAG 0x80000000
329 struct SQCollectable : public SQRefCounted {
330 SQCollectable *_next;
331 SQCollectable *_prev;
332 SQSharedState *_sharedstate;
333 virtual void Release()=0;
334 virtual void Mark(SQCollectable **chain)=0;
336 virtual void Finalize()=0;
337 static void AddToChain(SQCollectable **chain,SQCollectable *c);
338 static void RemoveFromChain(SQCollectable **chain,SQCollectable *c);
342 #define ADD_TO_CHAIN(chain,obj) AddToChain(chain,obj)
343 #define REMOVE_FROM_CHAIN(chain,obj) {if(!(_uiRef&MARK_FLAG))RemoveFromChain(chain,obj);}
344 #define CHAINABLE_OBJ SQCollectable
345 #define INIT_CHAIN() {_next=NULL;_prev=NULL;_sharedstate=ss;}
348 #define ADD_TO_CHAIN(chain,obj) ((void)0)
349 #define REMOVE_FROM_CHAIN(chain,obj) ((void)0)
350 #define CHAINABLE_OBJ SQRefCounted
351 #define INIT_CHAIN() ((void)0)
354 struct SQDelegable : public CHAINABLE_OBJ {
355 bool SetDelegate(SQTable *m);
356 virtual bool GetMetaMethod(SQVM *v,SQMetaMethod mm,SQObjectPtr &res);
360 SQUnsignedInteger TranslateIndex(const SQObjectPtr &idx);
361 typedef sqvector<SQObjectPtr> SQObjectPtrVec;
362 typedef sqvector<SQInteger> SQIntVec;
363 const SQChar *GetTypeName(const SQObjectPtr &obj1);
364 const SQChar *IdType2Name(SQObjectType type);
368 #endif //_SQOBJECT_H_