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.pRefCounted)
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
134 _unVal.pUserPointer=NULL;
136 SQObjectPtr(const SQObjectPtr &o)
140 __AddRef(_type,_unVal);
142 SQObjectPtr(const SQObject &o)
146 __AddRef(_type,_unVal);
148 SQObjectPtr(SQTable *pTable)
151 _unVal.pTable=pTable;
152 assert(_unVal.pTable);
153 __AddRef(_type,_unVal);
155 SQObjectPtr(SQClass *pClass)
158 _unVal.pClass=pClass;
159 assert(_unVal.pClass);
160 __AddRef(_type,_unVal);
162 SQObjectPtr(SQInstance *pInstance)
165 _unVal.pInstance=pInstance;
166 assert(_unVal.pInstance);
167 __AddRef(_type,_unVal);
169 SQObjectPtr(SQArray *pArray)
172 _unVal.pArray=pArray;
173 assert(_unVal.pArray);
174 __AddRef(_type,_unVal);
176 SQObjectPtr(SQClosure *pClosure)
179 _unVal.pClosure=pClosure;
180 assert(_unVal.pClosure);
181 __AddRef(_type,_unVal);
183 SQObjectPtr(SQGenerator *pGenerator)
186 _unVal.pGenerator=pGenerator;
187 assert(_unVal.pGenerator);
188 __AddRef(_type,_unVal);
190 SQObjectPtr(SQNativeClosure *pNativeClosure)
192 _type=OT_NATIVECLOSURE;
193 _unVal.pNativeClosure=pNativeClosure;
194 assert(_unVal.pNativeClosure);
195 __AddRef(_type,_unVal);
197 SQObjectPtr(SQString *pString)
200 _unVal.pString=pString;
201 assert(_unVal.pString);
202 __AddRef(_type,_unVal);
204 SQObjectPtr(SQUserData *pUserData)
207 _unVal.pUserData=pUserData;
208 assert(_unVal.pUserData);
209 __AddRef(_type,_unVal);
211 SQObjectPtr(SQVM *pThread)
214 _unVal.pThread=pThread;
215 assert(_unVal.pThread);
216 __AddRef(_type,_unVal);
218 SQObjectPtr(SQWeakRef *pWeakRef)
221 _unVal.pWeakRef=pWeakRef;
222 assert(_unVal.pWeakRef);
223 __AddRef(_type,_unVal);
225 SQObjectPtr(SQFunctionProto *pFunctionProto)
228 _unVal.pFunctionProto=pFunctionProto;
229 assert(_unVal.pFunctionProto);
230 __AddRef(_type,_unVal);
232 SQObjectPtr(SQInteger nInteger)
234 _unVal.pUserPointer=NULL;
236 _unVal.nInteger=nInteger;
238 SQObjectPtr(SQFloat fFloat)
240 _unVal.pUserPointer=NULL;
242 _unVal.fFloat=fFloat;
244 SQObjectPtr(bool bBool)
246 _unVal.pUserPointer=NULL;
248 _unVal.nInteger = bBool?1:0;
250 SQObjectPtr(SQUserPointer pUserPointer)
252 _type=OT_USERPOINTER;
253 _unVal.pUserPointer=pUserPointer;
257 __Release(_type,_unVal);
261 SQObjectType tOldType;
262 SQObjectValue unOldVal;
266 _unVal.pUserPointer = NULL;
267 __Release(tOldType,unOldVal);
269 inline SQObjectPtr& operator=(SQInteger i)
271 __Release(_type,_unVal);
276 inline SQObjectPtr& operator=(SQFloat f)
278 __Release(_type,_unVal);
283 inline SQObjectPtr& operator=(const SQObjectPtr& obj)
285 SQObjectType tOldType;
286 SQObjectValue unOldVal;
291 __AddRef(_type,_unVal);
292 __Release(tOldType,unOldVal);
295 inline SQObjectPtr& operator=(const SQObject& obj)
297 SQObjectType tOldType;
298 SQObjectValue unOldVal;
303 __AddRef(_type,_unVal);
304 __Release(tOldType,unOldVal);
308 SQObjectPtr(const SQChar *){} //safety
310 /////////////////////////////////////////////////////////////////////////////////////
311 #ifndef NO_GARBAGE_COLLECTOR
312 #define MARK_FLAG 0x80000000
313 struct SQCollectable : public SQRefCounted {
314 SQCollectable *_next;
315 SQCollectable *_prev;
316 SQSharedState *_sharedstate;
317 virtual void Release()=0;
318 virtual void Mark(SQCollectable **chain)=0;
320 virtual void Finalize()=0;
321 static void AddToChain(SQCollectable **chain,SQCollectable *c);
322 static void RemoveFromChain(SQCollectable **chain,SQCollectable *c);
326 #define ADD_TO_CHAIN(chain,obj) AddToChain(chain,obj)
327 #define REMOVE_FROM_CHAIN(chain,obj) {if(!(_uiRef&MARK_FLAG))RemoveFromChain(chain,obj);}
328 #define CHAINABLE_OBJ SQCollectable
329 #define INIT_CHAIN() {_next=NULL;_prev=NULL;_sharedstate=ss;}
332 #define ADD_TO_CHAIN(chain,obj) ((void)0)
333 #define REMOVE_FROM_CHAIN(chain,obj) ((void)0)
334 #define CHAINABLE_OBJ SQRefCounted
335 #define INIT_CHAIN() ((void)0)
338 struct SQDelegable : public CHAINABLE_OBJ {
339 bool SetDelegate(SQTable *m);
340 virtual bool GetMetaMethod(SQVM *v,SQMetaMethod mm,SQObjectPtr &res);
344 SQUnsignedInteger TranslateIndex(const SQObjectPtr &idx);
345 typedef sqvector<SQObjectPtr> SQObjectPtrVec;
346 typedef sqvector<SQInteger> SQIntVec;
349 #endif //_SQOBJECT_H_