🕌

[Bug #20573] 警告が有効なときのみ Warning#warn が呼び出されるようにする

2024/06/16に公開

[Bug #20573] Warning.warn shouldn't be called for disabled warnings

module Warning
  def self.warn(message, category:)
    pp category => message
  end
end

def get_var
  $=
end

get_var
# output: {:deprecated=>"/tmp/vlhK9hI/25:8: warning: variable $= is no longer effective\n"}
  • カテゴリごとの警告は Warning[] で制御できるんですが『無効になっているときには #warn は呼び出されるべきではない』というバグ報告
  • 現状は無効になっていても Warning#warn が呼び出される
module Warning
  def self.warn(message, category:)
    pp category => message
  end
end

def get_var
  $=
end

# deprecated の警告は無効になっているが Warning.warn が呼び出される
pp Warning[:deprecated]   # => false
get_var
# output: {:deprecated=>"/tmp/vlhK9hI/25:8: warning: variable $= is no longer effective\n"}
  • 開発版の Ruby 3.4 では無効になっている警告は Warng#warn が呼び出されないようになりました
module Warning
  def self.warn(message, category:)
    pp category => message
  end
end

def get_var
  $=
end

# deprecated の警告が無効な場合は deprecated の Warning#warn は呼び出されない
pp Warning[:deprecated]   # => false
get_var
# Ruby 3.3 => output: {:deprecated=>"/tmp/vlhK9hI/25:8: warning: variable $= is no longer effective\n"}
# Ruby 3.4 => output: non

# deprecated の警告が有効な場合は deprecated の Warning#warn が呼び出される
Warning[:deprecated] = true
pp Warning[:deprecated]   # => true
get_var
# Ruby 3.3 => output: {:deprecated=>"/tmp/vlhK9hI/25:8: warning: variable $= is no longer effective\n"}
# Ruby 3.4 => output: {:deprecated=>"/tmp/vlhK9hI/25:8: warning: variable $= is no longer effective\n"}
puts RUBY_DESCRIPTION

eval "def test; " +
  1000.times.map { "$=" }.join(";") + "; end"

def run_benchmark count
  i = 0
  while i < count
    start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
    yield
    ms = Process.clock_gettime(Process::CLOCK_MONOTONIC) - start
    puts "itr ##{i}: #{(ms * 1000).to_i}ms"
    i += 1
  end
end

run_benchmark(25) do
  250.times do
    test
  end
end
ruby 3.3.3 (2024-06-12 revision f1c7b6f435) [x86_64-linux]
itr #0: 157ms
itr #1: 133ms
itr #2: 108ms
itr #3: 109ms
itr #4: 112ms
itr #5: 112ms
itr #6: 112ms
itr #7: 112ms
itr #8: 113ms
itr #9: 113ms
itr #10: 113ms
itr #11: 112ms
itr #12: 112ms
itr #13: 112ms
itr #14: 117ms
itr #15: 108ms
itr #16: 108ms
itr #17: 110ms
itr #18: 109ms
itr #19: 112ms
itr #20: 113ms
itr #21: 112ms
itr #22: 112ms
itr #23: 112ms
itr #24: 112ms
ruby 3.4.0dev (2024-06-15T20:14:58Z master ef423dd6d4) [x86_64-linux]
itr #0: 2ms
itr #1: 2ms
itr #2: 2ms
itr #3: 2ms
itr #4: 2ms
itr #5: 2ms
itr #6: 2ms
itr #7: 2ms
itr #8: 2ms
itr #9: 2ms
itr #10: 2ms
itr #11: 2ms
itr #12: 2ms
itr #13: 2ms
itr #14: 2ms
itr #15: 2ms
itr #16: 2ms
itr #17: 2ms
itr #18: 2ms
itr #19: 2ms
itr #20: 2ms
itr #21: 2ms
itr #22: 2ms
itr #23: 2ms
itr #24: 2ms
GitHubで編集を提案

Discussion