[cffi-devel] NIL in foreign-funcall arglist
Hi there. Your current implementation of "parse-args-and-types" in src/function.lisp use destructuring clause in "loop" and tests the end(as i understood) of the arguments list by comparing second value with nil (defun parse-args-and-types (args) "Returns 4 values. Types, canonicalized types, args and return type." (let ((return-type :void)) (loop for (type arg) on args by #'cddr if arg collect type into types and collect (canonicalize-foreign-type type) into ctypes and collect arg into fargs else do (setf return-type type) finally (return (values types ctypes fargs return-type))))) but it also causes foreign-funcall to skip argument if it's value is NIL: (define-foreign-type ptr-type () () (:actual-type :pointer) (:simple-parser some-type)) (defmethod translate-to-foreign (val (type ptr-type)) (if (null val) (null-pointer) val)) (foreign-funcall "f" :uint x some-type nil :uint y :void) ==> (LET ((#:G13879 X)) (LET ((#:G13880 Y)) (CFFI-SYS:%FOREIGN-FUNCALL "f" (:UNSIGNED-INT #:G13879 :UNSIGNED-INT #:G13880 :VOID) :CALLING-CONVENTION :CDECL :LIBRARY :DEFAULT))) Shouldn't that function be written like this(for example)? (defun parse-args-and-types (args) "Returns 4 values. Types, canonicalized types, args and return type." (let* ((len (length args)) (return-type (if (oddp len) (car (last args)) :void))) (loop repeat (floor len 2) for (type arg) on args by #'cddr collect type into types collect (canonicalize-foreign-type type) into ctypes collect arg into fargs finally (return (values types ctypes fargs return-type))))) p.s. sorry for my bad english :)
On Sat, May 16, 2009 at 9:07 PM, D. I. <lovesan.ru@gmail.com> wrote:
Your current implementation of "parse-args-and-types" in src/function.lisp use destructuring clause in "loop" and tests the end(as i understood) of the arguments list by comparing second value with nil
Thanks for the report and the fix, which I've pushed to the repository. -- Luís Oliveira http://student.dei.uc.pt/~lmoliv/
participants (2)
-
D. I.
-
Luís Oliveira