# Infinite recursive rb\_block\_call

**URL:** <https://www.ruby-forum.com/t/infinite-recursive-rb-block-call/178194>\
**Category:** Development\
**Created:** [October 30, 2009, 2:18pm UTC](https://www.ruby-forum.com/t/infinite-recursive-rb-block-call/178194 "2009-10-30T14:18:45Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [October 30, 2009, 2:18pm UTC](https://www.ruby-forum.com/t/infinite-recursive-rb-block-call/178194/1 "2009-10-30T14:18:45Z")

</div>

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

[ruby-core:24794] e$B$H;w$?$h$&$JLdBj$O!"e(Brb\_block\_call  
e$B$G$b5/$-$k$h$&$G$9!#e(B

$ ./ruby -e ’  
class C  
include Enumerable  
alias :each :min  
end  
C.new.min  
’  
Segmentation fault

min e$B0J30$G$be(B Enumerable e$B$N%a%=%C%I$GBgDqMn$A$k$\_$?$$$G$9!#e(B

rb\_funcall\_no\_recursive e$B$r??;w$Fe(B rb\_block\_call\_no\_recursive  
e$B$r:n$C$Fe(B  
e$B8+$^$7$?!#e(B[ruby-dev:39592]  
e$B$NAj8\_:F5"$NLdBj$OF1$8$h$&$K$"$k$H;W$$$^$9!#e(B

e$B$3$NJ}?K$@$H$[$$9$Y$F$Ne(B rb\_block\_call  
e$B$N8F$S=P$7$r=q$-49$($FLa$jCM$,e(B  
Qundef  
e$B$G$J$$$+$I$&$+%A%’%C%/$9$kI,MW$,$"$j$=$&$G$9!#2DFI@-$d@-G=$re(B  
e$B5\>@7$K$7$F$G$b!"$3$N$h$&$J0[\>o$J%W%m%0%i%`$r5\_:Q$9$Y$-$G$7$g$&$+e(B  
(Qundef e$B$rJV$5$:D\>@\Nc30$rEj$2$l$P$b$&\>/$7$9$C$-$j$9$k!)e(B)

# Index: enum.c

— enum.c (revision 25576)  
+++ enum.c (working copy)  
@@ -1101,7 +1101,10 @@  
rb\_block\_call(obj, id\_each, 0, 0, min\_ii, (VALUE)result);  
}  
else {

- rb\_block\_call(obj, id\_each, 0, 0, min\_i, (VALUE)result);

- VALUE ret = rb\_block\_call\_no\_recursive(obj, id\_each, 0, 0, min\_i,  
(VALUE)result, enum\_min);
- if (ret == Qundef) {
- 

```
 rb_raise(rb_eRuntimeError, "recursive call to Enumerable#min");

```

- }  
}  
if (result[0] == Qundef) return Qnil;  
return result[0];  
Index: vm\_eval.c  
===================================================================  
— vm\_eval.c (revision 25576)  
+++ vm\_eval.c (working copy)  
@@ -815,7 +815,48 @@  
return rb\_iterate(iterate\_method, (VALUE)&arg, bl\_proc, data2);  
}

+struct iter\_method\_arg\_no\_recursive {

- struct iter\_method\_arg arg;
- VALUE (\*func)();  
+};
- 

+static VALUE  
+iterate\_method\_no\_recursive(VALUE obj)  
+{

- const struct iter\_method\_arg\_no\_recursive \* arg =
- 

```
 (struct iter_method_arg_no_recursive *) obj;

```

- rb\_method\_entry\_t \*me = rb\_search\_method\_emtry(arg-\>arg.obj,  
arg-\>arg.mid);
- rb\_thread\_t \*th = GET\_THREAD();
- int call\_status;
- 
- if (!me) return Qundef;
- if (me-\>def && me-\>def-\>type == VM\_METHOD\_TYPE\_CFUNC &&
- me-\>def-\>body.cfunc.func == arg-\>func)
- return Qundef;
- call\_status = rb\_method\_call\_status(th, me, CALL\_FCALL, Qundef);
- if (call\_status != NOEX\_OK) {
- return Qundef;
- }
- stack\_check();
- iterate\_method((VALUE) &arg-\>arg);  
+}
- 

VALUE  
+rb\_block\_call\_no\_recursive(VALUE obj, ID mid, int argc, VALUE \* argv,

- 

```
    VALUE (*bl_proc) (ANYARGS), VALUE data2,

```

- 

```
    VALUE (*func)())

```

+{

- struct iter\_method\_arg\_no\_recursive arg;
- 
- arg.arg.obj = obj;
- arg.arg.mid = mid;
- arg.arg.argc = argc;
- arg.arg.argv = argv;
- arg.func = func;
- return rb\_iterate(iterate\_method\_no\_recursive, (VALUE)&arg,  
bl\_proc, data2);  
+}
- 

+VALUE  
rb\_each(VALUE obj)  
{  
return rb\_call(obj, idEach, 0, 0, CALL\_FCALL);

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [October 30, 2009, 4:03pm UTC](https://www.ruby-forum.com/t/infinite-recursive-rb-block-call/178194/2 "2009-10-30T16:03:33Z")

</div>

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

In message “Re: [ruby-dev:39593] infinite recursive rb\_block\_call”  
on Fri, 30 Oct 2009 22:17:04 +0900, Yusuke ENDOH [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
writes:

|e$B$3$NJ}?K$@$H$[$$9$Y$F$Ne(B rb\_block\_call e$B$N8F$S=P$7$r=q$-49$($FLa$jCM$,e(B  
|Qundef e$B$G$J$$$+$I$&$+%A%'%C%/$9$kI,MW$,$“$j$=$&$G$9!#2DFI@-$d@-G=$re(B  
|e$B5\>@7$K$7$F$G$b!”$3$N$h$&$J0[\>o$J%W%m%0%i%`$r5\_:Q$9$Y$-$G$7$g$&$+e(B  
|(Qundef e$B$rJV$5$:D\>@\Nc30$rEj$2$l$P$b$&\>/$7$9$C$-$j$9$k!)e(B)

e$B$=$N2ACM$O$J$$$H;W$$$^$9!#e(B
