diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2017-05-11 20:02:12 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2017-05-11 20:02:12 -0700 |
commit | e43849b3f941b12e14571aa09a5c18c3e105440f (patch) | |
tree | 335134dcf4b2093519eec949f2658e49821fbb53 /share | |
parent | 1b615a6667660b353c7719d805a0a40cdd948789 (diff) | |
download | txr-e43849b3f941b12e14571aa09a5c18c3e105440f.tar.gz txr-e43849b3f941b12e14571aa09a5c18c3e105440f.tar.bz2 txr-e43849b3f941b12e14571aa09a5c18c3e105440f.zip |
ffi: support programmable abort return value.
* ffi.c (stuct txr_ffi_closure): New member, abort_retval.
(ffi_closure_mark_op): Mark the new member.
(ffi_closure_dispatch_safe): Implement the abort_retval.
If it is not nil, use put to place the value into the
return buffer. There is a risk that this could also throw
an exception, which is no longer protected: programer's
problem.
(ffi_make_closure): New abort_ret_in argument, which is
defaulted and stored.
(ffi_init): Update registration of ffi-make-closure to
reflect new argument.
* ffi.h (ffi_make_closure): Declaration updated.
* share/txr/stdlib/ffi.tl (sys:deffi-cb-expander):
Add abort-retval parameter; insert into ffi-make-closure
call.
(deffi-cb): Take optional abort-retval expression;
pass it down to the expander function.
(deffi-cb-unsafe): Pass nil as abort-retval down to expander.
* txr.1: Documented.
Diffstat (limited to 'share')
-rw-r--r-- | share/txr/stdlib/ffi.tl | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/share/txr/stdlib/ffi.tl b/share/txr/stdlib/ffi.tl index 739023fd..ec164b61 100644 --- a/share/txr/stdlib/ffi.tl +++ b/share/txr/stdlib/ffi.tl @@ -72,7 +72,7 @@ (defmacro deffi-type (name type-expr) ^(ffi-typedef ',name (ffi-type-compile ',type-expr))) -(defun sys:deffi-cb-expander (f name rettype argtypes safe-p) +(defun sys:deffi-cb-expander (f name rettype argtypes safe-p abort-retval) (let ((ret-type-sym (gensym "ret-type-")) (arg-types-sym (gensym "arg-types-")) (call-desc-sym (gensym "call-desc-")) @@ -85,13 +85,13 @@ ,ret-type-sym ,arg-types-sym)) (defun ,name (,fun-sym) - [ffi-make-closure ,fun-sym ,call-desc-sym ,safe-p]))))) + [ffi-make-closure ,fun-sym ,call-desc-sym ,safe-p ,abort-retval]))))) -(defmacro deffi-cb (:form f name rettype argtypes) - (sys:deffi-cb-expander f name rettype argtypes t)) +(defmacro deffi-cb (:form f name rettype argtypes : abort-retval) + (sys:deffi-cb-expander f name rettype argtypes t abort-retval)) (defmacro deffi-cb-unsafe (:form f name rettype argtypes) - (sys:deffi-cb-expander f name rettype argtypes nil)) + (sys:deffi-cb-expander f name rettype argtypes nil nil)) (defmacro sizeof (type) (ffi-size (ffi-type-compile type))) |