New doc system done for core
[io.git] / libs / iovm / source / IoState_inline.h
blobe551a2308171a8584791a433c59b9615b13d72a1
2 //metadoc State copyright Steve Dekorte 2002
3 //metadoc State license BSD revised
5 #ifdef IOSTATE_C
6 #define IO_IN_C_FILE
7 #endif
8 #include "Common_inline.h"
9 #ifdef IO_DECLARE_INLINES
11 // booleans --------------------------------------------------------
13 #define SIOSYMBOL(stringConstant) IoState_symbolWithCString_(self, stringConstant)
15 #define IOASSERT(value, message) \
16 if (!(value)) { IoState_error_(IOSTATE, m, "Io Assertion '%s'", message); }
18 #define IOCOLLECTOR (IOSTATE->collector)
20 #define IONIL(self) (IOSTATE->ioNil)
21 #define ISNIL(self) (self == IOSTATE->ioNil)
23 // booleans --------------------------------------------------------
25 #define ISBOOL(self) (((self)==IOSTATE->ioFalse) \
26 || ((self)==IOSTATE->ioNil) \
27 || ((self)==IOSTATE->ioTrue))
29 #define IOSUCCESS(self) IOTRUE(self)
30 #define ISSUCCESS(self) ISTRUE(self)
32 #define IOFAILURE(self) IOFALSE(self)
33 #define ISFAILURE(self) ISFALSE(self)
35 //inline IoObject *IOBOOL(IoObject *self, int b);
37 #if !defined(IoObjectDataDefined)
38 typedef struct IoObjectData IoObjectData;
39 #endif
41 IOINLINE IoObject *IOTRUE(IoObject *self)
43 return IOSTATE->ioTrue;
46 IOINLINE int ISTRUE(IoObject *self)
48 return self != IOSTATE->ioNil && self != IOSTATE->ioFalse;
51 IOINLINE IoObject *IOFALSE(IoObject *self)
53 return IOSTATE->ioFalse;
56 IOINLINE int ISFALSE(IoObject *self)
58 return self == IOSTATE->ioNil || self == IOSTATE->ioFalse;
61 IOINLINE IoObject *IOBOOL(IoObject *self, int b)
63 return b ? IOTRUE(self) : IOFALSE(self);
66 // collector --------------------------------------------------------
68 IOINLINE IoObject *IoState_retain_(IoState *self, IoObject *v)
70 IoObject_isReferenced_(v, 1);
71 Collector_retain_(self->collector, v);
72 return v;
75 IOINLINE void IoState_stopRetaining_(IoState *self, IoObject *v)
77 Collector_stopRetaining_(self->collector, v);
80 IOINLINE void *IoState_unreferencedStackRetain_(IoState *self, IoObject *v)
82 if (self->currentCoroutine)
84 Collector_value_addingRefTo_(self->collector, self->currentCoroutine, v);
87 Stack_push_(self->currentIoStack, v);
88 return v;
91 IOINLINE void *IoState_stackRetain_(IoState *self, IoObject *v)
93 IoObject_isReferenced_(v, 1);
94 IoState_unreferencedStackRetain_(self, v);
95 return v;
98 IOINLINE void IoState_addValue_(IoState *self, IoObject *v)
100 Collector_addValue_(self->collector, v);
101 IoState_unreferencedStackRetain_(self, v);
104 IOINLINE void IoState_addValueIfNecessary_(IoState *self, IoObject *v)
106 if (v->prev)
108 Collector_addValue_(self->collector, v);
110 IoState_unreferencedStackRetain_(self, v);
113 IOINLINE void IoState_pushCollectorPause(IoState *self)
115 Collector_pushPause(self->collector);
118 IOINLINE void IoState_popCollectorPause(IoState *self)
120 Collector_popPause(self->collector);
123 IOINLINE void IoState_clearRetainStack(IoState *self)
125 Stack_clear(((IoState *)self)->currentIoStack);
128 IOINLINE uintptr_t IoState_pushRetainPool(void *self)
130 uintptr_t m = Stack_pushMarkPoint(((IoState *)self)->currentIoStack);
131 return m;
134 IOINLINE void IoState_clearTopPool(void *self)
136 Stack *stack = ((IoState *)self)->currentIoStack;
137 //Stack_popMark(stack);
138 //Stack_pushMark(stack);
139 Stack_clearTop(stack);
142 IOINLINE void IoState_popRetainPool(void *self)
144 Stack *stack = ((IoState *)self)->currentIoStack;
145 Stack_popMark(stack);
148 IOINLINE void IoState_popRetainPool_(void *self, uintptr_t mark)
150 Stack *stack = ((IoState *)self)->currentIoStack;
151 Stack_popMarkPoint_(stack, mark);
154 IOINLINE void IoState_popRetainPoolExceptFor_(void *state, void *obj)
156 IoState *self = (IoState *)state;
157 #ifdef STACK_POP_CALLBACK
158 IoObject_isReferenced_(((IoObject *)obj), 1);
159 #endif
160 IoState_popRetainPool(self);
161 IoState_stackRetain_(self, (IoObject *)obj);
164 // message args --------------------------------------------------------
166 #define IOMESSAGEDATA(self) ((IoMessageData *)IoObject_dataPointer(self))
168 IOINLINE IoObject *IoMessage_locals_quickValueArgAt_(IoMessage *self, IoObject *locals, int n)
170 IoMessage *m = (IoMessage *)List_at_(IOMESSAGEDATA(self)->args, n);
172 if (m)
174 IoMessageData *md = IOMESSAGEDATA(m);
175 IoObject *v = md->cachedResult;
177 if (v && !md->next)
179 return v;
182 return IoMessage_locals_performOn_(m, locals, locals);
185 return IOSTATE->ioNil;
188 IOINLINE IoObject *IoMessage_locals_valueArgAt_(IoMessage *self, IoObject *locals, int n)
190 return IoMessage_locals_quickValueArgAt_(self, locals, n);
192 List *args = IOMESSAGEDATA(self)->args;
193 IoMessage *m = (IoMessage *)List_at_(args, n);
195 if (m)
197 return IoMessage_locals_performOn_(m, locals, locals);
200 return IOSTATE->ioNil;
204 IOINLINE IoObject *IoMessage_locals_firstStringArg(IoMessage *self, IoObject *locals)
206 // special case this, since it's used for setSlot()
207 List *args = IOMESSAGEDATA(self)->args;
209 if (List_size(args))
211 IoMessage *m = (IoMessage *)List_rawAt_(args, 0);
213 if (m)
215 IoMessageData *md = IOMESSAGEDATA(m);
216 IoObject *v = md->cachedResult;
218 // avoid calling IoMessage_locals, if possible
220 if (v && IoObject_isSymbol(v) && (md->next == NULL))
222 return v;
227 return IoMessage_locals_symbolArgAt_(self, locals, 0);
230 // --------------------------
232 IOINLINE void IoState_break(IoState *self, IoObject *v)
234 self->stopStatus = MESSAGE_STOP_STATUS_BREAK;
235 self->returnValue = v;
238 IOINLINE void IoState_continue(IoState *self)
240 self->stopStatus = MESSAGE_STOP_STATUS_CONTINUE;
243 IOINLINE void IoState_eol(IoState *self)
245 self->stopStatus = MESSAGE_STOP_STATUS_EOL;
248 IOINLINE void IoState_return(IoState *self, IoObject *v)
250 self->stopStatus = MESSAGE_STOP_STATUS_RETURN;
251 self->returnValue = v;
254 IOINLINE void IoState_resetStopStatus(IoState *self)
256 self->stopStatus = MESSAGE_STOP_STATUS_NORMAL;
259 IOINLINE int IoState_handleStatus(IoState *self)
261 switch (self->stopStatus)
263 case MESSAGE_STOP_STATUS_RETURN:
264 return 1;
266 case MESSAGE_STOP_STATUS_BREAK:
267 IoState_resetStopStatus(self);
268 return 1;
270 case MESSAGE_STOP_STATUS_CONTINUE:
271 IoState_resetStopStatus(self);
272 return 0;
274 default:
275 return 0;
279 IOINLINE IoObject* IoState_stopStatusObject(IoState *self, int stopStatus)
281 switch(stopStatus)
283 case MESSAGE_STOP_STATUS_NORMAL:
284 return self->ioNormal;
286 case MESSAGE_STOP_STATUS_BREAK:
287 return self->ioBreak;
289 case MESSAGE_STOP_STATUS_CONTINUE:
290 return self->ioContinue;
292 case MESSAGE_STOP_STATUS_RETURN:
293 return self->ioReturn;
295 case MESSAGE_STOP_STATUS_EOL:
296 return self->ioEol;
298 default:
299 return self->ioNormal;
303 IOINLINE int IoState_stopStatusNumber(IoState *self, IoObject *obj)
305 if (obj == self->ioNormal)
306 return MESSAGE_STOP_STATUS_NORMAL;
308 if (obj == self->ioBreak)
309 return MESSAGE_STOP_STATUS_BREAK;
311 if (obj == self->ioContinue)
312 return MESSAGE_STOP_STATUS_CONTINUE;
314 if (obj == self->ioReturn)
315 return MESSAGE_STOP_STATUS_RETURN;
317 if (obj == self->ioEol)
318 return MESSAGE_STOP_STATUS_EOL;
320 return MESSAGE_STOP_STATUS_NORMAL;
324 #undef IO_IN_C_FILE
325 #endif