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