Bug #3011: caller for recursive function
http://redmine.ruby-lang.org/issues/show/3011

Author: Marc-Andre Lafortune
Status: Open, Priority: Low
Assigned to: Nobuyoshi Nakada, Category: core, Target version: Ruby 1.8.8
ruby -v: ruby 1.8.8dev (2010-03-25) [i386-darwin10.2.0] 

For some reason, Ruby 1.8 will skip multiple copies of the same method. In case of a recursive function call, the behavior is different from Ruby 1.9 and seems wrong.

Here's the rubyspec I just committed:

    it "returns one entry per call, even for recursive methods" do
      def recurse(n)
        return caller if n <= 0
        recurse(n-1)
      end
      (recurse(3).size - recurse(2).size).should == 1
    end

The following patch doesn't seem to yield any new failure with make test, make test-all, nor the caller specs:

diff --git a/eval.c b/eval.c
index 3407548..65fb970 100644
--- a/eval.c
+++ b/eval.c
@@ -6468,9 +6468,6 @@ backtrace(lev)
     }
     for (; frame && (n = frame->node); frame = frame->prev) {
        if (frame->prev && frame->prev->last_func) {
-           if (frame->prev->node == n) {
-               if (frame->prev->last_func == frame->last_func) continue;
-           }
            snprintf(buf, BUFSIZ, "%s:%d:in `%s'",
                     n->nd_file, nd_line(n),
                     rb_id2name(frame->prev->last_func));


Nobu, can you recall what was the reason for these lines ( r10593 ) ?


----------------------------------------
http://redmine.ruby-lang.org