Luis,
In preparation for pulling in your changes to the main Darcs tree, I've been looking at the callback support in the cffi-luis branch.
As it stands, I think CFFI-SYS::MAKE-CALLBACK does not safely intern the symbols it uses for callback names (on all the implementations but SBCL it seems). For example, if you use DEFCALLBACK from the REPL, the callback symbol is interned into the current package; in my test case, it was interned into CL-USER. Also, callbacks with the same symbol name but from different packages will redefine each other.
So, I propose a separate package for callback symbols, and making sure we also use the package name of the symbol we are defining a callback for.
Also, thinking back to our earlier conversation about making some sort of CFFI-UTILS package, I would suggest putting it first in the system definition so the backends can make use of it as well, then we can put CALLBACK-SYMBOL-NAME there as well.
Here's a patch against cffi-luis for OpenMCL:
--- old-cffi-luis/src/cffi-openmcl.lisp 2005-08-08 16:47:20.000000000 -0700 +++ new-cffi-luis/src/cffi-openmcl.lisp 2005-08-21 01:27:06.000000000 -0700 @@ -47,6 +47,8 @@ #:foreign-var-ptr #:make-callback))
+(defpackage #:cffi-callbacks) + (in-package #:cffi-sys)
;;;# Allocation @@ -248,8 +250,14 @@
;;;# Callbacks
+(defun callback-symbol-name (name) + "Return the symbol to use for the callback for NAME." + (intern (format nil "~A.~A" + (package-name (symbol-package name)) + (symbol-name name)) :cffi-callbacks)) + (defmacro make-callback (name rettype arg-names arg-types body-form) - (let ((cb-sym (intern (format nil "%callback/~A" name)))) + (let ((cb-sym (callback-symbol-name name))) `(symbol-value (defcallback ,cb-sym (,@(mapcan (lambda (sym type) (list (convert-foreign-type type) sym))
James