Ruby Issue Tracking System: Issues
https://bugs.ruby-lang.org/
https://bugs.ruby-lang.org/favicon.ico?1711330511
2020-11-27T08:52:56Z
Ruby Issue Tracking System
Redmine
Ruby master - Bug #17349 (Closed): Rake での並行実行における正規表現マッチングの異常
https://bugs.ruby-lang.org/issues/17349
2020-11-27T08:52:56Z
shuujii (Shuji KOBAYASHI)
shuujii@gmail.com
<p>小さな再現コードが作成できなかったのですが、以下のように Rake で並行実行すると正規表現のマッチングがおかしくなることがあるように見えます。</p>
<a name="再現手順"></a>
<h3 >再現手順<a href="#再現手順" class="wiki-anchor">¶</a></h3>
<pre><code class="shell syntaxhl" data-language="shell"><span class="nv">$ </span>git clone https://github.com/mruby/mruby
<span class="nv">$ </span><span class="nb">cd </span>mruby
<span class="nv">$ </span>git checkout 0cb3a718
<span class="nv">$ </span>rake <span class="nt">-m</span> <span class="nv">CONFIG</span><span class="o">=</span>boxing clean gensym
Cleaned up target build folder
GEN build/boxing-no-m64-i32/presym
GEN build/boxing-no-m64-i32/include/mruby/presym.inc
GEN build/boxing-no-m32-i32/presym
GEN build/boxing-no-m32-i64/presym
<span class="o">(</span>snip<span class="o">)</span>
rake aborted!
NoMethodError: undefined method <span class="sb">`</span><span class="k">*</span><span class="s1">' for nil:NilClass
/mruby/tasks/presym.rake:81:in `block (4 levels) in <top (required)>'</span>
/mruby/tasks/presym.rake:80:in <span class="sb">`</span>map<span class="s1">'
/mruby/tasks/presym.rake:80:in `block (3 levels) in <top (required)>'</span>
/mruby/tasks/presym.rake:69:in <span class="sb">`</span>map<span class="s1">'
/mruby/tasks/presym.rake:69:in `block (2 levels) in <top (required)>'</span>
Tasks: TOP <span class="o">=></span> gensym <span class="o">=></span> /mruby/build/boxing-no-m64-i64/presym
<span class="o">(</span>See full trace by running task with <span class="nt">--trace</span><span class="o">)</span>
rake aborted!
</code></pre>
<p>エラーが発生しているのは以下の部分です。</p>
<p><a href="https://github.com/mruby/mruby/blob/13fc5034345ae159f034849cb3f235f4463edd45/tasks/presym.rake#L80-L82" class="external">https://github.com/mruby/mruby/blob/13fc5034345ae159f034849cb3f235f4463edd45/tasks/presym.rake#L80-L82</a></p>
<p><code>prefix</code> や <code>suffix</code> の値がおかしくなっているために、<code>macro_to_symbol[[prefix, suffix]]</code> が <code>nil</code> なり例外になっています。本来であればこの値は <code>nil</code> にならないはずのものです。</p>
<a name="補足"></a>
<h3 >補足<a href="#補足" class="wiki-anchor">¶</a></h3>
<ul>
<li>
<code>rake</code> に <code>-m</code> を付けないで並行実行にしなければ発生しません。</li>
<li>こちらの環境では少なくとも30回に1回くらいは上記のエラーが発生します。</li>
<li>正規表現のマッチ結果は上記とは違う異常になることもあるようです。</li>
</ul>
Ruby master - Bug #15857 (Closed): <=> の右辺が <=> を実装していない場合の振る舞い
https://bugs.ruby-lang.org/issues/15857
2019-05-17T10:40:16Z
shuujii (Shuji KOBAYASHI)
shuujii@gmail.com
<p><code><=></code> の右辺が <code><=></code> を実装していないとき、<code>nil</code> が返却される場合と例外が発生する場合があり一貫性がないように思えるのですが、意図的でしょうか。</p>
<pre><code class="ruby syntaxhl" data-language="ruby"> <span class="mi">0</span> <span class="o"><=></span> <span class="mi">0</span><span class="n">i</span> <span class="c1">#=> NoMethodError (undefined method `<=>' for (0+0i):Complex)</span>
<span class="mi">0</span> <span class="o"><=></span> <span class="no">BasicObject</span><span class="p">.</span><span class="nf">new</span> <span class="c1">#=> nil</span>
<span class="ss">:a</span> <span class="o"><=></span> <span class="mi">0</span><span class="n">i</span> <span class="c1">#=> nil</span>
<span class="s2">"a"</span> <span class="o"><=></span> <span class="mi">0</span><span class="n">i</span> <span class="c1">#=> NoMethodError (undefined method `<=>' for (0+0i):Complex)</span>
</code></pre>
<p>なお、<code>0 <=> 0i</code> に関しては、<code>0 == 0i</code> は <code>true</code> になるのでそれとも一貫性がないように思えるのもやや気になりました。</p>
Ruby master - Bug #15537 (Closed): Numeric#step doesn't iterate under some conditions
https://bugs.ruby-lang.org/issues/15537
2019-01-15T10:17:48Z
shuujii (Shuji KOBAYASHI)
shuujii@gmail.com
<p>Numeric#step doesn't iterate under the following conditions:</p>
<ul>
<li>receiver and/or <code>by</code> are <code>Float</code>
</li>
<li>
<code>by</code> is negative</li>
<li>
<code>to</code> is default</li>
<li>without block</li>
</ul>
<a name="Example"></a>
<h3 >Example:<a href="#Example" class="wiki-anchor">¶</a></h3>
<p>Good:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="nb">p</span> <span class="mi">1</span><span class="p">.</span><span class="nf">step</span><span class="p">(</span><span class="ss">by: </span><span class="mi">3</span><span class="p">).</span><span class="nf">take</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="c1">#=> [1, 4]</span>
<span class="nb">p</span> <span class="mi">1</span><span class="p">.</span><span class="nf">step</span><span class="p">(</span><span class="ss">by: </span><span class="o">-</span><span class="mi">3</span><span class="p">).</span><span class="nf">take</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="c1">#=> [1, -2]</span>
<span class="nb">p</span> <span class="mi">1</span><span class="p">.</span><span class="nf">step</span><span class="p">(</span><span class="ss">by: </span><span class="mf">3.0</span><span class="p">).</span><span class="nf">take</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="c1">#=> [1.0, 4.0]</span>
<span class="nb">p</span> <span class="mf">1.0</span><span class="p">.</span><span class="nf">step</span><span class="p">(</span><span class="ss">by: </span><span class="mi">3</span><span class="p">).</span><span class="nf">take</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="c1">#=> [1.0, 4.0]</span>
<span class="n">a</span><span class="o">=</span><span class="p">[];</span> <span class="nb">p</span> <span class="mi">1</span><span class="p">.</span><span class="nf">step</span><span class="p">(</span><span class="ss">by: </span><span class="o">-</span><span class="mf">3.0</span><span class="p">){</span><span class="o">|</span><span class="n">n</span><span class="o">|</span><span class="k">break</span> <span class="n">a</span> <span class="k">if</span> <span class="p">(</span><span class="n">a</span> <span class="o"><<</span> <span class="n">n</span><span class="p">).</span><span class="nf">size</span> <span class="o">==</span> <span class="mi">2</span><span class="p">}</span> <span class="c1">#=> [1.0, -2.0]</span>
<span class="n">a</span><span class="o">=</span><span class="p">[];</span> <span class="nb">p</span> <span class="mf">1.0</span><span class="p">.</span><span class="nf">step</span><span class="p">(</span><span class="ss">by: </span><span class="o">-</span><span class="mi">3</span><span class="p">){</span><span class="o">|</span><span class="n">n</span><span class="o">|</span><span class="k">break</span> <span class="n">a</span> <span class="k">if</span> <span class="p">(</span><span class="n">a</span> <span class="o"><<</span> <span class="n">n</span><span class="p">).</span><span class="nf">size</span> <span class="o">==</span> <span class="mi">2</span><span class="p">}</span> <span class="c1">#=> [1.0, -2.0]</span>
</code></pre>
<p>Bad:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="nb">p</span> <span class="mi">1</span><span class="p">.</span><span class="nf">step</span><span class="p">(</span><span class="ss">by: </span><span class="o">-</span><span class="mf">3.0</span><span class="p">).</span><span class="nf">take</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="c1">#=> []</span>
<span class="nb">p</span> <span class="mf">1.0</span><span class="p">.</span><span class="nf">step</span><span class="p">(</span><span class="ss">by: </span><span class="o">-</span><span class="mi">3</span><span class="p">).</span><span class="nf">take</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="c1">#=> []</span>
</code></pre>
<p>I have attached a patch.</p>
Ruby master - Bug #15488 (Closed): const_defined?("File::NULL") の挙動
https://bugs.ruby-lang.org/issues/15488
2018-12-30T04:07:01Z
shuujii (Shuji KOBAYASHI)
shuujii@gmail.com
<p><code>const_get</code> と <code>const_defined?</code> について、例えば <code>Math::PI</code> では以下のようになり<br>
どちらも期待通りの結果になります。</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="nb">p</span> <span class="no">Object</span><span class="p">.</span><span class="nf">const_get</span><span class="p">(</span><span class="s2">"Math::PI"</span><span class="p">)</span> <span class="c1">#=> 3.141592653589793</span>
<span class="nb">p</span> <span class="no">Object</span><span class="p">.</span><span class="nf">const_defined?</span><span class="p">(</span><span class="s2">"Math::PI"</span><span class="p">)</span> <span class="c1">#=> true</span>
</code></pre>
<p>一方、<code>File::NULL</code> の場合は以下のように <code>const_get</code> で値が取得できるのに<br>
<code>const_defined?</code> が <code>false</code> になります。</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="nb">p</span> <span class="no">Object</span><span class="p">.</span><span class="nf">const_get</span><span class="p">(</span><span class="s2">"File::NULL"</span><span class="p">)</span> <span class="c1">#=> "/dev/null"</span>
<span class="nb">p</span> <span class="no">Object</span><span class="p">.</span><span class="nf">const_defined?</span><span class="p">(</span><span class="s2">"File::NULL"</span><span class="p">)</span> <span class="c1">#=> false</span>
</code></pre>
<p>これは意図的でしょうか。</p>
Ruby master - Bug #15454 (Closed): Add documentation for Struct#to_h with block
https://bugs.ruby-lang.org/issues/15454
2018-12-23T02:03:34Z
shuujii (Shuji KOBAYASHI)
shuujii@gmail.com
<p>There is no docs about <code>Struct#to_h</code> with block.</p>
<p>Patch attached.</p>
Ruby master - Feature #15451 (Closed): OpenStruct#to_h でブロックを許容する
https://bugs.ruby-lang.org/issues/15451
2018-12-22T13:18:39Z
shuujii (Shuji KOBAYASHI)
shuujii@gmail.com
<p><code>Struct#to_h</code> がブロックを受け付けるようになったので、<code>OpenStruct#to_h</code><br>
も同様にしてはどうでしょうか。</p>
<p>パッチを添付します。</p>
Ruby master - Feature #15435 (Open): Float の Infinity に生成済みの値を使用する
https://bugs.ruby-lang.org/issues/15435
2018-12-19T08:08:58Z
shuujii (Shuji KOBAYASHI)
shuujii@gmail.com
<p>Float の Infinity はしばしば使われると思うのですが、Flonum が有効でも即値に<br>
ならないので、演算の結果や C から DBL2NUM で返却される場合などに毎回オブ<br>
ジェクトが生成されます。</p>
<p>Ruby リポジトリーで、Infinity オブジェクトが生成されると明確に分かる場所を簡<br>
単に調べた限りでは20数箇所ありました。</p>
<pre><code>$ grep 'DBL2NUM.*HUGE_VAL' $(git ls-files | awk '/\.c$/ && !/^(spec|ext\/-test-)\//') | wc -l
21
$ egrep -- '-Float::INFINITY' $(git ls-files | egrep '^(lib|ext)/.*\.rb$') | wc -l
2
</code></pre>
<p>それで、Infinity の場合は生成済みのオブジェクトを返すようにしてはどうでしょ<br>
うか。</p>
<p>パッチを添付します。添付のベンチマークを benchmark-driver で実行した限りでは、<br>
演算結果が Infinity になる場合は性能が向上し、そうでない場合は有意な差はない<br>
(計測の度にかなりばらつきがあるが概ね10%以内の差におさまる) ようでした。</p>
<pre><code>Calculating -------------------------------------
compare-ruby built-ruby
positive_infinity 34.531M 62.540M i/s - 3.000M times in 0.195822s 0.107997s
negative_infinity 42.581M 94.234M i/s - 3.000M times in 0.159061s 0.071766s
flonum 142.010M 150.967M i/s - 3.000M times in 0.047544s 0.045120s
heap 33.952M 34.629M i/s - 3.000M times in 0.199321s 0.195063s
Comparison:
positive_infinity
built-ruby: 62540441.7 i/s
compare-ruby: 34530877.6 i/s - 1.81x slower
negative_infinity
built-ruby: 94234135.1 i/s
compare-ruby: 42580998.6 i/s - 2.21x slower
flonum
built-ruby: 150967185.7 i/s
compare-ruby: 142010146.8 i/s - 1.06x slower
heap
built-ruby: 34629459.1 i/s
compare-ruby: 33952081.8 i/s - 1.02x slower
</code></pre>
Ruby master - Bug #15432 (Closed): Float の NaN のみを含む配列比較のテスト
https://bugs.ruby-lang.org/issues/15432
2018-12-18T08:46:48Z
shuujii (Shuji KOBAYASHI)
shuujii@gmail.com
<p>Float の NaN のみを含む配列比較のテストが以下にあります。</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="c1">## spec/ruby/core/array/equal_value_spec.rb:47</span>
<span class="c1"># As per bug #1720</span>
<span class="n">it</span> <span class="s2">"returns false for [NaN] == [NaN]"</span> <span class="k">do</span>
<span class="p">[</span><span class="n">nan_value</span><span class="p">].</span><span class="nf">should_not</span> <span class="o">==</span> <span class="p">[</span><span class="n">nan_value</span><span class="p">]</span>
<span class="k">end</span>
</code></pre>
<p>しかし、これは <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: [NaN] == [NaN] が true になる (Closed)" href="https://bugs.ruby-lang.org/issues/1720">#1720</a> で未定義動作とするとなったと思うので不要ではないでしょうか。</p>
<p>現状では以下のようになるので意味のないテストだと思います。</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="p">[</span><span class="no">Float</span><span class="o">::</span><span class="no">NAN</span><span class="p">]</span> <span class="o">==</span> <span class="p">[</span><span class="no">Float</span><span class="o">::</span><span class="no">NAN</span><span class="p">]</span> <span class="c1">#=> true</span>
<span class="p">[</span><span class="no">Float</span><span class="o">::</span><span class="no">NAN</span><span class="p">]</span> <span class="o">==</span> <span class="p">[</span><span class="mi">0</span><span class="o">/</span><span class="mf">0.0</span><span class="p">]</span> <span class="c1">#=> false</span>
</code></pre>
Ruby master - Bug #15421 (Closed): erb コマンドの -P オプションの説明
https://bugs.ruby-lang.org/issues/15421
2018-12-16T11:49:28Z
shuujii (Shuji KOBAYASHI)
shuujii@gmail.com
<p><code>erb</code> コマンドの <code>-P</code> オプションは、<code>%</code> で始まる行を Ruby コードとして評価する機能を無効にする、という意味だと思うのですが、man ページの説明は以下のようになっていて正しくないように思います。</p>
<pre><code>-P Evaluates lines starting with % as Ruby code and removes
the tailing EOLs.
</code></pre>
<p>また、<code>erb --help</code> の説明は以下のようになっていて、行を無視する訳ではないのでこちらもあまり適切ではないように思います。</p>
<pre><code>-P ignore lines which start with "%"
</code></pre>
<p>RDoc での trim mode の説明を参考に修正したパッチを添付します。</p>
Ruby master - Bug #15420 (Closed): Kernel#sleep などに負数を渡したときのエラーメッセージ
https://bugs.ruby-lang.org/issues/15420
2018-12-16T05:23:11Z
shuujii (Shuji KOBAYASHI)
shuujii@gmail.com
<p><code>sleep</code> に負数を渡した場合のエラーメッセージは以下のようになります。</p>
<pre><code>$ ruby -e 'sleep(-1)'
Traceback (most recent call last):
1: from -e:1:in `<main>'
-e:1:in `sleep': time interval must be positive (ArgumentError)
</code></pre>
<p>しかし、0 は許容されているので "must not be negative" などのほうが良いと思います。</p>
Ruby master - Bug #15416 (Closed): 配列リテラル内の引数を伴う括弧なしのメソッド呼び出しで syntax error
https://bugs.ruby-lang.org/issues/15416
2018-12-15T02:42:39Z
shuujii (Shuji KOBAYASHI)
shuujii@gmail.com
<p>以下のような配列リテラル内の引数を伴う括弧なしのメソッド呼び出しで syntax error が発生します。</p>
<pre><code>$ ruby -ce '[p 1]'
-e:1: syntax error, unexpected tINTEGER, expecting do or '{' or '('
[p 1]
^
</code></pre>
<p>メソッドの <code>[]</code> や <code>[]=</code> の中ではエラーにならないので許容されたほうが良いと思います。</p>
<pre><code>$ ruby -ce '{}[p 1]'
Syntax OK
$ ruby -ce '{}[p 1]=1'
Syntax OK
</code></pre>
<p>なお、Ruby 1.8 ではエラーになりませんでした。</p>
<pre><code>$ ruby187 -vce '[p 1]'
ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux]
Syntax OK
</code></pre>
<p>添付のパッチで許容されるようになった気がします。</p>
Ruby master - Bug #6348 (Closed): OptionParser#to_a raise NoMethodError
https://bugs.ruby-lang.org/issues/6348
2012-04-24T14:03:52Z
shuujii (Shuji KOBAYASHI)
shuujii@gmail.com
<p>=begin<br>
OptionParser#to_a を呼び出すと NoMethodError が発生します。</p>
<pre><code>$ ruby -r optparse -e 'OptionParser.new.to_a'
lib/ruby/1.9.1/optparse.rb:1074:in `to_a': undefined method `to_a' for "Usage: -e [options]":String (NoMethodError)
from -e:1:in `<main>'
</code></pre>
<p>=end</p>