On 09/16/2011 09:04 PM, John Clements wrote:
On Sep 16, 2011, at 3:06 PM, John Clements wrote:

I'm trying to backport working FFI code to 5.1.3, and I'm having trouble 
referring to elements of a C struct. Specifically, in the presence of this 
definition

(define-cstruct _rack-audio-closure
  ([sound         _pointer]
   [cur-sample    _ulong]
   [num-samples   _ulong]
   [stop-now      _bool]
   [stop-sema-ptr _pointer]))

using the function (rack-audio-closure-cur-sample) on the result of an FFI call 
with signature

(_fun _pointer _ulong _pointer ->  _rack-audio-closure-pointer)

produces this error:

rack-audio-closure-cur-sample: expected argument of type<struct:rack-audio-closure>; 
given #<cpointer:rack-audio-closure>

in 5.1.3, but it works just fine in the git head.
More research suggests that the problem is more limited; it looks like a problem of 
generativity. That is, if I have two modules that declare the "same" cstruct 
(same name, same fields, same types) then cpointers to these structures returned by 
functions from the first module cannot be accessed in the other module.

in 5.1.3 "same" cstructs defined in two different modules could not inter-operate.
Each place has it own copy of modules, so
the "same" cstruct defined in the same module but in two different places wouldn't inter-operate either.
Hence the change.


AFAICT, This is not the case in more recent versions; that is, these cstructs 
are not generative.  Assuming this is deliberate, I could document it.

This is deliberate.  It allows foreign pointers to be shared between places.

The following text was removed from the documentation in the head version because cstructs are not generative anymore.

Note that tags are compared with @racket[eq?] (or @racket[memq]), which means
an interface can hide its value from users (e.g., not provide the
@racket[cpointer-tag] accessor), which makes such pointers un-fake-able.

If you would like document the fact that cstructs are generative only up to version 5.1.3. I think that improve the docs.
Thanks,

Kevin

John



_________________________________________________
   For list-related administrative tasks:
   http://lists.racket-lang.org/listinfo/dev

_________________________________________________
  For list-related administrative tasks:
  http://lists.racket-lang.org/listinfo/dev

Reply via email to