2013/6/18 Marc Feeley <feeley@iro.umontreal.ca>
These functions already exist:

> (##object->encoding (cons 11 22))
4562002011
> (##encoding->object 4562002011)
(11 . 22)

Of course, this is unsafe...
 
Great! 

The container_body is a pointer to the body of the copied object.  So it is the new location.

Super!
 

> (Or alternatively, how do I cancel the garbage collection, and get the ___SCMOBJ for container_body in its present location)

I don't think aborting a GC is safe.  *Don't do it*

Ok. Considering the above there's no reason anyhow.
 

Soo:

The equivalence printing block, I defined now as

fprintf(stderr,"The scanned for object reference %lu was referenced to by %lu .\n",DEBUG_scanned_for_object_ref,(reference_location == IN_OBJECT) ? ((int*) container_body) : 0);

So if there's a valid object reference, it should be printed out. (The int typecast here may be a bit dirty but on this 32bit setup it should be non-destructive)

Run code:

(define a (vector 1 2 3))

(define b (lambda () a)) (define c (vector a)) (define d (list a))

(define r (##object->encoding a)) r


prints 3081924705.

In GDB, I do

set var DEBUG_scanned_for_object_ref=3081924705 
cont

and then in Gambit

(##gc)

And Gambit prints:

The scanned for object reference 3081924705 was referenced to by 0 .
The scanned for object reference 3081924705 was referenced to by 3083239844 .
The scanned for object reference 3081924705 was referenced to by 3083239968 .

The 0 should refer to the reference to the object from the global variable a, so that's fine.

Also, I guess we see here that the lambda refers to the global variable slot in a general way and not to this variable specifically, so therefore the lambda doesn't create an object reference.

Then to inspect the objects refering to a:

>  (##encoding->object 3083239844)
-302931863
>  (##encoding->object 3083239968)
-302931832

So something is invalid about doing what I did in the printf above, which should correspond to

___SCMOBJ newref = (reference_location == IN_OBJECT) ? ((int*) container_body) : ___FAL;

Em. The ___SCMOBJ *is* the new location, isn't it, so this should have worked - 

What did I miss, how is this done correctly?