Next: ick_get/setone/twospot, Previous: ick_resume, Up: External Calls to C [Index]
The ick_forget macro removes NEXT stack
entries, and the corresponding C stack entries. It must be called as a
statement by itself, and its invocation looks like this:
ick_forget(expr);, where the expression is the number of
NEXT stack entries to forget (all of them will be
forgotten if the number is higher than the number of entries). The
expression will be casted to an unsigned short.
ick_forget can only be used inside a function declared
with ICK_EC_FUNC_START. As it is removing stack entries
both in INTERCAL and in C, it will clobber the value
of all auto variables created since the highest remaining
NEXT stack entry came into being (or since the start of
the program, if the NEXT stack is emptied by the command)
and also deallocate all alloca storage allocated since
then. It also causes the return address of the current function to
become undefined, so that function must not return; control may leave
it via RESUME, or via COME FROM, or via
NEXT or NEXT FROM followed by the relevant
NEXT stack entry being forgotten (the function is still
’running’ but suspended while the NEXT stack
entry still exists). (Note that these restrictions are stronger than
those on RESUME; this is because RESUME
preserves most of the stack, but FORGET destroys parts of
the stack and therefore cannot avoid destroying the data stored there.
It could be much worse; a previous (never released) version of the code
didn’t remove those parts of the stack in many circumstances,
leading to a stack leak that caused programs to segfault after a
while.)
Next: ick_get/setone/twospot, Previous: ick_resume, Up: External Calls to C [Index]