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=>[]}
TracePoint#parameters
だけではなくてdefine_method
+TracePoint
全般の問題らしい
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] になるべき?
- チケット自体は3年前のやつだけど最近修正 PR が投げられてた
[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倍)
Integer#digits
は各桁を配列として返すメソッド
pp 16.digits # => [6, 1] pp 1234.digits # => [4, 3, 2, 1]
- 最近 PR が投げられてた
[PR 4414] [WIP] add error_squiggle gem
- エラー箇所をマークする gem が開発されてるよ、っていう話
- #17930 関連
$ ./local/bin/ruby -e '1.time {}' -e:1:in `<main>': undefined method `time' for 1:Integer (NoMethodError) 1.time {} ^^^^^ Did you mean? times
- gem 名についての意見を求めている
- ちなみにエラー箇所にマルチバイト文字が含まれているとぶっ壊れるのでなんとかしてえ
$ ./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
- async-gem を標準ライブラリに追加しよう!というチケット
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