Index: chicken/iup-base.scm ================================================================== --- chicken/iup-base.scm +++ chicken/iup-base.scm @@ -316,11 +316,11 @@ (define frame-return/handle! (foreign-lambda* void ([c-pointer frame] [ihandle ret]) "va_return_ptr((va_alist)frame, Ihandle *, ret);")) (call-with-current-continuation (lambda (return) - (let ([sig "i"] [ret 'continue]) + (let ([sig "i"] [ret? #f]) (dynamic-wind void (lambda () (let* ([data (registry-ref (pointer->address cid))] [proc (cdr data)]) @@ -340,21 +340,27 @@ [(#\s) (frame-arg/string! frame)] [(#\v) (frame-arg/pointer! frame)] [(#\h) (frame-arg/handle! frame)]))]) (handle-exceptions exn (print-error-message exn (current-error-port) "Error: in callback") - (set! ret (apply proc args)))))) + (let ([ret (apply proc args)]) + (case (string-ref sig 0) + [(#\b) (frame-return/ubyte! frame ret)] + [(#\i) (frame-return/status! frame ret)] + [(#\f) (frame-return/float! frame ret)] + [(#\d) (frame-return/double! frame ret)] + [(#\v) (frame-return/pointer! frame ret)] + [(#\h) (frame-return/handle! frame ret)]) + (set! ret? #t)))))) (lambda () - (handle-exceptions exn - (void) + (unless ret? (case (string-ref sig 0) - [(#\b) (frame-return/ubyte! frame ret)] - [(#\i) (frame-return/status! frame ret)] - [(#\f) (frame-return/float! frame ret)] - [(#\d) (frame-return/double! frame ret)] - [(#\v) (frame-return/pointer! frame ret)] - [(#\h) (frame-return/handle! frame ret)])) + [(#\b) (frame-return/ubyte! frame 0)] + [(#\i) (frame-return/status! frame 'continue)] + [(#\f) (frame-return/float! frame 0.0)] + [(#\d) (frame-return/double! frame 0.0)] + [(#\v #\h) (frame-return/pointer! frame #f)])) (return (void)))))))) (define-values (callback-set! callback) (letrec ([signature/raw (foreign-lambda* c-string ([nonnull-ihandle handle] [iname/upcase name])