James Bielman wrote:
>work with callback pointers in a manner that should be safe
>when saving/reloading images.
>I've made some progress updating the callback interface
James, I'm sorry I've ran out of time and could not try out all your recent additions.
>Jörg, in the CLISP implementation, I'm a little concerned about using
>FFI::EXEC-ON-STACK to convert the functions to callbacks, but I
Indeed, while I don't object using some ffi::... functions which look like they could have been exported if the FFI had embodied a layered approach, EXEC-ON-STACK is not among these. IMHO, EXEC-ON-STACK really is the lowest-level system-internal helper function, depending on other internals and revealing internal structure not meant for the outside.
>couldn't find another way to get the effect of FFI:WITH-C-VAR at
>runtime, given a parsed type.
Indeed, "given a parsed type" is the problem here.
Think in terms of conversions. You need a foreign place where to store a Lisp function: this causes generation of a callback, then you need to read it back to obtain the #<foreign-function> object.
Therefore, a combination of (with-c-var (x 'c-pointer)), SETF CAST and MEMORY-AS should do the trick (just thinking aloud).
The attached patch includes an answer involving only exported forms.
+ (ffi:with-foreign-object (ptr 'ffi:c-pointer)
+ ;; Create callback by converting Lisp function to foreign
+ (setf (ffi:memory-as ptr parsed-type) function)
+ ;; then construct #<FOREIGN-FUNCTION> object from pointer
+ ;;(ffi:memory-as ptr parsed-type)
+ ;; actually, cffi only keeps the pointer:
+ (ffi:foreign-value ptr)))))
Note that your current code does not free replaced callbacks as the previous one did. You may want to put that back.
Regard,
Jörg Höhle.