[Resend] How to free the array element

Huang, Ying huang_ying_caritas at 163.com
Sat Apr 11 00:50:09 UTC 2015


Hi, All,

I found the format of my original email is not correct (sent with web
mail), and I got no response for some while, so I resend it in Emacs,
hopes it works better this time.

I am working on cl-gobject-introspection
(https://github.com/andy128k/cl-gobject-introspection), a common lisp
gobject introspection binding. I was trying to use extended foreign type
system of CFFI to implement some foreign memory operations. I have some
questions about that.

I need to manipulate foreign array. I tried to define an extended
foreign array type because there are some features that are lacking in
foreign-array-type of cffi. I can access/assign element of foreign array
with cffi:mem-ref and (setf cffi:mem-ref). But I don't know how to free
element of foreign array (the element type can be aggregated).

Then I checked foreign-array-type implementation of CFFI, and found
there appears no way to free translated element of array with that type
too. For example:

(defvar *string-array* (cffi:convert-to-foreign #("a" "b" "c")
                        '(:array :string 3)))

(cffi:free-foreign-object *string-array* '(:array :string 3) t)

The translated foreign objects corresponding to string "a", "b" and "c"
are not freed if my understanding were correct.

I think if there is a cffi:mem-free (I know, the name is bad) like
cffi:mem-ref, may be this can be resolved.

(defun mem-free (ptr type param &optional (offset 0))
  (let* ((parsed-type (parse-type type))
         (ctype (canonicalize parsed-type)))
    (if (aggregatep parsed-type)
        (free-translated-object (inc-pointer ptr offset)
                                parsed-type param)
        (free-translated-object (%mem-ref ptr ctype offset)
                                parsed-type param))))

I think you guys may have better idea about how to resolve the question.

Best Regards,
Huang, Ying




More information about the cffi-devel mailing list