[cffi-devel] Type Translator Branch Update
James Bielman
jamesjb at jamesjb.com
Sun Jan 1 10:11:21 UTC 2006
Hi all,
I've updated the cffi-new-translators branch, improving the exported
interface and fixing a few bugs. The branch is available via Darcs (or
a browser to browse the source) at:
http://slacknet.com/~jamesjb/cffi-new-translators
The exported interface for defining type translators is by specializing
the following generic functions:
Generic Function: TRANSLATE-TO-FOREIGN value type-name
Convert the Lisp object VALUE to a foreign object of the type named by
TYPE-NAME, which is a symbol naming a type defined by DEFCTYPE. Methods
on this generic function should EQL-specialize TYPE-NAME for the type to
translate.
Returns the translated foreign object and an optional second value that
will be passed as the PARAM argument to FREE-TRANSLATED-OBJECT.
Generic Function: TRANSLATE-FROM-FOREIGN value type-name
Convert the foreign object VALUE of the type named by TYPE-NAME, which
is a symbol naming a type defined by DEFCTYPE, to a Lisp object.
Methods on this generic function should EQL-specialize TYPE-NAME for the
type to translate.
Generic Function: FREE-TRANSLATED-OBJECT value type-name param
Perform necessary deallocation of the foreign object VALUE, of the type
named by TYPE-NAME, which is a symbol naming a type defined by DEFCTYPE.
Methods on this generic function should EQL-specialize TYPE-NAME for the
type to deallocate.
PARAM will contain the second value returned by TRANSLATE-TO-FOREIGN for
this type, or NIL if no second value was present.
If no deallocation is required, it is not necessary to specialize this
method.
Here's an example, a simplified version of the :boolean type:
(defctype boolean :int)
(defmethod translate-to-foreign (value (type (eql 'boolean)))
(if value 1 0))
(defmethod translate-from-foreign (value (type (eql 'boolean)))
(not (zerop value)))
Also, look at examples/gettimeofday.lisp and translator-test.lisp for
more examples.
There is another, unexported, set of generic functions used internally
for translating whole classes of types. Look at
TRANSLATE-TYPE-{TO,FROM}-FOREIGN and FREE-TYPE-TRANSLATED-OBJECT for
these (and methods defined on them for FOREIGN-ENUM, etc).
With respect to the old :TO-C-DYNAMIC translators, I'm inclined to not
worry about optimizing this case until there is a specific performance
need for it. I think the ability to dispatch on the type of the value
being translated is more useful than the optimization it was providing.
Comments?
James
More information about the cffi-devel
mailing list