1 //metadoc Object copyright Steve Dekorte 2002
2 //metadoc Object license BSD revised
3 
4 #ifndef OBJECT_STRUCT_DEFINED
5 #define OBJECT_STRUCT_DEFINED 1
6 
7 #include "Common.h"
8 #include "PHash_struct.h"
9 #include "BStream.h"
10 #include "IoTag.h"
11 #include "Collector.h"
12 
13 #ifdef __cplusplus
14 extern "C" {
15 #endif
16 
17 // Shortcut for method definitons in C code
18 #define IO_METHOD(CLASS, NAME) IoObject * CLASS ## _ ## NAME (CLASS  *self, IoObject *locals, IoMessage *m)
19 
20 typedef struct CollectorMarker IoObject;
21 //typedef struct IoObjectData IoObjectData;
22 /*
23 #ifndef CollectorObjectReference_DEFINED
24 	#define CollectorObjectReference_DEFINED 1
25 	typedef struct IoObjectData CollectorObjectReference;
26 #endif
27 */
28 
29 #define IOOBJECT_PERSISTENCE 1
30 
31 struct IoObjectData
32 {
33 	unsigned int markerCount;
34 
35 	union
36 	{
37 		void *ptr;
38 		double d;
39 		uint32_t ui32;
40 	} data; // 8 bytes (9+8 = 17)
41 
42 	// 4*4 = 16 bytes (17+16 = 33)
43 	IoTag *tag;
44 	PHash *slots;
45 	List *listeners;
46 	IoObject **protos;
47 
48 	unsigned int hasDoneLookup : 1;    // used to avoid slot lookup loops
49 	unsigned int isActivatable : 1;    // if true, upon activation, call activate slot
50 	unsigned int isDirty : 1;          // set to true when the object changes its storable state
51 
52 	// optimizations
53 
54 	unsigned int ownsSlots : 1;        // if true, io_free slots hash table when io_freeing object
55 	unsigned int isSymbol : 1;         // true if the object is a unqiue sequence - a symbol
56 	unsigned int isLocals : 1;         // true if the Object is a locals object
57 	unsigned int isReferenced : 1;     // 1 bit ref counter
58 	unsigned int sentWillFree : 1;     // 1 is sent willFree mes
59 	//unsigned int isPObject : 1;        // check before type tests?
60 };
61 
62 #define IoObject_deref(self) ((IoObjectData *)(((CollectorMarker *)(self))->object))
63 #define IoObject_markerCount(self)          IoObject_deref(self)->markerCount
64 #define IoObject_markerCount_(self, v)      IoObject_deref(self)->markerCount = (v);
65 #define IoObject_incrementMarkerCount(self) IoObject_deref(self)->markerCount ++;
66 #define IoObject_decrementMarkerCount(self) IoObject_deref(self)->markerCount --;
67 
68 #define IoObject_tag_(self, t) IoObject_deref(self)->tag = t;
69 #define IoObject_tag(self) (IoObject_deref(self)->tag)
70 
71 #define IoObject_state(self) ((IoState *)(IoObject_tag(self)->state))
72 #define IOSTATE ((IoState *)(IoObject_tag(self)->state))
73 //#define IOSTATE IoObject_state(state)
74 
75 
76 
77 #define IoObject_dataPointer(self)          IoObject_deref(self)->data.ptr
78 #define IoObject_setDataPointer_(self, v)   IoObject_deref(self)->data.ptr = (void *)(v);
79 
80 #define IoObject_dataDouble(self)           IoObject_deref(self)->data.d
81 #define IoObject_setDataDouble_(self, v)    IoObject_deref(self)->data.d = (double)(v);
82 
83 #define IoObject_dataUint32(self)           IoObject_deref(self)->data.ui32
84 #define IoObject_setDataUint32_(self, v)    IoObject_deref(self)->data.ui32 = (uint32_t)(v);
85 
86 #define IoObject_isActivatable_(self, b)    IoObject_deref(self)->isActivatable = b;
87 #define IoObject_isActivatable(self)        (IoObject_deref(self)->isActivatable)
88 
89 #define IoObject_ownsSlots_(self, b)        IoObject_deref(self)->ownsSlots = b;
90 #define IoObject_ownsSlots(self)            (IoObject_deref(self)->ownsSlots)
91 
92 #define IoObject_slots_(self, v)            IoObject_deref(self)->slots = v;
93 #define IoObject_slots(self)                (IoObject_deref(self)->slots)
94 
95 #define IoObject_protos_(self, v)        IoObject_deref(self)->protos = v;
96 #define IoObject_protos(self)            (IoObject_deref(self)->protos)
97 
98 #define IoObject_firstProto(self)        IoObject_protos(self)[0]
99 #define IoObject_protoAt_(self, i)       IoObject_protos(self)[i]
100 #define IoObject_protoAtPut_(self, i, v) IoObject_protos(self)[i] = v;
101 
102 #define IoObject_listeners_(self, v) IoObject_deref(self)->listeners = v;
103 #define IoObject_listeners(self)     (IoObject_deref(self)->listeners)
104 
105 #define IoObject_hasDoneLookup_(self, v) IoObject_deref(self)->hasDoneLookup = v;
106 #define IoObject_hasDoneLookup(self)     (IoObject_deref(self)->hasDoneLookup)
107 
108 #define IoObject_isSymbol_(self, v) IoObject_deref(self)->isSymbol = v;
109 #define IoObject_isSymbol(self)     (IoObject_deref(self)->isSymbol)
110 
111 #ifdef IOOBJECT_PERSISTENCE
112 #define IoObject_isDirty_(self, v) IoObject_deref(self)->isDirty = v;
113 #define IoObject_isDirty(self)     (IoObject_deref(self)->isDirty)
114 #else
115 #define IoObject_isDirty_(self, v)
116 #define IoObject_isDirty(self) 0
117 #endif
118 
119 #define IoObject_sentWillFree_(self, v) IoObject_deref(self)->sentWillFree = v;
120 #define IoObject_sentWillFree(self)     (IoObject_deref(self)->sentWillFree)
121 
122 #define IoObject_isLocals_(self, v) IoObject_deref(self)->isLocals = v;
123 #define IoObject_isLocals(self)     (IoObject_deref(self)->isLocals)
124 
125 #ifdef IO_BLOCK_LOCALS_RECYCLING
126 #define IoObject_isReferenced_(self, v) IoObject_deref(self)->isReferenced = v;
127 #define IoObject_isReferenced(self) (IoObject_deref(self)->isReferenced)
128 #else
129 #define IoObject_isReferenced_(self, v)
130 #define IoObject_isReferenced(self) 0
131 #endif
132 
133 typedef IoObject *(IoMethodFunc)(IoObject *, IoObject *, IoObject *);
134 
135 typedef struct
136 {
137 	const char *name;
138 	IoMethodFunc *func;
139 } IoMethodTable;
140 
141 #ifdef __cplusplus
142 }
143 #endif
144 #endif
145