[Openmcl-devel] #_ arg expansion problem
taube at uiuc.edu
taube at uiuc.edu
Fri Jul 9 16:01:09 PDT 2004
I am working with a large ffi database (4,000+ function entries) that I
generated from Fink's GTK+2 developer package using OpenMCL's ffi tools. All the
#_ calls expand corrently in the ffi EXCEPT one entry that
%external-call-expander claims requires two arguments but actually only requires
one according to the .ffi and .h source files. The problem entry is for the glib
function "g_scanner_cur_value". Oddly enough, there are several other such
"g_scanner_" functions with identical arg declarations that do resolve correctly
in the ffi.
Here is the C declaration of g_scanner_cur_value :
------ in gscanner.h:
GTokenValue g_scanner_cur_value (GScanner *scanner);
And here is the entry in the "gtk.ffi" file that I created by doing "h-to-ffi
`pkg-config --cflags gtk+-2.0`" :
------ in gtk.ffi:
(function ("/sw/include/glib-2.0/glib/gscanner.h" 215)
"g_scanner_cur_value"
(function
((pointer (typedef "GScanner")) )
(typedef "GTokenValue")) (extern))
So both the .h and .ffi files indicate a function of one argument. Now here is
my Lisp wrapper function (I autogenerate defuns for all function and macro exprs
in the "gtk.ffi" file that I will eventually turn into a higher level of gtk
support than the raw #_ calls) The resulting "gtk.lisp" file has several
thousand such defuns -- this is the only one that causes problems:
----- in gtk.lisp:
(defun g-scanner-cur-value (*GScanner)
;; source: /sw/include/glib-2.0/glib/gscanner.h
;; return: GTokenValue
(#_g_scanner_cur_value *GScanner))
Now when I load the "gtk.lisp" file this defun is eventually evaluated and I get
this error:
> Error in process listener(1): Missing arguments in (OS::|g_scanner_cur_value|
*GSCANNER)
> While executing: CCL::%EXTERNAL-CALL-EXPANDER
> Type :POP to abort.
Type :? for other options.
When I look at the data that %external-call-expander is using to expand the
#_ expr this is what I see:
? (gethash 'os::|g_scanner_cur_value|
(ftd-external-function-definitions *target-ftd*)
#S(EXTERNAL-FUNCTION-DEFINITION :ENTRY-NAME "_g_scanner_cur_value" :ARG-SPECS (
:ADDRESS :ADDRESS) :RESULT-SPEC :VOID :MIN-ARGS 2)
For what its worth, here is my ffi loading expressions at the top of my
"gtk.lisp" file:
(in-package :gtk)
(eval-when (:compile-toplevel :execute)
(use-interface-dir :gtk2))
(eval-when (:compile-toplevel :load-toplevel :execute)
(open-shared-library "/sw/lib/libgtk-x11-2.0.dylib"))
Any ideas on what could be causing the expanders info entry to be expecting two
args when the sources only list one?? Note that the :RESULT spec also seems
bogus. Any tips greatly appreciated!
Rick Taube
Associate Professor, Composition/Theory
School of Music
University of Illinois
Urbana, IL
More information about the Openmcl-devel
mailing list