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.raw)
\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
128 /////////////////////////////////////////////////////////////////////////////////////
\r
129 /////////////////////////////////////////////////////////////////////////////////////
\r
130 struct SQObjectPtr : public SQObject
\r
134 SQ_OBJECT_RAWINIT()
\r
136 _unVal.pUserPointer=NULL;
\r
138 SQObjectPtr(const SQObjectPtr &o)
\r
140 SQ_OBJECT_RAWINIT()
\r
143 __AddRef(_type,_unVal);
\r
145 SQObjectPtr(const SQObject &o)
\r
147 SQ_OBJECT_RAWINIT()
\r
150 __AddRef(_type,_unVal);
\r
152 SQObjectPtr(SQTable *pTable)
\r
154 SQ_OBJECT_RAWINIT()
\r
156 _unVal.pTable=pTable;
\r
157 assert(_unVal.pTable);
\r
158 __AddRef(_type,_unVal);
\r
160 SQObjectPtr(SQClass *pClass)
\r
162 SQ_OBJECT_RAWINIT()
\r
164 _unVal.pClass=pClass;
\r
165 assert(_unVal.pClass);
\r
166 __AddRef(_type,_unVal);
\r
168 SQObjectPtr(SQInstance *pInstance)
\r
170 SQ_OBJECT_RAWINIT()
\r
172 _unVal.pInstance=pInstance;
\r
173 assert(_unVal.pInstance);
\r
174 __AddRef(_type,_unVal);
\r
176 SQObjectPtr(SQArray *pArray)
\r
178 SQ_OBJECT_RAWINIT()
\r
180 _unVal.pArray=pArray;
\r
181 assert(_unVal.pArray);
\r
182 __AddRef(_type,_unVal);
\r
184 SQObjectPtr(SQClosure *pClosure)
\r
186 SQ_OBJECT_RAWINIT()
\r
188 _unVal.pClosure=pClosure;
\r
189 assert(_unVal.pClosure);
\r
190 __AddRef(_type,_unVal);
\r
192 SQObjectPtr(SQGenerator *pGenerator)
\r
194 SQ_OBJECT_RAWINIT()
\r
195 _type=OT_GENERATOR;
\r
196 _unVal.pGenerator=pGenerator;
\r
197 assert(_unVal.pGenerator);
\r
198 __AddRef(_type,_unVal);
\r
200 SQObjectPtr(SQNativeClosure *pNativeClosure)
\r
202 SQ_OBJECT_RAWINIT()
\r
203 _type=OT_NATIVECLOSURE;
\r
204 _unVal.pNativeClosure=pNativeClosure;
\r
205 assert(_unVal.pNativeClosure);
\r
206 __AddRef(_type,_unVal);
\r
208 SQObjectPtr(SQString *pString)
\r
210 SQ_OBJECT_RAWINIT()
\r
212 _unVal.pString=pString;
\r
213 assert(_unVal.pString);
\r
214 __AddRef(_type,_unVal);
\r
216 SQObjectPtr(SQUserData *pUserData)
\r
218 SQ_OBJECT_RAWINIT()
\r
220 _unVal.pUserData=pUserData;
\r
221 assert(_unVal.pUserData);
\r
222 __AddRef(_type,_unVal);
\r
224 SQObjectPtr(SQVM *pThread)
\r
226 SQ_OBJECT_RAWINIT()
\r
228 _unVal.pThread=pThread;
\r
229 assert(_unVal.pThread);
\r
230 __AddRef(_type,_unVal);
\r
232 SQObjectPtr(SQWeakRef *pWeakRef)
\r
234 SQ_OBJECT_RAWINIT()
\r
236 _unVal.pWeakRef=pWeakRef;
\r
237 assert(_unVal.pWeakRef);
\r
238 __AddRef(_type,_unVal);
\r
240 SQObjectPtr(SQFunctionProto *pFunctionProto)
\r
242 SQ_OBJECT_RAWINIT()
\r
243 _type=OT_FUNCPROTO;
\r
244 _unVal.pFunctionProto=pFunctionProto;
\r
245 assert(_unVal.pFunctionProto);
\r
246 __AddRef(_type,_unVal);
\r
248 SQObjectPtr(SQInteger nInteger)
\r
250 SQ_OBJECT_RAWINIT()
\r
252 _unVal.nInteger=nInteger;
\r
254 SQObjectPtr(SQFloat fFloat)
\r
256 SQ_OBJECT_RAWINIT()
\r
258 _unVal.fFloat=fFloat;
\r
260 SQObjectPtr(bool bBool)
\r
262 SQ_OBJECT_RAWINIT()
\r
264 _unVal.nInteger = bBool?1:0;
\r
266 SQObjectPtr(SQUserPointer pUserPointer)
\r
268 SQ_OBJECT_RAWINIT()
\r
269 _type=OT_USERPOINTER;
\r
270 _unVal.pUserPointer=pUserPointer;
\r
274 __Release(_type,_unVal);
\r
278 SQObjectType tOldType;
\r
279 SQObjectValue unOldVal;
\r
283 _unVal.pUserPointer = NULL;
\r
284 __Release(tOldType,unOldVal);
\r
286 inline SQObjectPtr& operator=(SQInteger i)
\r
288 __Release(_type,_unVal);
\r
289 SQ_OBJECT_RAWINIT()
\r
290 _unVal.nInteger = i;
\r
291 _type = OT_INTEGER;
\r
294 inline SQObjectPtr& operator=(SQFloat f)
\r
296 __Release(_type,_unVal);
\r
297 SQ_OBJECT_RAWINIT()
\r
302 inline SQObjectPtr& operator=(const SQObjectPtr& obj)
\r
304 SQObjectType tOldType;
\r
305 SQObjectValue unOldVal;
\r
308 _unVal = obj._unVal;
\r
310 __AddRef(_type,_unVal);
\r
311 __Release(tOldType,unOldVal);
\r
314 inline SQObjectPtr& operator=(const SQObject& obj)
\r
316 SQObjectType tOldType;
\r
317 SQObjectValue unOldVal;
\r
320 _unVal = obj._unVal;
\r
322 __AddRef(_type,_unVal);
\r
323 __Release(tOldType,unOldVal);
\r
327 SQObjectPtr(const SQChar *){} //safety
\r
330 inline void _Swap(SQObject &a,SQObject &b)
\r
332 SQObjectType tOldType = a._type;
\r
333 SQObjectValue unOldVal = a._unVal;
\r
335 a._unVal = b._unVal;
\r
336 b._type = tOldType;
\r
337 b._unVal = unOldVal;
\r
339 /////////////////////////////////////////////////////////////////////////////////////
\r
340 #ifndef NO_GARBAGE_COLLECTOR
\r
341 #define MARK_FLAG 0x80000000
\r
342 struct SQCollectable : public SQRefCounted {
\r
343 SQCollectable *_next;
\r
344 SQCollectable *_prev;
\r
345 SQSharedState *_sharedstate;
\r
346 virtual void Release()=0;
\r
347 virtual void Mark(SQCollectable **chain)=0;
\r
349 virtual void Finalize()=0;
\r
350 static void AddToChain(SQCollectable **chain,SQCollectable *c);
\r
351 static void RemoveFromChain(SQCollectable **chain,SQCollectable *c);
\r
355 #define ADD_TO_CHAIN(chain,obj) AddToChain(chain,obj)
\r
356 #define REMOVE_FROM_CHAIN(chain,obj) {if(!(_uiRef&MARK_FLAG))RemoveFromChain(chain,obj);}
\r
357 #define CHAINABLE_OBJ SQCollectable
\r
358 #define INIT_CHAIN() {_next=NULL;_prev=NULL;_sharedstate=ss;}
\r
361 #define ADD_TO_CHAIN(chain,obj) ((void)0)
\r
362 #define REMOVE_FROM_CHAIN(chain,obj) ((void)0)
\r
363 #define CHAINABLE_OBJ SQRefCounted
\r
364 #define INIT_CHAIN() ((void)0)
\r
367 struct SQDelegable : public CHAINABLE_OBJ {
\r
368 bool SetDelegate(SQTable *m);
\r
369 virtual bool GetMetaMethod(SQVM *v,SQMetaMethod mm,SQObjectPtr &res);
\r
370 SQTable *_delegate;
\r
373 SQUnsignedInteger TranslateIndex(const SQObjectPtr &idx);
\r
374 typedef sqvector<SQObjectPtr> SQObjectPtrVec;
\r
375 typedef sqvector<SQInteger> SQIntVec;
\r
376 const SQChar *GetTypeName(const SQObjectPtr &obj1);
\r
377 const SQChar *IdType2Name(SQObjectType type);
\r
381 #endif //_SQOBJECT_H_
\r