[Ecls-list] CFFI typedefs not noticed in compiled code

Daniel Dickison danieldickison at gmail.com
Fri Sep 15 04:40:52 UTC 2006


I've been having some strange problems with CFFI typedefs.  In a  
file, I have a def-foreign-type along with a def-function that uses  
the previously defined type.  If I load the source file then it works  
fine.  However, if I compile the file and then load the .fas file in  
a new ECL run, I get the error:
Unknown CFFI type: CFFI-USER::CURL-CODE.

It seems that when loading compiled code, CFFI's hash table that  
stores user-defined types is not getting updated properly, even  
though, as far as I can tell, the def-foreign-type macro expands to  
include an all-inclusive eval-when.

Here's an example of the problem:

;;; curl-ecl.lisp
(defpackage :ecl-user
   (:use :common-lisp :ffi))
(in-package :ecl-user)

(ffi:load-foreign-library "curl")
(def-foreign-type curl-code :int)
(def-function "curl_global_init" ((flags :long))
   :returning curl-code)

Loading the source works fine, but not when loading the .fas in a  
fresh environment.

I haven't been able to reproduce the problem outside of CFFI, so I  
don't know if this is an ECL issue or CFFI bug.  For what it's worth,  
the following works fine, even though I thought it is analogous to  
what CFFI does as far as hash tables go.:

;;; hash-test.lisp
(defvar *my-hash* (make-hash-table))
(defmacro set-hash-value (key val)
   `(setf (gethash ,key *my-hash*) ,val))
(defmacro print-hash-value (key)
   `(print ,(gethash key *my-hash*)))

(eval-when (:compile-toplevel :load-toplevel :execute)
   (set-hash-value :key "hello world"))
(print-hash-value :key)


Thanks in advance for any help.

Daniel




More information about the ecl-devel mailing list