2021/06/24 今週の気になった bugs.ruby のチケット

今週はエラー箇所をマークする gem の PR などがありました。

[Bug #14817] TracePoint#parameters for bmethod's return event should return the same value as its Method#parameters

  • TracePoint の :return イベント時に TracePoint#parameters で正しく値が取得できないバグ報告
define_method(:bm) {|a|}

p method_parameters: method(:bm).parameters
# => {:method_parameters=>[[:req, :a]]}

trace = TracePoint.new(:call, :return){|tp|
  mid = tp.method_id
  if mid == :bm
    p mid: mid, event: tp.event, tp_parameters: tp.parameters
  end
}
trace.enable{
  bm(0)
}

# :call 時は parameters が取得できているが
# :return 時は parameters が取得できてない
# output:
# {:mid=>:bm, :event=>:call, :tp_parameters=>[[:req, :a]]}
# {:mid=>:bm, :event=>:return, :tp_parameters=>[]}
define_method(:bm) {|a|}

trace = TracePoint.new(:call, :return){|tp|
  p [tp.event, tp.lineno] if tp.method_id == :bm
}
trace.enable{
  bm(0)
}
# output:
# [:call, 1]
# [:return, 7] #=> [:return, 1] になるべき?

[Bug #14391] Integer#digitsが遅い

  • Integer#digits が遅いというバグ報告
  • Integer#to_s と比較してもかなり遅いらしい
(9999**9999).to_s.chars.map(&:to_i).reverse # 0.030225秒
(9999**9999).digits # 1.187126秒 (40倍)

(99999**99999).to_s.chars.map(&:to_i).reverse # 1.888218秒
(99999**99999).digits # 195.594539秒 (100倍)
pp 16.digits    # => [6, 1]
pp 1234.digits  # => [4, 3, 2, 1]

[PR 4414] [WIP] add error_squiggle gem

  • エラー箇所をマークする gem が開発されてるよ、っていう話
$ ./local/bin/ruby -e '1.time {}'
-e:1:in `<main>': undefined method `time' for 1:Integer (NoMethodError)

1.time {}
 ^^^^^
Did you mean?  times
$ ./ruby -e 'ああああ.time {}'
-e:1:in `<main>': undefined local variable or method `ああああ' for main:Object (NameError)

ああああ.time {}
^^^^^^^^^^^^
$ ./ruby -e '1.あああ {}'
-e:1:in `<main>': undefined method `あああ' for 1:Integer (NoMethodError)

1.あああ {}
 ^^^^
  • 原因自体はわかっているんだけどマルチバイト文字で表示幅を計算する方法が現状 reline の内部 API にしか存在していないのでつらい

[Feature #18004] Add Async to the stdlib

require 'async'

def sleepy(duration = 3)
  Async do |task|
    task.sleep duration
    puts "I'm done sleeping, time for action!"
  end
end

# 同期処理
sleepy

# 非同期処理
Async do
  # 同時に sleep が実行される
  sleepy
  sleepy
end