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
On 21/ago/2005, at 09:40, James Bielman wrote:
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.
Thanks for pointing that out. (I should read Erann Gat's paper /The Complete Idiot's Guide to Common Lisp Packages/)
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.
Good idea, I'll put callback-symbol-name there and push cffi-utils as that is completely independent of the remaining stuff I'm working on.
Pushed.
Btw, there might be similar issues with DEFCFUN-HELPER-FORMS, I'll check that out after reading Erann Gat's guide. :-)
Luis Oliveira luismbo@gmail.com writes:
Pushed.
Looks good, I'll probably pull callbacks into the main tree today.
Thanks, James