# Binding of caller

**URL:** <https://www.ruby-forum.com/t/binding-of-caller/123498>\
**Category:** Development\
**Created:** [December 18, 2007, 8:10am UTC](https://www.ruby-forum.com/t/binding-of-caller/123498 "2007-12-18T08:10:04Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [December 18, 2007, 8:10am UTC](https://www.ruby-forum.com/t/binding-of-caller/123498/1 "2007-12-18T08:10:04Z")

</div>

e$B$J$+$@$G$9!#e(B

Binding.of\_callere$B$H$+e(BBinding#callere$B$H$+e(Bbindinge$B$N%\*%W%7%g%J%k0z?te(B  
e$B$H$+$r\<BAu$7$F$\_$^$7$?!#e(B

# Index: proc.c

— proc.c (revision 14286)  
+++ proc.c (working copy)  
@@ -174,18 +174,93 @@ binding\_clone(VALUE self)  
}

+static int  
+caller\_level(int argc, VALUE \*argv, int minimum)  
+{

- VALUE v;
- int level;
- 
- if (!argc) return minimum;
- rb\_scan\_args(argc, argv, “1”, &v);
- level = NUM2INT(v);
- if (level \< 0) {
- rb\_raise(rb\_eArgError, “negative caller level: %d”, level);
- }
- if (level \< minimum) {
- rb\_raise(rb\_eArgError, “caller level out of range: %d”, level);
- }
- return level;  
+}
- 

+VALUE  
+rb\_binding\_caller(VALUE self, int level)  
+{

- rb\_thread\_t \*th = GET\_THREAD();
- rb\_control\_frame\_t \*cfp;
- rb\_binding\_t \*bind;
- VALUE envval, bindval;
- 
- GetBindingPtr(self, bind);
- envval = bind-\>env;
- cfp = bind-\>cfp;
- do {
- cfp = RUBY\_VM\_PREVIOUS\_CONTROL\_FRAME(cfp);
- cfp = vm\_get\_ruby\_level\_cfp(th, cfp);
- if (!cfp) return Qnil;
- } while (level-- \> 0);
- 
- bindval = binding\_alloc(rb\_obj\_class(self));
- GetBindingPtr(bindval, bind);
- bind-\>env = vm\_make\_env\_object(th, cfp);
- bind-\>cref\_stack = vm\_get\_cref(th, cfp-\>iseq, cfp);
- bind-\>cfp = cfp;
- return bindval;  
+}
- 

+static VALUE  
+binding\_caller(int argc, VALUE \*argv, VALUE self)  
+{

- return rb\_binding\_caller(self, caller\_level(argc, argv, 1));  
+}
- 

VALUE  
rb\_binding\_new(void)  
{

- return rb\_binding\_at(0);  
+}
- 

+static VALUE  
+binding\_at(VALUE klass, int level)  
+{  
rb\_thread\_t \*th = GET\_THREAD();

- rb\_control\_frame\_t \*cfp = vm\_get\_ruby\_level\_cfp(th, th-\>cfp);
- VALUE bindval = binding\_alloc(rb\_cBinding);

- rb\_control\_frame\_t \*cfp = th-\>cfp;

- VALUE bindval;  
rb\_binding\_t \*bind;

- for (;😉 {

- cfp = vm\_get\_ruby\_level\_cfp(th, cfp);

- if (!cfp) return Qnil;

- if (level-- \<= 0) break;

- cfp = RUBY\_VM\_PREVIOUS\_CONTROL\_FRAME(cfp);

- }

- bindval = binding\_alloc(klass);  
GetBindingPtr(bindval, bind);  
bind-\>env = vm\_make\_env\_object(th, cfp);

- bind-\>cref\_stack = ruby\_cref();

- bind-\>cref\_stack = vm\_get\_cref(th, cfp-\>iseq, cfp);
- bind-\>cfp = cfp;  
return bindval;  
}

+VALUE  
+rb\_binding\_at(int level)  
+{

- return binding\_at(rb\_cBinding, level);  
+}
- 

+static VALUE  
+rb\_binding\_of\_caller(int argc, VALUE \*argv, VALUE klass)  
+{

- return binding\_at(klass, caller\_level(argc, argv, 1));  
+}
- 

/\*

- call-seq:  
@@ -205,7 +280,7 @@ rb\_binding\_new(void)

static VALUE  
-rb\_f\_binding(VALUE self)  
+rb\_f\_binding(int argc, VALUE \*argv, VALUE self)  
{

- return rb\_binding\_new();

- return rb\_binding\_at(caller\_level(argc, argv, 0));  
}

@@ -1604,5 +1679,7 @@ Init\_Binding(void)  
rb\_define\_method(rb\_cBinding, “dup”, binding\_dup, 0);  
rb\_define\_method(rb\_cBinding, “eval”, bind\_eval, -1);

- rb\_define\_global\_function(“binding”, rb\_f\_binding, 0);

- rb\_define\_method(rb\_cBinding, “caller”, binding\_caller, -1);
- rb\_define\_singleton\_method(rb\_cBinding, “of\_caller”,  
rb\_binding\_of\_caller, -1);
- rb\_define\_global\_function(“binding”, rb\_f\_binding, -1);  
}

# Index: vm\_core.h

— vm\_core.h (revision 14286)  
+++ vm\_core.h (working copy)  
@@ -509,4 +509,5 @@ typedef struct {  
VALUE env;  
NODE \*cref\_stack;

- rb\_control\_frame\_t \*cfp;  
} rb\_binding\_t;

# Index: include/ruby/intern.h

— include/ruby/intern.h (revision 14286)  
+++ include/ruby/intern.h (working copy)  
@@ -254,4 +254,6 @@ VALUE rb\_proc\_call(VALUE, VALUE);  
int rb\_proc\_arity(VALUE);  
VALUE rb\_binding\_new(void);  
+VALUE rb\_binding\_at(int);  
+VALUE rb\_binding\_caller(VALUE, int);  
VALUE rb\_obj\_method(VALUE, VALUE);  
VALUE rb\_method\_call(int, VALUE\*, VALUE);

---

<div class="post-metadata">

**Author:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [December 19, 2007, 10:21am UTC](https://www.ruby-forum.com/t/binding-of-caller/123498/2 "2007-12-19T10:21:48Z")

</div>

e$B!!$5$5$@$G$9!%e(B

Nobuyoshi N. wrote:

> Binding.of\_callere$B$H$+e(BBinding#callere$B$H$+e(Bbindinge$B$N%\*%W%7%g%J%k0z?te(B  
> e$B$H$+$r\<BAu$7$F$\_$^$7$?!#e(B

e$B!!0l1~3NG’$G$9$,!$e(B1.9.1  
e$B$KF~$l$k$J$s$F$3$H$O$J$$$G$9$h$M!)!d$^$D$b$H$5$se(B

e$B!Je(BC e$B%l%Y%k%a%=%C%I$N07$$$J$I$,5$$K$J$C$F$$$^$9!Ke(B

---

<div class="post-metadata">

**Author:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [December 19, 2007, 10:45am UTC](https://www.ruby-forum.com/t/binding-of-caller/123498/3 "2007-12-19T10:45:56Z")

</div>

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:32638] Re: binding of caller”  
on Wed, 19 Dec 2007 18:21:14 +0900, SASADA Koichi [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
writes:

|Nobuyoshi N. wrote:  
|\> Binding.of\_callere$B$H$+e(BBinding#callere$B$H$+e(Bbindinge$B$N%\*%W%7%g%J%k0z?te(B  
|\> e$B$H$+$r\<BAu$7$F$\_$^$7$?!#e(B  
|  
|e$B!!0l1~3NG’$G$9$,!$e(B1.9.1 e$B$KF~$l$k$J$s$F$3$H$O$J$$$G$9$h$M!)!d$^$D$b$H$5$se(B  
|  
|e$B!Je(BC e$B%l%Y%k%a%=%C%I$N07$$$J$I$,5$$K$J$C$F$$$^$9!Ke(B

e$BF~$l$^$;$s!#e(BJRubye$B$G$O\<BAu$G$-$J$$e(B(e$BFq$7$$e(B)e$B$i$7$$$7!#2\>$KF~$l$ke(B  
e$B$J$ie(Bextensione$B$K$7$Fe(BYARVe$B@lMQ$H$7$FF3F~$9$k$H$+$G$9$+$M!#e(B

---

<div class="post-metadata">

**Author:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [December 19, 2007, 11:33am UTC](https://www.ruby-forum.com/t/binding-of-caller/123498/4 "2007-12-19T11:33:24Z")

</div>

e$B!!$5$5$@$G$9!%e(B

Yukihiro M. wrote:

> e$BF~$l$^$;$s!#e(BJRubye$B$G$O\<BAu$G$-$J$$e(B(e$BFq$7$$e(B)e$B$i$7$$$7!#2\>$KF~$l$ke(B  
> e$B$J$ie(Bextensione$B$K$7$Fe(BYARVe$B@lMQ$H$7$FF3F~$9$k$H$+$G$9$+$M!#e(B

e$B!!$=$NM}M3$J$ie(B~~e$BF~$l$FLc$$$?$$$+$J$!e(B~~e$BB\>$K$be(B  
CRuby e$B@lMQ$N$b$Ne(B  
e$B$O$"$k$h$&$J!%%U%!%$%J%i%$%6$H$+!%e(B
