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 __Release(_type,_unVal);
263 _unVal.pUserPointer=NULL;
265 inline SQObjectPtr& operator=(const SQObjectPtr& obj)
267 SQObjectType tOldType;
268 SQObjectValue unOldVal;
273 __AddRef(_type,_unVal);
274 __Release(tOldType,unOldVal);
277 inline SQObjectPtr& operator=(const SQObject& obj)
279 SQObjectType tOldType;
280 SQObjectValue unOldVal;
285 __AddRef(_type,_unVal);
286 __Release(tOldType,unOldVal);
290 SQObjectPtr(const SQChar *){} //safety
292 /////////////////////////////////////////////////////////////////////////////////////
293 #ifndef NO_GARBAGE_COLLECTOR
294 #define MARK_FLAG 0x80000000
295 struct SQCollectable : public SQRefCounted {
296 SQCollectable *_next;
297 SQCollectable *_prev;
298 SQSharedState *_sharedstate;
299 virtual void Release()=0;
300 virtual void Mark(SQCollectable **chain)=0;
302 virtual void Finalize()=0;
303 static void AddToChain(SQCollectable **chain,SQCollectable *c);
304 static void RemoveFromChain(SQCollectable **chain,SQCollectable *c);
308 #define ADD_TO_CHAIN(chain,obj) AddToChain(chain,obj)
309 #define REMOVE_FROM_CHAIN(chain,obj) {if(!(_uiRef&MARK_FLAG))RemoveFromChain(chain,obj);}
310 #define CHAINABLE_OBJ SQCollectable
311 #define INIT_CHAIN() {_next=NULL;_prev=NULL;_sharedstate=ss;}
314 #define ADD_TO_CHAIN(chain,obj) ((void)0)
315 #define REMOVE_FROM_CHAIN(chain,obj) ((void)0)
316 #define CHAINABLE_OBJ SQRefCounted
317 #define INIT_CHAIN() ((void)0)
320 struct SQDelegable : public CHAINABLE_OBJ {
321 bool SetDelegate(SQTable *m);
322 virtual bool GetMetaMethod(SQVM *v,SQMetaMethod mm,SQObjectPtr &res);
326 SQUnsignedInteger TranslateIndex(const SQObjectPtr &idx);
327 typedef sqvector<SQObjectPtr> SQObjectPtrVec;
328 typedef sqvector<SQInteger> SQIntVec;
331 #endif //_SQOBJECT_H_