Project

General

Profile

Actions

Bug #14006

closed

2.5.0preview1でWarning.warnを再定義するとSystemStackErrorが発生する

Added by y-yagi (Yuji Yaginuma) over 6 years ago. Updated over 3 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 2.5.0preview1 (2017-10-10 trunk 60153) [x86_64-linux]
[ruby-dev:50293]

Description

下記スクリプトを2.5.0.preview1で実行するとSystemStackErrorが発生します。 なお、下記スクリプトはRuby 2.4.1p111ではエラーが発生せず正常に動作します。

# warning_test.rb
module Warning
  def warn(message)
    return if message.match?("warning: possibly useless use of a variable in void context")

    super
  end
end

@a 

バックトレースは下記の通りです。

ruby -v warning_test.rb
ruby 2.5.0preview1 (2017-10-10 trunk 60153) [x86_64-linux]
warning_test.rb:9: warning: possibly useless use of a variable in void context
warning_test.rb:2: warning: method redefined; discarding old warn
Traceback (most recent call last):
	7580: from warning_test.rb:9:in `<main>'
	7579: from warning_test.rb:5:in `warn'
	7578: from warning_test.rb:5:in `warn'
	7577: from warning_test.rb:5:in `warn'
	7576: from warning_test.rb:5:in `warn'
	7575: from warning_test.rb:5:in `warn'
	7574: from warning_test.rb:5:in `warn'
	7573: from warning_test.rb:5:in `warn'
	 ... 7568 levels...
	   4: from warning_test.rb:5:in `warn'
	   3: from warning_test.rb:5:in `warn'
	   2: from warning_test.rb:5:in `warn'
	   1: from warning_test.rb:5:in `warn'
warning_test.rb:5:in `warn': stack level too deep (SystemStackError)

なお、再定義の方法を、

def Warning.warn(message) 
  ... 
end 

のように変更すると、エラーが発生せず正常に動作します。

これは意図的な挙動でしょうか?


Related issues 1 (0 open1 closed)

Related to Ruby master - Feature #12944: Change Kernel#warn to call Warning.warnClosedActions
Actions #1

Updated by y-yagi (Yuji Yaginuma) over 6 years ago

  • ruby -v set to ruby 2.5.0preview1 (2017-10-10 trunk 60153) [x86_64-linux]
Actions #2

Updated by wanabe (_ wanabe) over 6 years ago

  • Related to Feature #12944: Change Kernel#warn to call Warning.warn added

Updated by shevegen (Robert A. Heiler) over 6 years ago

Sorry that I distract, please ignore me :) - that kanji ッ looks like a smiley face!

No wonder matz recognized the "lonely person staring at the ground" syntax. :D

Updated by nobu (Nobuyoshi Nakada) over 6 years ago

再定義は Warning.warn にするという想定だったんですが、 Warning#warn の再定義はどうしましょうかねぇ。

Actions #5

Updated by nobu (Nobuyoshi Nakada) over 6 years ago

  • Status changed from Open to Closed

Applied in changeset trunk|r60175.


error.c: infinite recursion at Warning#warn

  • error.c (rb_warn_m): write the message to rb_stderr directly, to
    get rid of infinite recursion when called on Warning module
    itself, by super in redefined Warning#warn.
    [ruby-dev:50293] [Bug #14006]

Updated by Eregon (Benoit Daloze) over 3 years ago

I think the SystemStackError is expected in that case.

By default there is Warning (which extend self) with Warning#warn and Kernel#warn.
Using super in Warning#warn calls Kernel#warn which calls Warning.warn which is resolved to Warning#warn, etc.

One should not define Warning#warn, but instead Warning.warn, or better prepend a module to Warning.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0