The data is user-defined so that's why it might change. There's a small bug in 
the second part of your example but I get the idea. Using ptr-set! directly 
gives me the same problem with the garbage collector, probably because it isn't 
pointing to an immobile cell anymore. Wrapping it up with a 
'malloc-immobile-cell' makes everything work. Here's a full example if anyone's 
interested:

(define (cpBodyGetData cpBody) ; get the contents of the old cell
   (ptr-ref (cpBody-data cpBody))

(define (cpBodySetData cpBody val) ; change it to a new cell
   (free-immobile-cell (cpBody-data cpBody))
   (set-cpBody-data! cpBody (malloc-immobile-cell val)))

This of course requires that an initial (empty) cell is set when make-cpBody is 
called, since no predicate is available to test the data pointer.

Thanks again,

Sam
-----Oorspronkelijk bericht-----
Van: Matthew Flatt [mailto:[email protected]] 
Verzonden: maandag 4 maart 2013 18:26
Aan: Sam Vervaeck
CC: 'users'
Onderwerp: Re: [racket] FFI Pointing to racket objects

At Mon, 4 Mar 2013 18:06:10 +0100, "Sam Vervaeck" wrote:
> Just one more question: when implementing malloc-immobile-cell and 
> free-immobile-cell, how do you check if a pointer has not yet been 
> set? Doing things like:
> 
> (if (cpBody-data body1)
>      "I have some data"
>      "I have nothing")
> 
> Always shows "I have nothing".

I expected that the `data' field would have an immutable-cell value --- which 
might contain #f but not be #f itself --- so I expected "I have some data" 
always.

You should use `ptr-ref' and `pre-set!' to get or change the value in an 
immobile cell. Here's an example transcript:

> (define-cstruct _cpBody ([data _racket])) 
> (define b (make-cpBody (malloc-immobile-cell #f))) 
> (cpBody-data b)  #<cpointer> 
> (ptr-ref (cpBody-data b) _racket)  #f  
> (ptr-set! (cpBody-data b) _racket 'something) 
> (collect-garbage)
> (ptr-ref (cpBody-data b) _racket)  'something




____________________
  Racket Users list:
  http://lists.racket-lang.org/users

Reply via email to