https://redmine.ruby-lang.org/
https://redmine.ruby-lang.org/favicon.ico?1711330511
2009-05-21T22:58:34Z
Ruby Issue Tracking System
Ruby master - Bug #1501: Enumerator.new { }.take(1).inject(&:+) causes stack overflow
https://redmine.ruby-lang.org/issues/1501?journal_id=4027
2009-05-21T22:58:34Z
mame (Yusuke Endoh)
mame@ruby-lang.org
<ul><li><strong>Category</strong> set to <i>core</i></li><li><strong>Status</strong> changed from <i>Open</i> to <i>Assigned</i></li><li><strong>Assignee</strong> set to <i>ko1 (Koichi Sasada)</i></li><li><strong>Priority</strong> changed from <i>3</i> to <i>Normal</i></li><li><strong>Target version</strong> set to <i>2.0.0</i></li><li><strong>ruby -v</strong> set to <i>ruby 1.9.2dev (2009-05-19 trunk 23489) [i686-linux]</i></li></ul><p>=begin</p>
<p>=end</p>
Ruby master - Bug #1501: Enumerator.new { }.take(1).inject(&:+) causes stack overflow
https://redmine.ruby-lang.org/issues/1501?journal_id=4031
2009-05-22T05:40:03Z
ko1 (Koichi Sasada)
<ul></ul><p>=begin<br>
ささだです.</p>
<p>Yusuke ENDOH wrote::</p>
<blockquote>
<p>そこで、以下のように、yielder_new_i で proc メソッドを呼ぶことで<br>
バグは直りました。</p>
</blockquote>
<p> 似たような話なんですが,そもそも rb_iterate を使う場面じゃなさそうな.</p>
<a name="Index-enumeratorc"></a>
<h1 >Index: enumerator.c<a href="#Index-enumeratorc" class="wiki-anchor">¶</a></h1>
<p>--- enumerator.c (リビジョン 23496)<br>
+++ enumerator.c (作業コピー)<br>
@@ -718,12 +718,6 @@<br>
}</p>
<p>static VALUE<br>
-yielder_new_i(VALUE dummy)<br>
-{</p>
<ul>
<li>return yielder_init(yielder_allocate(rb_cYielder), rb_block_proc());<br>
-}</li>
<li>
</ul>
<p>-static VALUE<br>
yielder_yield_i(VALUE obj, VALUE memo, int argc, VALUE *argv)<br>
{<br>
return rb_yield_values2(argc, argv);<br>
@@ -732,7 +726,7 @@<br>
static VALUE<br>
yielder_new(void)<br>
{</p>
<ul>
<li>return rb_iterate(yielder_new_i, (VALUE)0, yielder_yield_i, (VALUE)0);</li>
</ul>
<ul>
<li>return yielder_init(yielder_allocate(rb_cYielder),<br>
rb_proc_new(yielder_yield_i, 0));<br>
}</li>
</ul>
<p>/*</p>
<blockquote>
<p>上に関係して、Ruby のソースコードには以下のアサーションが暗黙に<br>
存在すると思ったのですが、正しいでしょうか。</p>
<ul>
<li>passed_block が設定されたら、eval ループに戻る前に Ruby レベルの<br>
メソッドを呼んで passed_block を回収させないといけない</li>
</ul>
</blockquote>
<p>yes.</p>
<blockquote>
<ul>
<li>rb_iterate や rb_block_call の第一引数に渡される関数は、その中で<br>
Ruby レベルのメソッドを呼ばないといけない</li>
</ul>
</blockquote>
<p>yes.</p>
<blockquote>
<p>後者は C API に関わる話なので、正しいようなら README.EXT に書き<br>
加えた方がいいと思います。というか書き加えようと思います。</p>
</blockquote>
<p> これは,実は 1.8 以前との非互換の問題だったんですよね.</p>
<p> これを真面目に解決しようとすると,このようなレアケースのためにブロック<br>
をチェックする全てのコードに passed_block をチェックするように変更する必<br>
要が出てきて,ちょっと現実的じゃないのです.</p>
<p>*フレームをその時だけいじっちゃう,という回避手段があるような,<br>
嫌なところに波及しそうな.</p>
<p> 例えば,rb_iterate は obsolete にしてしまって(制限付きで存在),<br>
rb_block_call を使うようにして下さい,とドキュメントするのはどんなもんで<br>
しょうか.</p>
<p>--<br>
// SASADA Koichi at atdot dot net<br>
// 久しぶりに Ruby のソースコードをいじった</p>
<p>=end</p>
Ruby master - Bug #1501: Enumerator.new { }.take(1).inject(&:+) causes stack overflow
https://redmine.ruby-lang.org/issues/1501?journal_id=4032
2009-05-22T07:41:07Z
matz (Yukihiro Matsumoto)
matz@ruby.or.jp
<ul></ul><p>=begin<br>
まつもと ゆきひろです</p>
<p>In message "Re: <a href="https://blade.ruby-lang.org/ruby-dev/38521">[ruby-dev:38521]</a> Re: [Bug:1.9] Enumerator.new { }.take(1).inject(&:+) causes stack overflow"<br>
on Fri, 22 May 2009 05:39:46 +0900, SASADA Koichi <a href="mailto:ko1@atdot.net" class="email">ko1@atdot.net</a> writes:</p>
<p>| これは,実は 1.8 以前との非互換の問題だったんですよね.<br>
|<br>
| これを真面目に解決しようとすると,このようなレアケースのためにブロック<br>
|をチェックする全てのコードに passed_block をチェックするように変更する必<br>
|要が出てきて,ちょっと現実的じゃないのです.<br>
|<br>
|*フレームをその時だけいじっちゃう,という回避手段があるような,<br>
| 嫌なところに波及しそうな.<br>
|<br>
|<br>
| 例えば,rb_iterate は obsolete にしてしまって(制限付きで存在),<br>
|rb_block_call を使うようにして下さい,とドキュメントするのはどんなもんで<br>
|しょうか.</p>
<p>まあ、それはそれで構いません。</p>
<p>=end</p>
Ruby master - Bug #1501: Enumerator.new { }.take(1).inject(&:+) causes stack overflow
https://redmine.ruby-lang.org/issues/1501?journal_id=4033
2009-05-22T10:00:00Z
mame (Yusuke Endoh)
mame@ruby-lang.org
<ul></ul><p>=begin<br>
遠藤です。</p>
<p>2009/05/22 5:39 SASADA Koichi <a href="mailto:ko1@atdot.net" class="email">ko1@atdot.net</a>:</p>
<blockquote>
<p>Yusuke ENDOH wrote::</p>
<blockquote>
<p>そこで、以下のように、yielder_new_i で proc メソッドを呼ぶことで<br>
バグは直りました。</p>
</blockquote>
<p> 似たような話なんですが,そもそも rb_iterate を使う場面じゃなさそうな.</p>
</blockquote>
<p>確かに。ささださんのパッチでも直ることを確認しました。</p>
<blockquote>
<p>例えば,rb_iterate は obsolete にしてしまって(制限付きで存在),<br>
rb_block_call を使うようにして下さい,とドキュメントするのはどんなもんで<br>
しょうか.</p>
</blockquote>
<p>なるほど、rb_block_call は必ずメソッドを呼び出すから大丈夫<br>
なんですね。</p>
<p>ドキュメント修正案のパッチです。</p>
<a name="Index-READMEEXT"></a>
<h1 >Index: README.EXT<a href="#Index-READMEEXT" class="wiki-anchor">¶</a></h1>
<p>--- README.EXT (revision 23508)<br>
+++ README.EXT (working copy)<br>
@@ -1159,11 +1159,22 @@</p>
<p>** Control Structure</p>
<ul>
<li>VALUE rb_iterate(VALUE (*func1)(), void *arg1, VALUE (*func2)(), void *arg2)</li>
</ul>
<ul>
<li>VALUE rb_block_call(VALUE recv, ID mid, int argc, VALUE * argv,</li>
<li>
<pre><code> VALUE (*func) (ANYARGS), VALUE data2)
</code></pre>
</li>
</ul>
<p>+Calls a method on the recv, with the method name specified by the<br>
+symbol mid, supplying func as the block. func will receive the<br>
+value from yield as the first argument, data2 as the second, and<br>
+argc/argv as the third/fourth arguments.<br>
+</p>
<ul>
<li>[OBSOLETE] VALUE rb_iterate(VALUE (*func1)(), void *arg1, VALUE<br>
(*func2)(), void *arg2)</li>
<li>
</ul>
<p>Calls the function func1, supplying func2 as the block. func1 will be<br>
called with the argument arg1. func2 receives the value from yield as<br>
the first argument, arg2 as the second argument.<br>
+<br>
+When rb_iterate is used in 1.9, func1 has to call some Ruby-level method.<br>
+This function is obsolete since 1.9; use rb_block_call instead.</p>
<p>VALUE rb_yield(VALUE val)</p>
<a name="Index-READMEEXTja"></a>
<h1 >Index: README.EXT.ja<a href="#Index-READMEEXTja" class="wiki-anchor">¶</a></h1>
<p>--- README.EXT.ja (revision 23508)<br>
+++ README.EXT.ja (working copy)<br>
@@ -1258,11 +1258,22 @@</p>
<p>** 制御構造</p>
<p>-VALUE rb_iterate(VALUE (*func1)(), VALUE arg1, VALUE (*func2)(), VALUE arg2)<br>
+VALUE rb_block_call(VALUE obj, ID mid, int argc, VALUE * argv,</p>
<ul>
<li>
<pre><code> VALUE (*func) (ANYARGS), VALUE data2)
</code></pre>
</li>
<li>
<p>funcをブロックとして設定し, objをレシーバ, argcとargvを引</p>
</li>
<li>
<p>数としてmidメソッドを呼び出す. funcは第一引数にyieldされた</p>
</li>
<li>
<p>値, 第二引数にdata2, 第三, 第四引数にargcとargvを受け取る.</p>
</li>
<li>
</ul>
<p>+[OBSOLETE] VALUE rb_iterate(VALUE (*func1)(), VALUE arg1, VALUE<br>
(*func2)(), VALUE arg2)<br>
+<br>
func2をブロックとして設定し, func1をイテレータとして呼ぶ.<br>
func1には arg1が引数として渡され, func2には第1引数にイテレー<br>
タから与えられた値, 第2引数にarg2が渡される.<br>
+</p>
<ul>
<li>1.9でrb_iterateを使う場合は, func1の中でRubyレベルのメソッド</li>
<li>を呼び出さなければならない.</li>
<li>1.9でobsoleteとなった. 代わりにrb_block_callが用意された.</li>
</ul>
<p>VALUE rb_yield(VALUE val)</p>
<p>--<br>
Yusuke ENDOH <a href="mailto:mame@tsg.ne.jp" class="email">mame@tsg.ne.jp</a></p>
<p>=end</p>
Ruby master - Bug #1501: Enumerator.new { }.take(1).inject(&:+) causes stack overflow
https://redmine.ruby-lang.org/issues/1501?journal_id=4273
2009-06-15T06:36:09Z
ko1 (Koichi Sasada)
<ul></ul><p>=begin<br>
ささだです.</p>
<p> 返事が随分遅くなってしまってすみません.</p>
<p>Yusuke ENDOH wrote::</p>
<blockquote>
<p>なるほど、rb_block_call は必ずメソッドを呼び出すから大丈夫<br>
なんですね。</p>
<p>ドキュメント修正案のパッチです。</p>
</blockquote>
<p> よろしいかと思いました.</p>
<p>--<br>
// SASADA Koichi at atdot dot net</p>
<p>=end</p>
Ruby master - Bug #1501: Enumerator.new { }.take(1).inject(&:+) causes stack overflow
https://redmine.ruby-lang.org/issues/1501?journal_id=4692
2009-07-14T01:17:05Z
mame (Yusuke Endoh)
mame@ruby-lang.org
<ul><li><strong>Status</strong> changed from <i>Assigned</i> to <i>Closed</i></li><li><strong>% Done</strong> changed from <i>0</i> to <i>100</i></li></ul><p>=begin<br>
Applied in changeset r24094.<br>
=end</p>