2020/08/20 今週の気になった bugs.ruby

内容は適当です。
今週と言っても今週みかけたチケットなだけでチケット自体は昔からあるやつもあります。

[Misc #17041] DevelopersMeeting20200826Japan

  • 来週水曜日に開発者会議があります
  • 気になるチケットがあれば上記のチケットにコメントしておきましょう

[Feature #17122] Add category to Warning#warn

  • Warning.#warncategory: キーワード引数を追加する提案
module Warning
  #
  def self.warn(msg, category: nil)
    # deprecated 警告の場合に raise する
    if category == :deprecated
      raise msg
    else
      super
    end
  end
end

def ivar
  Object.new.instance_variable_get(:@ivar)
end

# 例外エラーは発生しないが警告は出る
ivar

# 例外エラーになる
Object.new.tainted?
  • 警告の種類によって挙動を制御できるのは便利そう
  • ただ、実装を見る限り現状は deprecated しかなさそう?
  • そもそも category という概念は今の Warning にも存在して Warning[category] = false みたいに制御できる
    • その上で現状は categorydeprecated しかなさそう
  • 今回の提案としては『特定の category の警告だった場合にアプリケーション側で制御することができるようにする』という意図になる
  • warn に引数が増えるので非互換になるのがちょっと気になる
    • 既存の def self.warn(msg) で定義されているメソッドに category: を渡すとエラーになる

RubyのナンパラでSEGV - ゲームリンクスの徒然なる日常

  • bugs.ruby とは関係ないんですがつらそうな問題だったので紹介
  • [1, 2, 3, 4].map{ _1 **3 } すると segv する内容の記事
    • [1, 2, 3, 4].map{ _1 ** 3 } みたいにスペースを置くと OK
  • このコードには2つ問題がある

_1 *1_1(*1) と解釈される問題

  • 通常だと変数 a が定義されていれば a *1a.* 1 と解釈される
    • メソッド a だけなら a(*1) 、変数 a と両方定義さていれば a.* 1 になる
  • しかし _1 の場合は必ず _1(*1) として解釈される
  • この問題に対するチケットはあったが _1 は将来的にメソッドとして定義できなくなる、という理由で Close
  • 2.8.0-dev だと _1 の変数やメソッドは定義するとエラーになるが define_method(:_1) だと依然として定義できるのでやっぱりなにかしらの対応は必要な気がする
define_method(:_1) { |a| a + a }
p self.then { _1 1 }
# => 2
  • CRuby のパーサ読んでみたけどなにもわからない

p(**1) が segv する問題

  • Ruby 2.7 だと p(**1) だけで segv する
    • 多分 Ruby 2.7 で変更されたキーワード引数関連の問題?
  • 2.7 以外では問題なく動作する(ちゃんと実行時エラーになる
  • 2.8.0-dev では動作しているけど該当チケットがなさそうだったのでどこかのコミットで勝手に直ったみたい?
  • git bisect で修正されたコミットを調べてバックポートしたい…