# Patch for ruby-dev:34236

**URL:** <https://www.ruby-forum.com/t/patch-for-ruby-dev-34236/135273>\
**Category:** Development\
**Created:** [April 20, 2008, 1:59pm UTC](https://www.ruby-forum.com/t/patch-for-ruby-dev-34236/135273 "2008-04-20T13:59:15Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![wanabe](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/51bf81/32.png) [@wanabe](https://www.ruby-forum.com/u/wanabe)\
**Post date:** [April 20, 2008, 1:59pm UTC](https://www.ruby-forum.com/t/patch-for-ruby-dev-34236/135273/1 "2008-04-20T13:59:15Z")

</div>

e$B%o%J%Y$H?=$7$^$9!#e(B

[ruby-dev:34236]e$B$KBP$9$k%Q%C%A$r=q$-$^$7$?!#e(B  
Proc e$B%\*%V%8%’%/%H$N:n@.$5$l$?0LCV$HL54X78$Ke(B  
module\_eval e$BCf$G$N%a%=%C%IDj5A$,$G$-$k$h$&$K$J$j$^$9!#e(B

# Index: eval.c

— eval.c (revision 16056)  
+++ eval.c (working copy)  
@@ -1832,6 +1832,7 @@  
rb\_control\_frame\_t \*pcfp = RUBY\_VM\_PREVIOUS\_CONTROL\_FRAME(cfp);  
VALUE stored\_self = pcfp-\>self;  
NODE \*stored\_cref = 0;

- VALUE stored\_cref\_stack = INT2FIX(0);

- if (BUILTIN\_TYPE(block.iseq) != T\_NODE) {

- 

```
 stored_cref_stack = (VALUE)block.iseq->cref_stack;

```

- 

```
 block.iseq->cref_stack = vm_cref_push(th, under, NOEX_PUBLIC);

```

- }  
\*th-\>cfp-\>lfp = GC\_GUARDED\_PTR(&block);  
}

@@ -1863,6 +1868,9 @@  
/\* restore environment \*/  
vm\_cfp\_svar\_set(th, cfp, 2, (VALUE)stored\_cref);  
pcfp-\>self = stored\_self;

- if (stored\_cref\_stack != INT2FIX(0)) {

- block.iseq-\>cref\_stack = (NODE\*)stored\_cref\_stack;

- }

---

<div class="post-metadata">

**Author:** ![wanabe](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/51bf81/32.png) [@wanabe](https://www.ruby-forum.com/u/wanabe)\
**Post date:** [April 21, 2008, 3:00am UTC](https://www.ruby-forum.com/t/patch-for-ruby-dev-34236/135273/2 "2008-04-21T03:00:02Z")

</div>

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

wanabe wrote:

> [ruby-dev:34236]e$B$KBP$9$k%Q%C%A$r=q$-$^$7$?!#e(B  
> Proc e$B%\*%V%8%’%/%H$N:n@.$5$l$?0LCV$HL54X78$Ke(B  
> module\_eval e$BCf$G$N%a%=%C%IDj5A$,$G$-$k$h$&$K$J$j$^$9!#e(B

e$B!!$3$l!$$Q$C$HNc$,=P$J$$$s$G$9$,!$K\Ev$KBg\>fIW$G$7$g$&$+!%e(Biseq  
e$B$KBPe(B  
e$B$9$k%"%/%;%9$J$N$G!$I{:nMQ$,!%e(B

---

<div class="post-metadata">

**Author:** ![wanabe](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/51bf81/32.png) [@wanabe](https://www.ruby-forum.com/u/wanabe)\
**Post date:** [April 21, 2008, 4:17am UTC](https://www.ruby-forum.com/t/patch-for-ruby-dev-34236/135273/3 "2008-04-21T04:17:46Z")

</div>

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

In message “Re: [ruby-dev:34466] Re: patch for ruby-dev:34236”  
on Mon, 21 Apr 2008 09:57:26 +0900, SASADA Koichi [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
writes:

|wanabe wrote:  
|\> [ruby-dev:34236]e$B$KBP$9$k%Q%C%A$r=q$-$^$7$?!#e(B  
|\> Proc e$B%\*%V%8%'%/%H$N:n@.$5$l$?0LCV$HL54X78$Ke(B  
|\> module\_eval e$BCf$G$N%a%=%C%IDj5A$,$G$-$k$h$&$K$J$j$^$9!#e(B  
|  
|e$B!!$3$l!$$Q$C$HNc$,=P$J$$$s$G$9$,!$K\Ev$KBg\>fIW$G$7$g$&$+!%e(Biseq e$B$KBPe(B  
|e$B$9$k%"%/%;%9$J$N$G!$I{:nMQ$,!%e(B

(e$B$$$k$H$9$k$J$i$Pe(B)e$B$5$5$@$/$s0J30$K!VK\Ev$KBg\>fIW$+!WJ,$+$k?Me(B  
e$B$O$$$J$$$H$\*$b$$$^$9$h!#$H$j$"$($:\<h$j9~$s$G$$$m$$$m;n$9$7$+e(B  
e$B$J$$$s$8$c$J$$$G$9$+$M!#e(B

---

<div class="post-metadata">

**Author:** ![wanabe](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/51bf81/32.png) [@wanabe](https://www.ruby-forum.com/u/wanabe)\
**Post date:** [April 21, 2008, 5:27am UTC](https://www.ruby-forum.com/t/patch-for-ruby-dev-34236/135273/4 "2008-04-21T05:27:20Z")

</div>

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

Yukihiro M. wrote:

> (e$B$$$k$H$9$k$J$i$Pe(B)e$B$5$5$@$/$s0J30$K!VK\Ev$KBg\>fIW$+!WJ,$+$k?Me(B  
> e$B$O$$$J$$$H$\*$b$$$^$9$h!#$H$j$"$($:\<h$j9~$s$G$$$m$$$m;n$9$7$+e(B  
> e$B$J$$$s$8$c$J$$$G$9$+$M!#e(B

e$B!!$3$NLdBj$O0JA0$+$i9M$($F$$$k$N$G$9$,!$!J;d$K$O!KFq$7$$$N$G!$!VK\Eve(B  
e$B$KBg\>fIW$+!W$b4^$a$F\>/$79M$($5$;$F2\<$5$$!%e(B

e$B!!:,K\E\*$K!$e(Biseq e$B$,e(B mutable  
e$B$H$$$&E@$,%,%s$J$N$G!$$=$NE@$r2r\>C$7$h$&e(B  
e$B$H;W$&$s$G$9$,!$$^$@\<j$,DI$$$D$$$F$$$J$$$H$3$m$G$9!%?’!9$HCY$/$F$9$\_e(B  
e$B$^$;$s!%e(B

e$B!!e(B[ruby-core:14726]  
e$B$H$+$=$NJU$J$s$G$9$,!$$C$F$b$&e(B1e$B7n$+e(B orz

---

<div class="post-metadata">

**Author:** ![wanabe](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/51bf81/32.png) [@wanabe](https://www.ruby-forum.com/u/wanabe)\
**Post date:** [April 21, 2008, 5:30am UTC](https://www.ruby-forum.com/t/patch-for-ruby-dev-34236/135273/5 "2008-04-21T05:30:51Z")

</div>

e$B1sF#$H?=$7$^$9!#e(B

2008/04/21 9:57 SASADA Koichi [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> wanabe wrote:
> 
> > [ruby-dev:34236]e$B$KBP$9$k%Q%C%A$r=q$-$^$7$?!#e(B  
> > Proc e$B%\*%V%8%'%/%H$N:n@.$5$l$?0LCV$HL54X78$Ke(B  
> > module\_eval e$BCf$G$N%a%=%C%IDj5A$,$G$-$k$h$&$K$J$j$^$9!#e(B
> 
> e$B!!$3$l!$$Q$C$HNc$,=P$J$$$s$G$9$,!$K\Ev$KBg\>fIW$G$7$g$&$+!%e(Biseq e$B$KBPe(B  
> e$B$9$k%"%/%;%9$J$N$G!$I{:nMQ$,!%e(B

e$B$3$s$J46$8$N%3!\<%I$G5sF0$,JQ$o$j$^$9$M!#e(B

$ cat test.rb  
class Module  
def my\_module\_eval(&block)  
module\_eval(&block)  
end  
end

$b = proc do |f|  
if f  
$b.call(nil)  
else  
def foo  
p :foo  
end  
end  
end

class A  
end  
class B  
A.my\_module\_eval(&$b)  
end

foo

# 1.8

$ ruby test.rb  
:foo

# [ruby-dev:34460] e$B$N%Q%C%AA0e(B

$ ./ruby.org test.rb  
:foo

# [ruby-dev:34460] e$B$N%Q%C%A8ee(B

$ ./ruby.new test.rb  
test.rb:23:in `<main>': undefined local variable or method `foo’ for  
main:Object (NameError)

---

<div class="post-metadata">

**Author:** ![wanabe](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/51bf81/32.png) [@wanabe](https://www.ruby-forum.com/u/wanabe)\
**Post date:** [April 27, 2008, 6:07am UTC](https://www.ruby-forum.com/t/patch-for-ruby-dev-34236/135273/6 "2008-04-27T06:07:26Z")

</div>

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

wanabe wrote:

> iseq e$B$K?($i$:!"e(Brb\_block\_t e$B$Ke(B cref e$B$r;}$?$;$k$h$&$K=q$-D\>$7$^$7$?!#e(B  
> e$B1sF#$5$s$N=q$+$l$?Nc$,F0:n$9$k$h$&$K$9$k$?$a!“e(B1.8e$B$HF1$8$h$&$Ke(B  
> instance\_eval/module\_eval e$B$N%V%m%C%/$K0z?te(B self e$B$rM?$($k$h$&$K$7$F$$$^$9!#e(B  
> e$B!Je(Byield\_under(klass, self, rb\_ary\_new3(1, self))e$B$NItJ,!Ke(B  
> e$BLdBj$,$”$j$^$7$?$i$3$NItJ,$OL5;k$7$F$/$@$5$$!#e(B

e$B!!$$$D$b$"$j$,$H$&$4$6$$$^$9!%:#$^$5$K$3$NLdBj$K4X$7$F%G%P%C%0Cf$G$9!%e(B

e$B!!e(Bcref  
e$B$r%U%l!\<%`$4$H$K;}$?$J$$$N$O!$%l%"%1!\<%9$N$?$a$KB\>$rCY$/$9$ke(B  
e$B$N$,7y$@$C$?$N$G!$:#$N$h$&$J$b$N$K$J$C$F$$$^$9!%=PMh$l$P!$$3$N$^$^$Ge(B  
e$B:Q$^$;$k$3$H$,=PMh$J$$$+!$G:$s$G$$$^$9!%e(B

e$B!!$=$l$O$H$b$+$/!$\<B$OLdBj$O$3$l0J30$K$b$$$/$D$+$"$k$H$$$&$3$H$,$oe(B  
e$B$+$C$F$-$F$$$F!$8=:\_$=$l$r4^$a$FD\>$7J}$r9M$(Cf$G$9!%6qBNE\*$K$O!$e(B1.8  
e$B$Ne(B ruby\_class e$B$He(B ruby\_cref  
e$B$rF10l;k$7$F$$$?$s$G$9$,!$\<B$OF10l;k$7$Fe(B  
e$B$O$$$1$J$+$C$?$H$+!$$=$s$JOC$G$9!%:#F|Cf$K$O!$$J$s$H$+$7$?$$$s$G$9$,!%e(B

---

<div class="post-metadata">

**Author:** ![wanabe](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/51bf81/32.png) [@wanabe](https://www.ruby-forum.com/u/wanabe)\
**Post date:** [April 27, 2008, 5:56am UTC](https://www.ruby-forum.com/t/patch-for-ruby-dev-34236/135273/7 "2008-04-27T05:56:19Z")

</div>

e$B%o%J%Y$G$9!#e(B

08/04/21 e$B$Ke(B Yusuke ENDOH[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) e$B$5$s$O=q$-$^$7$?e(B:

> 2008/04/21 9:57 SASADA Koichi [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):
> 
> > e$B$3$l!$$Q$C$HNc$,=P$J$$$s$G$9$,!$K\Ev$KBg\>fIW$G$7$g$&$+!%e(Biseq e$B$KBPe(B  
> > e$B$9$k%"%/%;%9$J$N$G!$I{:nMQ$,!%e(B
> 
> e$B$3$s$J46$8$N%3!\<%I$G5sF0$,JQ$o$j$^$9$M!#e(B

iseq e$B$K?($i$:!"e(Brb\_block\_t e$B$Ke(B cref  
e$B$r;}$?$;$k$h$&$K=q$-D\>$7$^$7$?!#e(B  
e$B1sF#$5$s$N=q$+$l$?Nc$,F0:n$9$k$h$&$K$9$k$?$a!“e(B1.8e$B$HF1$8$h$&$Ke(B  
instance\_eval/module\_eval e$B$N%V%m%C%/$K0z?te(B self  
e$B$rM?$($k$h$&$K$7$F$$$^$9!#e(B  
e$B!Je(Byield\_under(klass, self, rb\_ary\_new3(1, self))e$B$NItJ,!Ke(B  
e$BLdBj$,$”$j$^$7$?$i$3$NItJ,$OL5;k$7$F$/$@$5$$!#e(B

# Index: vm\_core.h

— vm\_core.h (revision 16174)  
+++ vm\_core.h (working copy)  
@@ -337,6 +337,7 @@  
VALUE _dfp; /_ share with method frame if it’s only block \*/  
rb\_iseq\_t \*iseq;  
VALUE proc;

- NODE \*cref;  
} rb\_block\_t;

# #define GetThreadPtr(obj, ptr) Index: eval.c

— eval.c (revision 16174)  
+++ eval.c (working copy)  
@@ -1845,6 +1845,9 @@  
block = \*blockptr;  
block.self = self;  
\*th-\>cfp-\>lfp = GC\_GUARDED\_PTR(&block);

- stored\_cref = block.cref;

- block.cref = vm\_cref\_push(th, under, NOEX\_PUBLIC);

- block.cref-\>nd\_file = stored\_cref;  
}

- return yield\_under(klass, self, Qundef);

- return yield\_under(klass, self, rb\_ary\_new3(1, self));  
}  
else {  
char \*file = “(eval)”;  
Index: vm.c  
===================================================================  
— vm.c (revision 16174)  
+++ vm.c (working copy)  
@@ -261,6 +261,7 @@  
env-\>block.lfp = cfp-\>lfp;  
env-\>block.dfp = cfp-\>dfp;  
env-\>block.iseq = cfp-\>iseq;

- env-\>block.cref = 0;

- proc-\>block.cref = 0;  
proc-\>block.proc = procval;  
proc-\>envval = envval;  
proc-\>safe\_level = th-\>safe\_level;  
@@ -539,6 +541,8 @@  
return vm\_call\_super(GET\_THREAD(), argc, argv);  
}

+void vm\_cfp\_svar\_set(rb\_thread\_t \*th, rb\_control\_frame\_t _cfp, VALUE  
key, VALUE val);  
+  
/_ C → Ruby: block \*/

static VALUE  
@@ -568,6 +572,10 @@  
self, GC\_GUARDED\_PTR(block-\>dfp),  
iseq-\>iseq\_encoded + opt\_pc, cfp-\>sp + arg\_size, block-\>lfp,  
iseq-\>local\_size - arg\_size);

- if (block-\>cref) {

- 

```
 vm_cfp_svar_set(th, th->cfp, 2, (VALUE)block->cref);

```

- 

```
 block->cref = block->cref->nd_file;

```

- }

- 

```
 blockptr->cref = 0;
 *block = blockptr;

```

}  
}
