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'))
12 #define SQ_CATCH(type, ex) catch(type &ex)
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")
55 virtual ~SQRefCounted()
58 virtual void Release()=0;
63 #define __AddRef(type,unval) if(ISREFCOUNTED(type)) \
65 unval.pRefCounted->_uiRef++; \
68 #define __Release(type,unval) if(ISREFCOUNTED(type) && ((--unval.pRefCounted->_uiRef)<=0)) \
70 unval.pRefCounted->Release(); \
73 #define __ObjRelease(obj) { \
76 if((obj)->_uiRef == 0) \
82 #define __ObjAddRef(obj) { \
86 #define type(obj) ((obj)._type)
87 #define is_delegable(t) (type(t)&SQOBJECT_DELEGABLE)
88 #define raw_type(obj) _RAW_TYPE((obj)._type)
90 #define _integer(obj) ((obj)._unVal.nInteger)
91 #define _float(obj) ((obj)._unVal.fFloat)
92 #define _string(obj) ((obj)._unVal.pString)
93 #define _table(obj) ((obj)._unVal.pTable)
94 #define _array(obj) ((obj)._unVal.pArray)
95 #define _closure(obj) ((obj)._unVal.pClosure)
96 #define _generator(obj) ((obj)._unVal.pGenerator)
97 #define _nativeclosure(obj) ((obj)._unVal.pNativeClosure)
98 #define _userdata(obj) ((obj)._unVal.pUserData)
99 #define _userpointer(obj) ((obj)._unVal.pUserPointer)
100 #define _thread(obj) ((obj)._unVal.pThread)
101 #define _funcproto(obj) ((obj)._unVal.pFunctionProto)
102 #define _class(obj) ((obj)._unVal.pClass)
103 #define _instance(obj) ((obj)._unVal.pInstance)
104 #define _delegable(obj) ((SQDelegable *)(obj)._unVal.pDelegable)
105 #define _rawval(obj) ((obj)._unVal.pRefCounted)
107 #define _stringval(obj) (obj)._unVal.pString->_val
108 #define _userdataval(obj) (obj)._unVal.pUserData->_val
110 #define tofloat(num) ((type(num)==OT_INTEGER)?(SQFloat)_integer(num):_float(num))
111 #define tointeger(num) ((type(num)==OT_FLOAT)?(SQInteger)_float(num):_integer(num))
112 /////////////////////////////////////////////////////////////////////////////////////
113 /////////////////////////////////////////////////////////////////////////////////////
114 struct SQObjectPtr : public SQObject
119 _unVal.pUserPointer=NULL;
121 SQObjectPtr(const SQObjectPtr &o)
125 __AddRef(_type,_unVal);
127 SQObjectPtr(const SQObject &o)
131 __AddRef(_type,_unVal);
133 SQObjectPtr(SQTable *pTable)
136 _unVal.pTable=pTable;
137 assert(_unVal.pTable);
138 __AddRef(_type,_unVal);
140 SQObjectPtr(SQClass *pClass)
143 _unVal.pClass=pClass;
144 assert(_unVal.pClass);
145 __AddRef(_type,_unVal);
147 SQObjectPtr(SQInstance *pInstance)
150 _unVal.pInstance=pInstance;
151 assert(_unVal.pInstance);
152 __AddRef(_type,_unVal);
154 SQObjectPtr(SQArray *pArray)
157 _unVal.pArray=pArray;
158 assert(_unVal.pArray);
159 __AddRef(_type,_unVal);
161 SQObjectPtr(SQClosure *pClosure)
164 _unVal.pClosure=pClosure;
165 assert(_unVal.pClosure);
166 __AddRef(_type,_unVal);
168 SQObjectPtr(SQGenerator *pGenerator)
171 _unVal.pGenerator=pGenerator;
172 assert(_unVal.pGenerator);
173 __AddRef(_type,_unVal);
175 SQObjectPtr(SQNativeClosure *pNativeClosure)
177 _type=OT_NATIVECLOSURE;
178 _unVal.pNativeClosure=pNativeClosure;
179 assert(_unVal.pNativeClosure);
180 __AddRef(_type,_unVal);
182 SQObjectPtr(SQString *pString)
185 _unVal.pString=pString;
186 assert(_unVal.pString);
187 __AddRef(_type,_unVal);
189 SQObjectPtr(SQUserData *pUserData)
192 _unVal.pUserData=pUserData;
193 assert(_unVal.pUserData);
194 __AddRef(_type,_unVal);
196 SQObjectPtr(SQVM *pThread)
199 _unVal.pThread=pThread;
200 assert(_unVal.pThread);
201 __AddRef(_type,_unVal);
203 SQObjectPtr(SQFunctionProto *pFunctionProto)
206 _unVal.pFunctionProto=pFunctionProto;
207 assert(_unVal.pFunctionProto);
208 __AddRef(_type,_unVal);
210 SQObjectPtr(SQInteger nInteger)
213 _unVal.nInteger=nInteger;
215 SQObjectPtr(SQFloat fFloat)
218 _unVal.fFloat=fFloat;
220 SQObjectPtr(bool bBool)
223 _unVal.nInteger = bBool?1:0;
225 SQObjectPtr(SQUserPointer pUserPointer)
227 _type=OT_USERPOINTER;
228 _unVal.pUserPointer=pUserPointer;
232 __Release(_type,_unVal);
236 __Release(_type,_unVal);
238 _unVal.pUserPointer=NULL;
240 SQObjectPtr& operator=(const SQObjectPtr& obj)
242 SQObjectType tOldType;
243 SQObjectValue unOldVal;
248 __AddRef(_type,_unVal);
249 __Release(tOldType,unOldVal);
252 SQObjectPtr& operator=(const SQObject& obj)
254 SQObjectType tOldType;
255 SQObjectValue unOldVal;
260 __AddRef(_type,_unVal);
261 __Release(tOldType,unOldVal);
265 SQObjectPtr(const SQChar *){} //safety
267 /////////////////////////////////////////////////////////////////////////////////////
268 #ifndef NO_GARBAGE_COLLECTOR
269 #define MARK_FLAG 0x80000000
270 struct SQCollectable : public SQRefCounted {
271 SQCollectable *_next;
272 SQCollectable *_prev;
273 SQSharedState *_sharedstate;
274 virtual void Release()=0;
275 virtual void Mark(SQCollectable **chain)=0;
277 virtual void Finalize()=0;
278 static void AddToChain(SQCollectable **chain,SQCollectable *c);
279 static void RemoveFromChain(SQCollectable **chain,SQCollectable *c);
283 #define ADD_TO_CHAIN(chain,obj) AddToChain(chain,obj)
284 #define REMOVE_FROM_CHAIN(chain,obj) {if(!(_uiRef&MARK_FLAG))RemoveFromChain(chain,obj);}
285 #define CHAINABLE_OBJ SQCollectable
286 #define INIT_CHAIN() {_next=NULL;_prev=NULL;_sharedstate=ss;}
289 #define ADD_TO_CHAIN(chain,obj) ((void)0)
290 #define REMOVE_FROM_CHAIN(chain,obj) ((void)0)
291 #define CHAINABLE_OBJ SQRefCounted
292 #define INIT_CHAIN() ((void)0)
295 struct SQDelegable : public CHAINABLE_OBJ {
296 virtual bool GetMetaMethod(SQMetaMethod mm,SQObjectPtr &res);
300 unsigned int TranslateIndex(const SQObjectPtr &idx);
301 typedef sqvector<SQObjectPtr> SQObjectPtrVec;
302 typedef sqvector<int> SQIntVec;
304 #endif //_SQOBJECT_H_