2013/6/20 Marc Feeley <feeley@iro.umontreal.ca>I will study your implementation soon. I do have a few comments at this point:
1) It would be nice if there was more information in the resulting list when the reference is not in an object. For example a string which names the global variable which references the object, a fixnum giving the number of the register which references the object, etc).
Yeah!
'register:current-thread'register:run-queue'register:gvm-registers'register:symbol-table'register:keyword-table'will-list:nonexecutable'will-list:executable'continuation'rc
$ gscGambit v4.6.9> (define a "Hi")> (##resolve-referencing-objects a)(register:gvm-registers register:gvm-registers a)> (##resolve-referencing-objects (current-thread))(register:current-threadregister:gvm-registersregister:gvm-registers#<thread #1 primordial>#<thread #1 primordial>#<run-queue #2>#<run-queue #2>#<run-queue #2>#<repl-channel-ports #3>#<thread-group #4 primordial>#<thread-group #4 primordial>)> (load "dig-out-gc-roots-graph.scm")> (define a "Hi")> (define b (list a a))> (define c (vector b b))> (dig-out-gc-roots-graph a)Digging out the GC roots for object #2...References to object #2:#2#3 (In work queue)#4 (In work queue)continuation~#aReferences to object #2:#2#3 (In work queue)#4#5 (In work queue)#5 (In work queue)~#bcontinuation~#a
References to object #2:#2#3#4 (In work queue)#4#5 (In work queue)#5 (In work queue)~#bcontinuation~#aReferences to object #2:#2#3#4 (In work queue)#4#5 (In work queue)#5~#c~#bcontinuation~#aReferences to object #2:#2#3#4 (In work queue)#4#5 (This object was already found at a lower depth in the graph.)#5~#c~#bcontinuation~#a
References to object #2:#2#3#4 (This object was already found at a lower depth in the graph.)#4#5 (This object was already found at a lower depth in the graph.)#5~#c~#bcontinuation~#aDone!All the objects that refer to this object in total (+ the object itself) are: #2 #4 #5 #3All the objects that refer to this object closest to the root in total are: #5>
> (import lib/track_leaks)> (define a "Hi")> (make-will a (lambda (v) (void)))> (##resolve-referencing-objects a)(register:gvm-registers register:gvm-registers ~#a will-list:nonexecutable)> (##resolve-referencing-objects a)(register:gvm-registers register:gvm-registers ~#a will-list:nonexecutable)> (##resolve-referencing-objects a)(register:gvm-registers register:gvm-registers ~#a will-list:nonexecutable)> (##resolve-referencing-objects a)(register:gvm-registers register:gvm-registers ~#a #<will #3>)> (##resolve-referencing-objects a)(register:gvm-registers register:gvm-registers ~#a will-list:nonexecutable)> (##resolve-referencing-objects a)(register:gvm-registers register:gvm-registers ~#a will-list:nonexecutable)> (##resolve-referencing-objects a)(register:gvm-registers register:gvm-registers ~#a will-list:nonexecutable)> (##resolve-referencing-objects a)(register:gvm-registers register:gvm-registers ~#a #<will #3>)> (##resolve-referencing-objects a)(register:gvm-registers register:gvm-registers ~#a will-list:nonexecutable)> (##resolve-referencing-objects a)(register:gvm-registers register:gvm-registers ~#a will-list:nonexecutable)> (##resolve-referencing-objects a)(register:gvm-registers register:gvm-registers ~#a will-list:nonexecutable)> (##resolve-referencing-objects a)(register:gvm-registers register:gvm-registers ~#a #<will #3>)> (##resolve-referencing-objects a)(register:gvm-registers register:gvm-registers ~#a will-list:nonexecutable)> (##resolve-referencing-objects a)(register:gvm-registers register:gvm-registers ~#a will-list:nonexecutable)> (##resolve-referencing-objects a)(register:gvm-registers register:gvm-registers ~#a will-list:nonexecutable)> (##resolve-referencing-objects a)(register:gvm-registers register:gvm-registers ~#a #<will #3>)> 11> 22> 33> 44> (##gc)> (##resolve-referencing-objects a)(register:gvm-registers register:gvm-registers ~#a #<will #3>)> (##resolve-referencing-objects a)(register:gvm-registers register:gvm-registers ~#a will-list:nonexecutable)> (##resolve-referencing-objects a)(register:gvm-registers register:gvm-registers ~#a will-list:nonexecutable)> (##resolve-referencing-objects a)(register:gvm-registers register:gvm-registers ~#a will-list:nonexecutable)