<div><br></div><div>Update:</div><br><div class="gmail_quote">2013/6/20 Mikael <span dir="ltr"><<a href="mailto:mikael.rcv@gmail.com" target="_blank">mikael.rcv@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<br><br><div class="gmail_quote"><div>2013/6/20 Marc Feeley <span dir="ltr"><<a href="mailto:feeley@iro.umontreal.ca" target="_blank">feeley@iro.umontreal.ca</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">






I will study your implementation soon.  I do have a few comments at this point:<br>
<br>
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).<br>






</blockquote><div><br></div></div><div>Yeah!</div></div></blockquote><div><br></div><div>Following your suggestion above I made so that instead of non-object references leading to #!unbound , they lead to one of the following symbols:</div>





<div><br></div></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_quote"><div><div>'register:current-thread</div><div>'register:run-queue</div><div>'register:gvm-registers</div>





<div>'register:symbol-table</div><div>'register:keyword-table</div><div>'will-list:nonexecutable</div><div>'will-list:executable</div><div>'continuation</div><div>'rc</div></div></div></blockquote>





<div class="gmail_quote"><div><br></div><div>..and global variables lead to their name, as a symbol.</div><div><br></div><div>And added a variable so that the search is done only during |##resolve-referencing-objects| and the code path is disabled otherwise.</div>




<div><br></div><div>And last, made |##resolve-referencing-objects| return a plain list again as I found a way to do reference graph probing without using weak references.</div><div><br></div><div>Example use:</div><div><br>




</div></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_quote"><div><div><font face="courier new, monospace">$ gsc</font></div><div><font face="courier new, monospace">Gambit v4.6.9</font></div>



<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">> (define a "Hi")</font></div><div><font face="courier new, monospace">> (##resolve-referencing-objects a)</font></div>



<div><font face="courier new, monospace">(register:gvm-registers register:gvm-registers a)</font></div><div><font face="courier new, monospace">> (##resolve-referencing-objects (current-thread))</font></div><div><font face="courier new, monospace">(register:current-thread</font></div>



<div><font face="courier new, monospace"> register:gvm-registers</font></div><div><font face="courier new, monospace"> register:gvm-registers</font></div><div><font face="courier new, monospace"> #<thread #1 primordial></font></div>



<div><font face="courier new, monospace"> #<thread #1 primordial></font></div><div><font face="courier new, monospace"> #<run-queue #2></font></div><div><font face="courier new, monospace"> #<run-queue #2></font></div>



<div><font face="courier new, monospace"> #<run-queue #2></font></div><div><font face="courier new, monospace"> #<repl-channel-ports #3></font></div><div><font face="courier new, monospace"> #<thread-group #4 primordial></font></div>



<div><font face="courier new, monospace"> #<thread-group #4 primordial>)</font></div></div><div><font face="courier new, monospace">> (load "dig-out-gc-roots-graph.scm")</font></div><div><div><font face="courier new, monospace">> (define a "Hi")</font></div>



<div><font face="courier new, monospace">> (define b (list a a))</font></div><div><font face="courier new, monospace">> (define c (vector b b))</font></div><div><font face="courier new, monospace">> (dig-out-gc-roots-graph a)</font></div>



<div><font face="courier new, monospace">Digging out the GC roots for object #2...</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">References to object #2:</font></div>



<div><font face="courier new, monospace">#2</font></div><div><font face="courier new, monospace">  #3 (In work queue)</font></div><div><font face="courier new, monospace">  #4 (In work queue)</font></div><div><font face="courier new, monospace">  continuation</font></div>



<div><font face="courier new, monospace">  ~#a</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">References to object #2:</font></div><div><font face="courier new, monospace">#2</font></div>



<div><font face="courier new, monospace">  #3 (In work queue)</font></div><div><font face="courier new, monospace">  #4</font></div><div><font face="courier new, monospace">    #5 (In work queue)</font></div><div><font face="courier new, monospace">    #5 (In work queue)</font></div>



<div><font face="courier new, monospace">    ~#b</font></div><div><font face="courier new, monospace">  continuation</font></div><div><font face="courier new, monospace">  ~#a</font></div><div><font face="courier new, monospace"><br>



</font></div><div><font face="courier new, monospace">References to object #2:</font></div><div><font face="courier new, monospace">#2</font></div><div><font face="courier new, monospace">  #3</font></div><div><font face="courier new, monospace">    #4 (In work queue)</font></div>



<div><font face="courier new, monospace">  #4</font></div><div><font face="courier new, monospace">    #5 (In work queue)</font></div><div><font face="courier new, monospace">    #5 (In work queue)</font></div><div><font face="courier new, monospace">    ~#b</font></div>



<div><font face="courier new, monospace">  continuation</font></div><div><font face="courier new, monospace">  ~#a</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">References to object #2:</font></div>



<div><font face="courier new, monospace">#2</font></div><div><font face="courier new, monospace">  #3</font></div><div><font face="courier new, monospace">    #4 (In work queue)</font></div><div><font face="courier new, monospace">  #4</font></div>



<div><font face="courier new, monospace">    #5 (In work queue)</font></div><div><font face="courier new, monospace">    #5</font></div><div><font face="courier new, monospace">      ~#c</font></div><div><font face="courier new, monospace">    ~#b</font></div>



<div><font face="courier new, monospace">  continuation</font></div><div><font face="courier new, monospace">  ~#a</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">References to object #2:</font></div>



<div><font face="courier new, monospace">#2</font></div><div><font face="courier new, monospace">  #3</font></div><div><font face="courier new, monospace">    #4 (In work queue)</font></div><div><font face="courier new, monospace">  #4</font></div>



<div><font face="courier new, monospace">    #5 (This object was already found at a lower depth in the graph.)</font></div><div><font face="courier new, monospace">    #5</font></div><div><font face="courier new, monospace">      ~#c</font></div>



<div><font face="courier new, monospace">    ~#b</font></div><div><font face="courier new, monospace">  continuation</font></div><div><font face="courier new, monospace">  ~#a</font></div><div><font face="courier new, monospace"><br>



</font></div><div><font face="courier new, monospace">References to object #2:</font></div><div><font face="courier new, monospace">#2</font></div><div><font face="courier new, monospace">  #3</font></div><div><font face="courier new, monospace">    #4 (This object was already found at a lower depth in the graph.)</font></div>



<div><font face="courier new, monospace">  #4</font></div><div><font face="courier new, monospace">    #5 (This object was already found at a lower depth in the graph.)</font></div><div><font face="courier new, monospace">    #5</font></div>



<div><font face="courier new, monospace">      ~#c</font></div><div><font face="courier new, monospace">    ~#b</font></div><div><font face="courier new, monospace">  continuation</font></div><div><font face="courier new, monospace">  ~#a</font></div>



<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">Done!</font></div><div><font face="courier new, monospace">All the objects that refer to this object in total (+ the object itself) are: #2 #4 #5 #3</font></div>



<div><font face="courier new, monospace">All the objects that refer to this object closest to the root in total are: #5</font></div><div><font face="courier new, monospace">></font></div></div><div><br></div></div></blockquote>



<div class="gmail_quote"><div><br></div><div>An interesting oddity, that I don't see any reason for but that doesn't hurt is that references from wills generally is returned as 'will-list:nonexecutable but sometimes as the will object itself - this is only for wills that don't have an active reference from anywhere, such as from a global:</div>


<div><br></div></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_quote"><div><div><font face="courier new, monospace">> (import lib/track_leaks)</font></div><div><font face="courier new, monospace">> (define a "Hi")</font></div>


<div><font face="courier new, monospace">> (make-will a (lambda (v) (void)))</font></div><div><div><font face="courier new, monospace">> (##resolve-referencing-objects a)</font></div><div><font face="courier new, monospace">(register:gvm-registers register:gvm-registers ~#a will-list:nonexecutable)</font></div>


<div><font face="courier new, monospace">> (##resolve-referencing-objects a)</font></div><div><font face="courier new, monospace">(register:gvm-registers register:gvm-registers ~#a will-list:nonexecutable)</font></div>


<div><font face="courier new, monospace">> (##resolve-referencing-objects a)</font></div><div><font face="courier new, monospace">(register:gvm-registers register:gvm-registers ~#a will-list:nonexecutable)</font></div>


<div><font face="courier new, monospace">> (##resolve-referencing-objects a)</font></div><div><font face="courier new, monospace">(register:gvm-registers register:gvm-registers ~#a #<will #3>)</font></div><div><font face="courier new, monospace">> (##resolve-referencing-objects a)</font></div>


<div><font face="courier new, monospace">(register:gvm-registers register:gvm-registers ~#a will-list:nonexecutable)</font></div><div><font face="courier new, monospace">> (##resolve-referencing-objects a)</font></div>


<div><font face="courier new, monospace">(register:gvm-registers register:gvm-registers ~#a will-list:nonexecutable)</font></div><div><font face="courier new, monospace">> (##resolve-referencing-objects a)</font></div>


<div><font face="courier new, monospace">(register:gvm-registers register:gvm-registers ~#a will-list:nonexecutable)</font></div><div><font face="courier new, monospace">> (##resolve-referencing-objects a)</font></div>


<div><font face="courier new, monospace">(register:gvm-registers register:gvm-registers ~#a #<will #3>)</font></div><div><font face="courier new, monospace">> (##resolve-referencing-objects a)</font></div><div><font face="courier new, monospace">(register:gvm-registers register:gvm-registers ~#a will-list:nonexecutable)</font></div>


<div><font face="courier new, monospace">> (##resolve-referencing-objects a)</font></div><div><font face="courier new, monospace">(register:gvm-registers register:gvm-registers ~#a will-list:nonexecutable)</font></div>


<div><font face="courier new, monospace">> (##resolve-referencing-objects a)</font></div><div><font face="courier new, monospace">(register:gvm-registers register:gvm-registers ~#a will-list:nonexecutable)</font></div>


<div><font face="courier new, monospace">> (##resolve-referencing-objects a)</font></div><div><font face="courier new, monospace">(register:gvm-registers register:gvm-registers ~#a #<will #3>)</font></div><div><font face="courier new, monospace">> (##resolve-referencing-objects a)</font></div>


<div><font face="courier new, monospace">(register:gvm-registers register:gvm-registers ~#a will-list:nonexecutable)</font></div><div><font face="courier new, monospace">> (##resolve-referencing-objects a)</font></div>


<div><font face="courier new, monospace">(register:gvm-registers register:gvm-registers ~#a will-list:nonexecutable)</font></div><div><font face="courier new, monospace">> (##resolve-referencing-objects a)</font></div>


<div><font face="courier new, monospace">(register:gvm-registers register:gvm-registers ~#a will-list:nonexecutable)</font></div><div><font face="courier new, monospace">> (##resolve-referencing-objects a)</font></div>


<div><font face="courier new, monospace">(register:gvm-registers register:gvm-registers ~#a #<will #3>)</font></div><div><font face="courier new, monospace">> 1</font></div><div><font face="courier new, monospace">1</font></div>


<div><font face="courier new, monospace">> 2</font></div><div><font face="courier new, monospace">2</font></div><div><font face="courier new, monospace">> 3</font></div><div><font face="courier new, monospace">3</font></div>


<div><font face="courier new, monospace">> 4</font></div><div><font face="courier new, monospace">4</font></div><div><font face="courier new, monospace">> (##gc)</font></div><div><font face="courier new, monospace">> (##resolve-referencing-objects a)</font></div>


<div><font face="courier new, monospace">(register:gvm-registers register:gvm-registers ~#a #<will #3>)</font></div><div><font face="courier new, monospace">> (##resolve-referencing-objects a)</font></div><div><font face="courier new, monospace">(register:gvm-registers register:gvm-registers ~#a will-list:nonexecutable)</font></div>


<div><font face="courier new, monospace">> (##resolve-referencing-objects a)</font></div><div><font face="courier new, monospace">(register:gvm-registers register:gvm-registers ~#a will-list:nonexecutable)</font></div>


<div><font face="courier new, monospace">> (##resolve-referencing-objects a)</font></div><div><font face="courier new, monospace">(register:gvm-registers register:gvm-registers ~#a will-list:nonexecutable)</font></div>


</div></div><div><br></div><div><br></div></div></blockquote><div class="gmail_quote"><div><br></div><div>Compilation is per the previous email.</div><div><br></div><div>I did not include any limiting mechanism on number of max references resolved by <span style="font-family:'courier new',monospace">##resolve-referencing-objects</span> , as such usecases are extremely rare anyhow - I mean, how many objects did you ever have so many references to that <span style="font-family:'courier new',monospace">##resolve-referencing-objects</span> 's response would occupy tens of megabytes?</div>


<div><br></div><div><br></div><div>Spontaneously this appears stable to me, and thus could be something to commit to the Gambit repo now.</div><div><br></div><div>Marc would probably have some suggestions for making the code better and more conformant to Gambit's general code style.</div>


<div>
<br></div><div><br></div><div><br></div><div>Best regards,</div><div>Mikael</div><div><br></div></div>