Bug #7878

E::Lazy#grep ignores ^C

Added by Shyouhei Urabe about 2 years ago. Updated about 2 years ago.

[ruby-dev:47032]
Status:Closed
Priority:Normal
Assignee:Koichi Sasada
ruby -v:ruby 2.0.0dev (2013-02-08 trunk 39161) [x86_64-linux] Backport:

Description

このタイミングでバグかよとお思いでしょうが見つけちまったもんはしょうがない、

[0].lazy.cycle.grep(1).first

Cに反応しません。どこかでRUBY_VM_CHECK_INTSしてください。

Associated revisions

Revision 39308
Added by Koichi Sasada about 2 years ago

  • vm_eval.c (vm_call0_body): check interrupts after method dispatch from C methods. [Bug #7878]

Revision 39308
Added by Koichi Sasada about 2 years ago

  • vm_eval.c (vm_call0_body): check interrupts after method dispatch from C methods. [Bug #7878]

History

#1 Updated by Yusuke Endoh about 2 years ago

  • Status changed from Open to Assigned
  • Assignee set to Koichi Sasada

#2 Updated by Koichi Sasada about 2 years ago

なぜ私が、と思ったんですが、遠藤さんいい読みですね。
これは、

c_method_foo(){
while(1){ rb_funcall(c_method_bar); }
}

のように、foo, bar が両方とも C メソッドで、foo が bar を無限に呼ぶ、という段階で CHECK_INTS が入る余地がありませんでした。これは、ちょっと不味いバグなので直します。ううん、このタイミングでこれか。

#3 Updated by Koichi Sasada about 2 years ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

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


  • vm_eval.c (vm_call0_body): check interrupts after method dispatch from C methods. [Bug #7878]

#4 Updated by Koichi Sasada about 2 years ago

  • Status changed from Closed to Assigned
  • Assignee changed from Koichi Sasada to Yusuke Endoh

r39308 で取り急ぎ対応しました。

mameさん
backport してもいいでしょうか。

#5 Updated by Yusuke Endoh about 2 years ago

  • Assignee changed from Yusuke Endoh to Koichi Sasada

ko1 (Koichi Sasada) wrote:

なぜ私が、と思ったんですが、遠藤さんいい読みですね。

RUBY_VM_CHECK_INTS なんだから笹田さんでしょう。

ko1 (Koichi Sasada) wrote:

r39308 で取り急ぎ対応しました。

mameさん
backport してもいいでしょうか。

RUBY_VM_CHECK_INTS したらまずいところで RUBY_VM_CHECK_INTS してしまう副作用がないかが大変気になる(具体的に心当たりがあるわけではない)のですが、大丈夫ですかね? 自信があるなら OK です。

Yusuke Endoh mame@tsg.ne.jp

#6 Updated by Koichi Sasada about 2 years ago

(2013/02/19 21:20), mame (Yusuke Endoh) wrote:

なぜ私が、と思ったんですが、遠藤さんいい読みですね。

RUBY_VM_CHECK_INTS なんだから笹田さんでしょう。

 てっきり、Lazy cycle 内でなんか凄いことをやっているのかと思っておりま
した。enum.c のほうに変更入れるなら私じゃないだろう、と。

ko1 (Koichi Sasada) wrote:

r39308 で取り急ぎ対応しました。

mameさん
backport してもいいでしょうか。

RUBY_VM_CHECK_INTS したらまずいところで RUBY_VM_CHECK_INTS してしまう副作用がないかが大変気になる(具体的に心当たりがあるわけではない)のですが、大丈夫ですかね? 自信があるなら OK です。

 これに関して、実は 1.9.3 に戻したというのが実情です RUBY_VM_CHECK_INTS
を外して綺麗になって速くなるかな、と思ったんですが、ちょっとこの挙動(C
method の繰り返しの中で rb_funcall している)を思いつかなかったので、デ
グレ対応と言えるかと思います。というわけで、自信があります。

 本当は、もうちょっと綺麗になりそうだな、という手段を思いついたのです
が、怖いので 1.9.3 相当に戻す、という対応になっております。具体的には、
vm_call0_body() の冒頭、 th->passed_block をクリアした後に CHECK_INTS す
ればよい、はず。ただし、影響が読めないので、2.1 送り。

 よろしくお願いします。

--
// SASADA Koichi at atdot dot net

#7 Updated by Yusuke Endoh about 2 years ago

ko1 (Koichi Sasada) wrote:

 これに関して、実は 1.9.3 に戻したというのが実情です RUBY_VM_CHECK_INTS
を外して綺麗になって速くなるかな、と思ったんですが、ちょっとこの挙動(C
method の繰り返しの中で rb_funcall している)を思いつかなかったので、デ
グレ対応と言えるかと思います。というわけで、自信があります。

なるほど、とても安心できる説明ありがとうございます。
バックポートお願いします。

Yusuke Endoh mame@tsg.ne.jp

#8 Updated by Koichi Sasada about 2 years ago

  • Status changed from Assigned to Closed

merged at r39332.

Also available in: Atom PDF