Martin Simmons martin@lispworks.com writes:
Luis> CFFI> (foreign-alloc :int :initial-contents #(1 2 3)) Luis> #<A Mac Pointer #x1022E0> Luis> CFFI> (loop for i from 0 below 3 Luis> collect (mem-ref * :int i)) Luis> (1 2 3)
Luis> ;; Another note: what should should be in (mem-ref ** :int 3)? Luis> ;; Zero? Ie. Should these previous two calls to foreign-alloc Luis> ;; allocate 3*sizeof(int) or 4*sizeof(int) bytes? Lispworks seems to Luis> ;; do the latter.
LispWorks allocates 3*sizeof(int), but the C heap manager might round this up to 4. (mem-ref ** :int 3) should be expected to give a random result or a crash.
Yeah, that makes sense. My thoughts about 0 terminating such an array is probably a symptom of a missing :array type.
Luis> CFFI> (foreign-alloc :string :initial-element "foo") Luis> ;; I think this should do something similar to CLISP's Luis> ;; FFI:ALLOCATE-DEEP, and it should Just Work if we apply the :to-c Luis> ;; translator, which will allocate space for "foo".
I think it depends on whether the :STRING type is an array type, a pointer type or some magic.
CFFI's :string is a pointer and the translator will allocate memory for "foo", so will actually get a char** in this case, not a char*. Hmm..
Luis> ;; A problem here is freeing this memory. Should we tell the user Luis> ;; he has to free the complex stuff inside by himself. Or should we Luis> ;; come up with something similar to CLISP's FFI:FOREIGN-FREE when Luis> ;; passed ":full t". (In this case CFFI:FOREIGN-FREE would have to Luis> ;; take an optional type or something to describe what needs Luis> ;; freeing.)
Complex stuff is complex to free, so I would say that the user has to do it.
Well, I'm going with that. Experience will tell if this is needed or not.
Thanks for your feedback!
Meanwhile, I have implemented this and renamed foreign-alloc to %foreign-alloc (and didn't export this). James, before I rename every foreign-alloc in cffi-*.lisp do you think we should export %foreign-alloc (and rename it to malloc) or not?
By the way, I remember now I found some bugs in Lispworks's FLI (I'm using Lispworks 4.4.5 Personal Edition), will report them tomorrow with some test cases.