2 //metadoc State copyright Steve Dekorte 2002
3 //metadoc State license BSD revised
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
;
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
);
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
);
91 IOINLINE
void *IoState_stackRetain_(IoState
*self
, IoObject
*v
)
93 IoObject_isReferenced_(v
, 1);
94 IoState_unreferencedStackRetain_(self
, 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
)
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
);
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);
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
);
174 IoMessageData
*md
= IOMESSAGEDATA(m
);
175 IoObject
*v
= md
->cachedResult
;
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);
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
;
211 IoMessage
*m
= (IoMessage
*)List_rawAt_(args
, 0);
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
))
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
:
266 case MESSAGE_STOP_STATUS_BREAK
:
267 IoState_resetStopStatus(self
);
270 case MESSAGE_STOP_STATUS_CONTINUE
:
271 IoState_resetStopStatus(self
);
279 IOINLINE IoObject
* IoState_stopStatusObject(IoState
*self
, int 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
:
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
;