summaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2017-05-11 20:02:12 -0700
committerKaz Kylheku <kaz@kylheku.com>2017-05-11 20:02:12 -0700
commite43849b3f941b12e14571aa09a5c18c3e105440f (patch)
tree335134dcf4b2093519eec949f2658e49821fbb53 /share
parent1b615a6667660b353c7719d805a0a40cdd948789 (diff)
downloadtxr-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.tl10
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)))