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 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?