At Sun, 26 Jan 2014 09:59:17 +0400, Roman Klochkov wrote: > > > (define a #"abcd") > > (define a0 (cast (cast a _bytes _pointer) _pointer _bytes)) > > (eq? a a0) > #f > > (bytes-set! a0 2 33) > > a > #"ab!d" > > (immutable? a) > #t > So I have two different objects with the same pointer. Will garbage collector > work correct in this situation?
That should be (define a0 (cast (cast a _bytes _gcpointer) _gcpointer _bytes)) Otherwise, between the time that the first `cast` returns and the second `cast` allocates a byte string, there could be a GC that moves the byte string's content. If the content moves during that time, the reference produced by the first `cast` would not get updated, since it isn't marked as a reference to GCable. > I mean, it should see two reference to the same object in memory. > Or it will try to collect the bytestring when 'a' will become inaccessible? Since `a` and `a0` both reference the bytes as an GCable address, things will work fine. Specifically, the GC will retains the bytes as long as either `a` or `a0` is live. (Of course, using the FFI to change objects that are supposed to be immutable can create all sorts of other trouble, but I assume that was just to illustrate that the two byte-string objects reference the same bytes.) ____________________ Racket Users list: http://lists.racket-lang.org/users

