[CM] Bug regarding hooks

bil at ccrma.Stanford.EDU bil at ccrma.Stanford.EDU
Fri Dec 31 12:21:58 PST 2021

Here's a change that might be interesting.  Change call_setter (ca line 
46598) to:

static s7_pointer call_setter(s7_scheme *sc, s7_pointer slot, s7_pointer 
   s7_pointer func = slot_setter(slot);
   if (!is_any_procedure(func))

   if (is_c_function(func))
     return(call_c_function_setter(sc, func, slot_symbol(slot), 

   sc->args = (has_let_arg(func)) ?
                list_3(sc, slot_symbol(slot), new_value, sc->curlet) :
	       list_2(sc, slot_symbol(slot), new_value);
   return(s7_call(sc, func, sc->args));

I think the problem is that the error (in the setter function) longjmps
which (in the old call_setter) exited the recursive eval call, but
did not fixup the eval_done on the scheme stack.  A simple example:

(define (fc in)
   (catch 'wrong-type-arg
     (lambda ()
       (+ in 2))
     (lambda (type info)

(define state
   (let ()
     (define file #f)
     (define contents #f)
     (set! (setter 'file)
	  (lambda (s v)
	    (set! contents (fc #\1))

(set! (state 'file) 321)

(format *stderr* "done: ~S ~S~%" (state 'file) (state 'contents))

More information about the Cmdist mailing list