[cffi-devel] Re: patch for uffi-compat

Luís Oliveira luismbo at gmail.com
Mon Dec 26 14:02:47 UTC 2005


Novikov Leonid <ln at bk.ru> writes:
> Yes really this works well. However this will not help for instance in
> such event:
> (defun any-func ()
>      (let ((ptr (uffi:allocate-foreign-object '(:array :int 10))))
>     ; some actions are produced with ptr
>     (uffi:free-foreign-object ptr))
>   )

Ok, one more patch:

diff -rN -u cffi-old/uffi-compat/uffi-compat.lisp cffi-new/uffi-compat/uffi-compat.lisp
--- cffi-old/uffi-compat/uffi-compat.lisp       2005-12-21 12:00:02.000000000 +0000
+++ cffi-new/uffi-compat/uffi-compat.lisp       2005-12-26 12:59:25.000000000 +0000
@@ -255,7 +255,10 @@
(defmacro allocate-foreign-object (type &optional (size 1))
   "Allocate one or more instance of a foreign type."
-  `(cffi:foreign-alloc (convert-uffi-type ,type) :count ,size))
+  `(cffi:foreign-alloc ,(if (constantp type)
+                            `',(convert-uffi-type (eval type))
+                            `(convert-uffi-type ,type))
+                       :count ,size))
(defmacro free-foreign-object (ptr)
   "Free a foreign object allocated by ALLOCATE-FOREIGN-OBJECT."


So, with this patch you get:

UFFI> (macroexpand-1 '(allocate-foreign-object '(:array :int 10)))
(CFFI:FOREIGN-ALLOC '(UFFI-ARRAY :INT 10) :COUNT 1)

This foreign-alloc call will then be optimized by the (yet to be written)
compiler macro on foreign-alloc which will calculate the size beforehand
when TYPE and COUNT are constant.


> Object uffi-array-type will create On each call of this functions. If
> for time of the functioning the program such call several thousand
> that  computer memory ends.

Well, since those instances of foreign-type won't be needed anymore,
they should be garbage collected. They only reason they aren't is
because I was saving them in the *foreign-types* hashtable for lame
reasons that no longer exist, so this patch will fix that:

diff -rN -u cffi-old/src/early-types.lisp cffi-new/src/early-types.lisp
--- cffi-old/src/early-types.lisp       2005-12-11 04:54:41.000000000 +0000
+++ cffi-new/src/early-types.lisp       2005-12-26 13:35:50.000000000 +0000
@@ -92,9 +92,7 @@
       (let* ((type-spec (mklist type-spec-or-name))
              (parser (find-type-parser (car type-spec))))
         (if parser
-            (let ((new-type (apply parser (cdr type-spec))))
-              (notice-foreign-type new-type)
-              new-type)
+            (apply parser (cdr type-spec))
             (error "Unknown CFFI type: ~S." type-spec-or-name)))))
;;;# Generic Functions on Types


Many thanks for pointing these issues out. Also, I'll keep in mind your
patch if the need for a general way to cache types arises.

-- 
Luís Oliveira
luismbo (@) gmail (.) com
Equipa Portuguesa do Translation Project
http://www.iro.umontreal.ca/translation/registry.cgi?team=pt




More information about the cffi-devel mailing list