moved back to old acc
[vox.git] / src / core / object.hpp
blob4f8f5971fbe23143729577ed8f9485c6785a4294
2 #ifndef _VXOBJECT_H_
3 #define _VXOBJECT_H_
5 #include "utils.hpp"
7 #define UINT_MINUS_ONE (0xFFFFFFFF)
9 #define VX_OBJECT_RAWINIT(selfptr) { selfptr->_unVal.raw = 0; }
10 #define VX_REFOBJECT_INIT(selfptr) VX_OBJECT_RAWINIT(selfptr)
13 #define VX_CLOSURESTREAM_HEAD (('L' << 24) | ('X' << 16) | ('O' << 8) | 'V')
14 #define VX_CLOSURESTREAM_PART (('P' << 24) | ('A' << 16) |('R' << 8) | 'T')
15 #define VX_CLOSURESTREAM_TAIL (('T' << 24) | ('A' << 16) |('I' << 8) | 'L')
18 #define VX_CLOSURESTREAM_HEAD \
19 (('!' << 24) | ('X' << 16) | ('O' << 8) | 'V')
21 #define VX_CLOSURESTREAM_PART \
22 (('T' << 24) | (10 << 16) | ('P' << 8) | 100)
24 #define VX_CLOSURESTREAM_TAIL \
25 (('L' << 24) | (10 << 16) | ('T' << 8) | 200)
27 #define _CHECK_IO(exp) { if(!exp)return false; }
29 #define VX_MM_ADD "__add__"
30 #define VX_MM_SUB "__sub__"
31 #define VX_MM_MUL "__mul__"
32 #define VX_MM_DIV "__div__"
33 #define VX_MM_UNM "__unm__"
34 #define VX_MM_MODULO "__modulo__"
35 #define VX_MM_SET "__set__"
36 #define VX_MM_GET "__get__"
37 #define VX_MM_TYPEOF "__typeof__"
38 #define VX_MM_NEXTI "__nexti__"
39 #define VX_MM_CMP "__cmp__"
40 #define VX_MM_CALL "__call__"
41 #define VX_MM_CLONED "__cloned__"
42 #define VX_MM_NEWSLOT "__newslot__"
43 #define VX_MM_DELSLOT "__delslot__"
44 #define VX_MM_TOSTRING "__tostring__"
45 #define VX_MM_NEWMEMBER "__newmember__"
46 #define VX_MM_INHERITED "__inherited__"
49 #define VX_CONSTRUCT_VECTOR(type,size,ptr) \
50 { \
51 for(VXInteger n = 0; n < ((VXInteger)size); n++) { \
52 new (&ptr[n]) type(); \
53 } \
56 #define VX_DESTRUCT_VECTOR(type,size,ptr) { \
57 for(VXInteger nl = 0; nl < ((VXInteger)size); nl++) { \
58 ptr[nl].~type(); \
59 } \
62 #define VX_COPY_VECTOR(dest,src,size) { \
63 for(VXInteger _n_ = 0; _n_ < ((VXInteger)size); _n_++) { \
64 dest[_n_] = src[_n_]; \
65 } \
75 #define VX_REALVAL(o) (type((o)) != VX_OT_WEAKREF?(VXRawObj)o:_weakref(o)->_obj)
78 #define VX_ADDREF(type,unval) if(ISREFCOUNTED(type)) \
79 { \
80 unval.pRefCounted->_uiRef++; \
83 #define __Release(type,unval) \
84 if(ISREFCOUNTED(type) && ((--unval.pRefCounted->_uiRef)==0)) \
85 { \
86 unval.pRefCounted->Release(); \
89 #define __ObjRelease(obj) { \
90 if((obj)) { \
91 (obj)->_uiRef--; \
92 if((obj)->_uiRef == 0) \
93 (obj)->Release(); \
94 (obj) = NULL; \
95 } \
98 #define __ObjAddRef(obj) { \
99 (obj)->_uiRef++; \
102 #define type(obj) ((obj)._type)
103 #define is_delegable(t) (t.Type() & VXOBJECT_DELEGABLE)
105 #define _integer(obj) ((obj)._unVal.nInteger)
106 #define _float(obj) ((obj)._unVal.fFloat)
107 #define _string(obj) ((obj)._unVal.pString)
108 #define _table(obj) ((obj)._unVal.pTable)
109 #define _array(obj) ((obj)._unVal.pArray)
110 #define _closure(obj) ((obj)._unVal.pClosure)
111 #define _generator(obj) ((obj)._unVal.pGenerator)
112 #define _nativeclosure(obj) ((obj)._unVal.pNativeClosure)
113 #define _userdata(obj) ((obj)._unVal.pUserData)
114 #define _userpointerval(obj) ((obj)._unVal.pUserPointer)
115 #define _thread(obj) ((obj)._unVal.pThread)
116 #define _funcproto(obj) ((obj)._unVal.pFunctionProto)
117 #define _class(obj) ((obj)._unVal.pClass)
118 #define _instance(obj) ((obj)._unVal.pInstance)
119 #define _delegable(obj) ((VXDelegableObj *)(obj)._unVal.pDelegable)
120 #define _weakref(obj) ((obj)._unVal.pWeakRef)
121 #define _outer(obj) ((obj)._unVal.pOuter)
122 #define _refcounted(obj) ((obj)._unVal.pRefCounted)
123 #define _rawval(obj) ((obj)._unVal.raw)
125 #define _stringval(obj) (((obj)._unVal).pString->Value())
126 #define _stringlen(obj) (((obj)._unVal).pString->Length())
127 #define _userdataval(obj) ((VXUserPointer)vox_aligning((obj)._unVal.pUserData + 1))
129 #define tofloat(num) ((type(num)==VX_OT_INTEGER)?(VXFloat)_integer(num):_float(num))
130 #define tointeger(num) ((type(num)==VX_OT_FLOAT)?(VXInteger)_float(num):_integer(num))
132 #define MINPOWER2 4
134 #define START_MARK() \
135 if(!(_uiRef & MARK_FLAG))\
137 _uiRef |= MARK_FLAG;
139 #define END_MARK() \
140 this->RemoveFromChain(&_sharedstate->_gc_chain, this); \
141 this->AddToChain(chain, this); \
145 #define MARK_FLAG 0x80000000
146 #define ADD_TO_CHAIN(chain,obj) AddToChain(chain,obj)
147 #define REMOVE_FROM_CHAIN(chain,obj) {if(!(_uiRef&MARK_FLAG)) this->RemoveFromChain(chain,obj);}
148 #define CHAINABLE_OBJ VXCollectable
149 #define INIT_CHAIN() {_next=NULL;_prev=NULL;_sharedstate=ss;}
153 struct VXSharedState;
154 struct VXObject;
155 typedef VXVector<VXInteger> VXIntVec;
157 inline void _Swap(VXRawObj &a,VXRawObj &b)
159 VXOType tOldType = a._type;
160 VXRawObj::Value unOldVal = a._unVal;
161 a._type = b._type;
162 a._unVal = b._unVal;
163 b._type = tOldType;
164 b._unVal = unOldVal;
167 template<typename Type> void _NULL_VXOBJECT_VECTOR(Type& vec, VXInteger size)
169 VXInteger n;
170 for(n= 0; n< size; n++)
172 vec[n].Null();
177 VXUnsignedInteger TranslateIndex(const VXObject &idx);
180 const char *GetTypeName(const VXObject &obj1);
181 const char *IdType2Name(VXOType type);
183 bool SafeWrite(VXState* v,
184 VXWriteFunc write,
185 VXUserPointer up,
186 VXUserPointer dest,
187 VXInteger size);
188 bool SafeRead(VXState* v,VXWriteFunc read,VXUserPointer up,VXUserPointer dest,VXInteger size);
189 bool WriteTag(VXState* v,VXWriteFunc write,VXUserPointer up,VXUnsignedInteger32 tag);
190 bool CheckTag(VXState* v,VXWriteFunc read,VXUserPointer up,VXUnsignedInteger32 tag);
191 bool WriteObject(VXState* v,VXUserPointer up,VXWriteFunc write,VXObject &o);
192 bool ReadObject(VXState* v,VXUserPointer up,VXReadFunc read,VXObject &o);
195 #endif //_VXOBJECT_H_