# \[Bug #3316\] Kernel#caller returns nil as well

**URL:** <https://www.ruby-forum.com/t/bug-3316-kernel-caller-returns-nil-as-well/188836>\
**Category:** Development\
**Created:** [May 19, 2010, 5:49am UTC](https://www.ruby-forum.com/t/bug-3316-kernel-caller-returns-nil-as-well/188836 "2010-05-19T05:49:33Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![Nobuhiro\_IMAI](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/9f8e36/32.png) [@Nobuhiro\_IMAI](https://www.ruby-forum.com/u/Nobuhiro_IMAI)\
**Post date:** [May 19, 2010, 5:49am UTC](https://www.ruby-forum.com/t/bug-3316-kernel-caller-returns-nil-as-well/188836/1 "2010-05-19T05:49:33Z")

</div>

Bug #3316: Kernel#caller returns nil as well  
[http://redmine.ruby-lang.org/issues/show/3316](http://redmine.ruby-lang.org/issues/show/3316)

e$B5/I\<\<Te(B: Nobuhiro IMAI  
e$B%9%F!\<%?%9e(B: Open, e$BM%@hEYe(B: Normal  
e$B%+%F%4%je(B: DOC  
ruby -v: -

[ruby-dev:41330] e$B$N7o$G$9$,!"%H%C%W%l%Y%k1\>!9$OCV$$$H$$$F!“e(B  
nil e$B$,JV$k$3$H$b$”$k$H$$$&$N$re(B RDoc e$B$K=q$$$F$\_$^$7$?!#e(B  
trunk e$B$de(B branches/ruby\_1\_9\_2 e$B$K$=$N$^$^Ev$?$k$H;W$$$^$9!#e(B

---

<div class="post-metadata">

**Author:** ![Nobuhiro\_IMAI](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/9f8e36/32.png) [@Nobuhiro\_IMAI](https://www.ruby-forum.com/u/Nobuhiro_IMAI)\
**Post date:** [May 19, 2010, 1:06pm UTC](https://www.ruby-forum.com/t/bug-3316-kernel-caller-returns-nil-as-well/188836/2 "2010-05-19T13:06:11Z")

</div>

e$B1sF#$G$9!#e(B

2010e$BG/e(B5e$B7ne(B19e$BF|e(B12:49 Nobuhiro IMAI  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> [ruby-dev:41330] e$B$N7o$G$9$,!"%H%C%W%l%Y%k1\>!9$OCV$$$H$$$F!“e(B  
> nil e$B$,JV$k$3$H$b$”$k$H$$$&$N$re(B RDoc e$B$K=q$$$F$\_$^$7$?!#e(B

e$BH?1~$,CY$/$F$9$\_$^$;$s!#e(B

e$B8+$?$H$3$me(B r21932 e$B$GF~$C$?JQ99$N$h$&$G$9$,!"e(BChangeLog  
e$B$K$h$k$He(B  
e$B:GE,2=$+%j%U%!%/%?%j%s%0$r0U?^$7$?$b$N$N$h$&$G!"5sF0JQ99\<+BN$Oe(B  
e$B0U?^$7$F$$$J$+$C$?$b$N$H;W$$$^$9!#e(B  
e$B%H%C%W%l%Y%k$G$O6uG[Ns$rJV$9$h$&$K=$@5$7$F$\*$-$^$9!#e(B

diff --git a/vm\_eval.c b/vm\_eval.c  
index 2bf640d…d1e6352 100644  
— a/vm\_eval.c  
+++ b/vm\_eval.c  
@@ -1562,7 +1562,7 @@ rb\_catch\_obj(VALUE tag, VALUE (\*func)(), VALUE  
data)  
static VALUE  
rb\_f\_caller(int argc, VALUE \*argv)  
{

- VALUE level;

- VALUE level, ary;  
int lev;

- return vm\_backtrace(GET\_THREAD(), lev);

- ary = vm\_backtrace(GET\_THREAD(), lev);
- if (NIL\_P(ary)) ary = rb\_ary\_new();
- return ary;  
}

static int

---

<div class="post-metadata">

**Author:** ![Nobuhiro\_IMAI](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/9f8e36/32.png) [@Nobuhiro\_IMAI](https://www.ruby-forum.com/u/Nobuhiro_IMAI)\
**Post date:** [May 19, 2010, 1:27pm UTC](https://www.ruby-forum.com/t/bug-3316-kernel-caller-returns-nil-as-well/188836/3 "2010-05-19T13:27:50Z")

</div>

e$B%A%1%C%He(B #3316 e$B$,99?7$5$l$^$7$?!#e(B (by Yusuke E.)

e$B%9%F!\<%?%9e(B Opene$B$+$ie(BClosede$B$KJQ99e(B  
e$B?JD=e(B % 0e$B$+$ie(B100e$B$KJQ99e(B

This issue was solved with changeset r27895.  
Nobuhiro, thank you for reporting this issue.  
Your contribution to Ruby is greatly appreciated.  
May Ruby be with you.

* * *

[http://redmine.ruby-lang.org/issues/show/3316](http://redmine.ruby-lang.org/issues/show/3316)

---

<div class="post-metadata">

**Author:** ![Nobuhiro\_IMAI](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/9f8e36/32.png) [@Nobuhiro\_IMAI](https://www.ruby-forum.com/u/Nobuhiro_IMAI)\
**Post date:** [May 19, 2010, 9:47pm UTC](https://www.ruby-forum.com/t/bug-3316-kernel-caller-returns-nil-as-well/188836/4 "2010-05-19T21:47:54Z")

</div>

e$B$$$^$$$G$9!#e(B

From: Yusuke ENDOH \<mame\_at\_tsg.ne.jp\>  
Date: Wed, 19 May 2010 20:05:45 +0900

> e$B8+$?$H$3$me(B r21932 e$B$GF~$C$?JQ99$N$h$&$G$9$,!"e(BChangeLog e$B$K$h$k$He(B  
> e$B:GE,2=$+%j%U%!%/%?%j%s%0$r0U?^$7$?$b$N$N$h$&$G!"5sF0JQ99\<+BN$Oe(B  
> e$B0U?^$7$F$$$J$+$C$?$b$N$H;W$$$^$9!#e(B  
> e$B%H%C%W%l%Y%k$G$O6uG[Ns$rJV$9$h$&$K=$@5$7$F$\*$-$^$9!#e(B

e$B$"$j$,$H$&$4$6$$$^$9!#e(B

e$B$,!"$3$l$@$H!"e(Bcaller(0)  
e$B$GJV$kG[Ns$N%5%$%:$r1[$($k?t$r0z?t$H$7$FEO$7$Fe(B  
e$B$b6uG[Ns$,JV$k$h$&$K$J$C$F$7$^$C$F$$$k$h$&$G$9!#e(B

$ ruby1.8 -ve ‘p [caller(0), caller(1), caller(2)]’  
ruby 1.8.8dev (2010-05-17 revision 26358) [i686-linux]  
[["-e:1"], [], nil]  
^^^  
$ ruby1.9 -ve 'p [caller(0), caller(1), caller(2)]  
‘ruby 1.9.3dev (2010-05-20 trunk 27911) [i686-linux]  
[["-e:1:in `’"], [], []]  
^^

# caller(0)[start…-1] e$B$H$$$&$3$H$J$N$+$J!#e(B

---

<div class="post-metadata">

**Author:** ![Nobuhiro\_IMAI](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/9f8e36/32.png) [@Nobuhiro\_IMAI](https://www.ruby-forum.com/u/Nobuhiro_IMAI)\
**Post date:** [May 20, 2010, 2:59pm UTC](https://www.ruby-forum.com/t/bug-3316-kernel-caller-returns-nil-as-well/188836/5 "2010-05-20T14:59:16Z")

</div>

e$B1sF#$G$9!#e(B

2010e$BG/e(B5e$B7ne(B20e$BF|e(B4:47 Nobuhiro IMAI [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> e$B$,!"$3$l$@$H!"e(Bcaller(0) e$B$GJV$kG[Ns$N%5%$%:$r1[$($k?t$r0z?t$H$7$FEO$7$Fe(B  
> e$B$b6uG[Ns$,JV$k$h$&$K$J$C$F$7$^$C$F$$$k$h$&$G$9!#e(B

e$B$0$“$”!“LdBj$r8m2r$7$F$$$^$7$?!#e(Bnil  
e$B$,5”$k$3$H$,$"$k$N$O85$+$i$J$s$G$9$M!#e(B  
e$B0J2\<$N%Q%C%A$G:FD)@o$7$^$9!#$=$l$+$iD:$$$?%Q%C%A$O\<h$j9~$s$G$\*$-$^$9!#e(B

diff --git a/vm.c b/vm.c  
index 084c8c8…ac1d8ed 100644  
— a/vm.c  
+++ b/vm.c  
@@ -706,19 +706,20 @@ rb\_vm\_get\_sourceline(const rb\_control\_frame\_t  
\*cfp)  
}

static int  
-vm\_backtrace\_each(rb\_thread\_t \*th, int lev, rb\_backtrace\_iter\_func  
\*iter, void \*arg)  
+vm\_backtrace\_each(rb\_thread\_t \*th, int lev, void (\*init)(void \*),  
rb\_backtrace\_iter\_func \*iter, void \*arg)  
{  
const rb\_control\_frame\_t \*limit\_cfp = th-\>cfp;  
const rb\_control\_frame\_t \*cfp = (void \*)(th-\>stack +  
th-\>stack\_size);

- VALUE file = Qnil;

- VALUE file = Qnil, \*aryp = arg;  
int line\_no = 0;

- if (++limit\_cfp \>= cfp) {

- if (++limit\_cfp \> cfp) {  
return FALSE;  
}  
}
- if (init) (\*init)(arg);  
limit\_cfp = RUBY\_VM\_NEXT\_CONTROL\_FRAME(limit\_cfp);  
if (th-\>vm-\>progname) file = th-\>vm-\>progname;  
while (cfp \> limit\_cfp) {  
@@ -747,15 +748,19 @@ vm\_backtrace\_each(rb\_thread\_t \*th, int lev,  
rb\_backtrace\_iter\_func \*iter, void \*  
return TRUE;  
}

+static void  
+vm\_backtrace\_alloc(void \*arg)  
+{

- VALUE \*aryp = arg;
- \*aryp = rb\_ary\_new();  
+}
- 

static int  
vm\_backtrace\_push(void \*arg, VALUE file, int line\_no, VALUE name)  
{  
VALUE \*aryp = arg;  
VALUE bt;

- if (!\*aryp) {
- \*aryp = rb\_ary\_new();
- }  
bt = rb\_enc\_sprintf(rb\_enc\_compatible(file, name), “%s:%d:in `%s’”,  
RSTRING\_PTR(file), line\_no, RSTRING\_PTR(name));  
rb\_ary\_push(\*aryp, bt);  
@@ -770,7 +775,7 @@ vm\_backtrace(rb\_thread\_t \*th, int lev)  
if (lev \< 0) {  
ary = rb\_ary\_new();  
}
- vm\_backtrace\_each(th, lev, vm\_backtrace\_push, &ary);

- vm\_backtrace\_each(th, lev, vm\_backtrace\_alloc, vm\_backtrace\_push,  
&ary);  
if (!ary) return Qnil;  
return rb\_ary\_reverse(ary);  
}  
diff --git a/vm\_eval.c b/vm\_eval.c  
index d1e6352…b854efc 100644  
— a/vm\_eval.c  
+++ b/vm\_eval.c  
@@ -16,7 +16,7 @@ static inline VALUE rb\_vm\_set\_finish\_env(rb\_thread\_t \*  
th);  
static inline VALUE vm\_yield\_with\_cref(rb\_thread\_t \*th, int argc,  
const VALUE \*argv, const NODE \*cref);  
static inline VALUE vm\_yield(rb\_thread\_t \*th, int argc, const VALUE  
\*argv);  
static inline VALUE vm\_backtrace(rb\_thread\_t \*th, int lev);  
-static int vm\_backtrace\_each(rb\_thread\_t \*th, int lev,  
rb\_backtrace\_iter\_func \*iter, void \*arg);  
+static int vm\_backtrace\_each(rb\_thread\_t \*th, int lev, void  
(\*init)(void \*), rb\_backtrace\_iter\_func \*iter, void \*arg);  
static NODE \*vm\_cref\_push(rb\_thread\_t \*th, VALUE klass, int noex,  
rb\_block\_t \*blockptr);  
static VALUE vm\_exec(rb\_thread\_t \*th);  
static void vm\_set\_eval\_stack(rb\_thread\_t \* th, VALUE iseqval, const  
NODE \*cref);  
@@ -1574,9 +1574,7 @@ rb\_f\_caller(int argc, VALUE \*argv)  
if (lev \< 0)  
rb\_raise(rb\_eArgError, “negative level (%d)”, lev);

- ary = vm\_backtrace(GET\_THREAD(), lev);
- if (NIL\_P(ary)) ary = rb\_ary\_new();
- return ary;

- return vm\_backtrace(GET\_THREAD(), lev);  
}

static int  
@@ -1598,7 +1596,7 @@ print\_backtrace(void \*arg, VALUE file, int line,  
VALUE method)  
void  
rb\_backtrace(void)  
{

- vm\_backtrace\_each(GET\_THREAD(), -1, print\_backtrace, stderr);

- vm\_backtrace\_each(GET\_THREAD(), -1, NULL, print\_backtrace, stderr);  
}

VALUE  
@@ -1629,7 +1627,7 @@ rb\_thread\_backtrace(VALUE thval)  
int  
rb\_backtrace\_each(rb\_backtrace\_iter\_func \*iter, void \*arg)  
{

- return vm\_backtrace\_each(GET\_THREAD(), -1, iter, arg);

- return vm\_backtrace\_each(GET\_THREAD(), -1, NULL, iter, arg);  
}

/\*

---

<div class="post-metadata">

**Author:** ![Nobuhiro\_IMAI](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/9f8e36/32.png) [@Nobuhiro\_IMAI](https://www.ruby-forum.com/u/Nobuhiro_IMAI)\
**Post date:** [May 24, 2010, 6:45pm UTC](https://www.ruby-forum.com/t/bug-3316-kernel-caller-returns-nil-as-well/188836/6 "2010-05-24T18:45:05Z")

</div>

e$B1sF#$G$9!#e(B

2010e$BG/e(B5e$B7ne(B22e$BF|e(B0:59 Nobuhiro IMAI [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> e$B$3$l$G!“e(B1.8 e$B$HF1$85sF0$K$J$C$F$$$k$H;W$$$^$9!#$H$$$&Lu$G!”$;$C$+$/%Q%Ce(B  
> e$B%A$r\<h$j9~$s$G$$$?$@$$$?$N$K!"e(BRDoc e$B$NJ}$,4V0c$$$K$J$C$F$7$^$$$^$7$?!#e(B

e$B$&$“$”!#e(B

> e$B0J2\<$N%Q%C%A$G@5$7$$5-=R$K$J$k$H;W$$$^$9!#$D$$$G$K!"e(B
> 
> - e$BB\>$N\>l=j$K9g$o$;$Fe(B s/Array/array/
> - e$B\<B:]$N=PNO$K9g$o$;$Fe(B in `’ e$B$rDI2Ce(B
> - caller(4) e$B$r=$@5!"e(Bcaller(5) e$B$rDI2Ce(B
> 
> e$B$H$$$&JQ99$r2C$($F$$$^$9!#9g$o$;$F\<h\<NA\*Br$7$F$/$@$5$$!#e(B

e$B$"$j$,$H$&$4$6$$$^$9!#$4$C$=$j\<h$j9~$\_$^$9!#e(B

---

<div class="post-metadata">

**Author:** ![Nobuhiro\_IMAI](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/9f8e36/32.png) [@Nobuhiro\_IMAI](https://www.ruby-forum.com/u/Nobuhiro_IMAI)\
**Post date:** [May 21, 2010, 5:59pm UTC](https://www.ruby-forum.com/t/bug-3316-kernel-caller-returns-nil-as-well/188836/7 "2010-05-21T17:59:49Z")

</div>

e$B$$$^$$$G$9!#e(B

From: Yusuke ENDOH \<mame\_at\_tsg.ne.jp\>  
Date: Thu, 20 May 2010 21:58:42 +0900

> e$B1sF#$G$9!#e(B
> 
> 2010e$BG/e(B5e$B7ne(B20e$BF|e(B4:47 Nobuhiro IMAI [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):
> 
> > e$B$,!"$3$l$@$H!"e(Bcaller(0) e$B$GJV$kG[Ns$N%5%$%:$r1[$($k?t$r0z?t$H$7$FEO$7$Fe(B  
> > e$B$b6uG[Ns$,JV$k$h$&$K$J$C$F$7$^$C$F$$$k$h$&$G$9!#e(B
> 
> e$B$0$“$”!“LdBj$r8m2r$7$F$$$^$7$?!#e(Bnil e$B$,5”$k$3$H$,$"$k$N$O85$+$i$J$s$G$9$M!#e(B  
> e$B0J2\<$N%Q%C%A$G:FD)@o$7$^$9!#$=$l$+$iD:$$$?%Q%C%A$O\<h$j9~$s$G$\*$-$^$9!#e(B

e$B%H%C%W%l%Y%k1\>!9$NOC$G:.Mp$5$;$F$7$^$C$?$+$b$7$l$^$;$s!#$4$a$s$J$5$$!#e(B

e$B$3$l$G!“e(B1.8  
e$B$HF1$85sF0$K$J$C$F$$$k$H;W$$$^$9!#$H$$$&Lu$G!”$;$C$+$/%Q%Ce(B  
e$B%A$r\<h$j9~$s$G$$$?$@$$$?$N$K!"e(BRDoc  
e$B$NJ}$,4V0c$$$K$J$C$F$7$^$$$^$7$?!#e(B  
e$B0J2\<$N%Q%C%A$G@5$7$$5-=R$K$J$k$H;W$$$^$9!#$D$$$G$K!"e(B

- e$BB\>$N\>l=j$K9g$o$;$Fe(B s/Array/array/
- e$B\<B:]$N=PNO$K9g$o$;$Fe(B in `’ e$B$rDI2Ce(B
- caller(4) e$B$r=$@5!"e(Bcaller(5) e$B$rDI2Ce(B

## e$B$H$$$&JQ99$r2C$($F$$$^$9!#9g$o$;$F\<h\<NA\*Br$7$F$/$@$5$$!#e(B

Nobuhiro IMAI [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
Key fingerprint = F39E D552 545D 7C64 D690 F644 5A15 746C BD8E 7106

diff --git a/vm\_eval.c b/vm\_eval.c  
index cff05a0…e609ca0 100644  
— a/vm\_eval.c  
+++ b/vm\_eval.c  
@@ -1536,7 +1536,7 @@ rb\_catch\_obj(VALUE tag, VALUE (\*func)(), VALUE  
data)

/\*

- call-seq:

- 
  - 

```
caller(start=1) -> Array or nil

```

- 
  - 

```
caller(start=1) -> array or nil

```

  - 
  - Returns the current execution stack—an array containing strings  
in
  - the form `<em>file:line</em>'' or `_file:line: in  
@@ -1544,7 +1544,7 @@ rb\_catch\_obj(VALUE tag, VALUE (\*func)(), VALUE  
data)_
   _- determines the number of initial stack entries to omit from the
   - result.
   -_ 

 
 
 
_- 
  - Returns +nil+ if start is greater than or equal to the size of_

 
_- 
  - Returns +nil+ if start is greater than the size of
  - current execution stack.
  - 
  -_ 

_```
def a(skip)_

_```_

 

_@@ -1556,11 +1556,12 @@ rb\_catch\_obj(VALUE tag, VALUE (\*func)(), VALUE  
data)_

 
_-_ 

_```
def c(skip)_

_```_

_-_ 

_```
  b(skip)_

_```_

_-_ 

_```
end_

_```_

 
_- 
  -_ 

_```
c(0) #=> ["prog:2:in `a'", "prog:5:in `b'", "prog:8:in `c'",_ 

_```_

 

_“prog:10”]_

 
_- 
  -_ 

_```
c(1) #=> ["prog:5:in `b'", "prog:8:in `c'", "prog:11"]_

_```_

_- 
  -_ 

_```
c(2) #=> ["prog:8:in `c'", "prog:12"]_

_```_

_- 
  -_ 

_```
c(3) #=> ["prog:13"]_

_```_

_- 
  -_ 

_```
c(4) #=> nil_

_```_

 
_- 
  -_ 

_```
c(0) #=> ["prog:2:in `a'", "prog:5:in `b'", "prog:8:in `c'",_ 

_```_

 

_“prog:10:in `'”]_

 
_- 
  -_ 

_```
c(1) #=> ["prog:5:in `b'", "prog:8:in `c'", "prog:11:in_ 

_```_

 

_`'"]_

 
_- 
  -_ 

_```
c(2) #=> ["prog:8:in `c'", "prog:12:in `<main>'"]_

_```_

_- 
  -_ 

_```
c(3) #=> ["prog:13:in `<main>'"]_

_```_

_- 
  -_ 

_```
c(4) #=> []_

_```_

_- 
  -_ 

_```
c(5) #=> nil_

_```_

_\*/_

 

_static VALUE_
