Next: Simple Special Forms, Previous: Evaluation, Up: Evaluation; Stack Frames; Bindings [Contents][Index]
struct specbinding
{
Lisp_Object symbol;
Lisp_Object old_value;
Lisp_Object (*func) (Lisp_Object); /* for unwind-protect */
};
struct specbinding is used for local-variable bindings and
unwind-protects. specpdl holds an array of struct specbinding’s,
specpdl_ptr points to the beginning of the free bindings in the
array, specpdl_size specifies the total number of binding slots
in the array, and max_specpdl_size specifies the maximum number
of bindings the array can be expanded to hold. grow_specpdl()
increases the size of the specpdl array, multiplying its size by
2 but never exceeding max_specpdl_size (except that if this
number is less than 400, it is first set to 400).
specbind() binds a symbol to a value and is used for local
variables and let forms. The symbol and its old value (which
might be Qunbound, indicating no prior value) are recorded in the
specpdl array, and specpdl_size is increased by 1.
record_unwind_protect() implements an unwind-protect,
which, when placed around a section of code, ensures that some specified
cleanup routine will be executed even if the code exits abnormally
(e.g. through a throw or quit). record_unwind_protect()
simply adds a new specbinding to the specpdl array and stores the
appropriate information in it. The cleanup routine can either be a C
function, which is stored in the func field, or a progn
form, which is stored in the old_value field.
unbind_to() removes specbindings from the specpdl array
until the specified position is reached. Each specbinding can be one of
three types:
func is not 0, and
old_value holds an argument to be passed to the function);
func is 0, symbol
is nil, and old_value holds the form to be executed with
Fprogn()); or
func is 0, symbol is not
nil, and old_value holds the old value, which is stored as
the symbol’s value).
Next: Simple Special Forms, Previous: Evaluation, Up: Evaluation; Stack Frames; Bindings [Contents][Index]