Ruby Issue Tracking System: Issueshttps://redmine.ruby-lang.org/https://redmine.ruby-lang.org/favicon.ico?17113305112017-09-23T16:48:31ZRuby Issue Tracking System
Redmine Ruby master - Bug #13932 (Closed): [PATCH] Extension libraries take precedence in checks of later...https://redmine.ruby-lang.org/issues/139322017-09-23T16:48:31Zakihikodaki (Akihiko Odaki)akihiko.odaki.4i@stu.hosei.ac.jp
<p>Extension libraries take precedence in checks of later <code>Kernel.#require</code> calls for features without file extensions. That behavior is inconsistent with the first call, and can cause problems.</p>
<p>For instance, feature <code>openssl</code> has <code>openssl.rb</code> and <code>openssl.so</code>, but it assumes <code>openssl.rb</code> will always be loaded when it gets required. That assumption works for the first call of <code>Kernel.#require</code>, but for the later calls, <code>require</code> assumes <code>openssl.so</code> is being required and checks if the file is valid for the requirement.</p>
<p>Usually that is not so problematic since it just check if <code>openssl.so</code>, which is already required by <code>openssl.rb</code>, is required or not. However, if there is a new alternative <code>openssl.rb</code> in <code>$:</code>, the file will be loaded and conflict with the feature already loaded.<br>
The below is a code example.</p>
<pre><code class="Ruby syntaxhl" data-language="Ruby"><span class="nb">p</span> <span class="vg">$:</span><span class="p">.</span><span class="nf">include?</span> <span class="s1">'/usr/lib/ruby/2.4.0'</span> <span class="c1"># true</span>
<span class="nb">p</span> <span class="vg">$:</span><span class="p">.</span><span class="nf">include?</span> <span class="s1">'/home/aki/mastodon/vendor/bundle/ruby/2.4.0/gems/openssl-2.0.5/lib'</span> <span class="c1"># false</span>
<span class="nb">p</span> <span class="vg">$"</span><span class="p">.</span><span class="nf">include?</span> <span class="s1">'/usr/lib/ruby/2.4.0/openssl/openssl.rb'</span> <span class="c1"># false</span>
<span class="nb">p</span> <span class="vg">$"</span><span class="p">.</span><span class="nf">include?</span> <span class="s1">'/home/aki/mastodon/vendor/bundle/ruby/2.4.0/gems/openssl-2.0.5/lib/openssl.rb'</span> <span class="c1"># false</span>
<span class="nb">require</span> <span class="s1">'openssl'</span>
<span class="nb">p</span> <span class="vg">$"</span><span class="p">.</span><span class="nf">include?</span> <span class="s1">'/usr/lib/ruby/2.4.0/openssl/openssl.rb'</span> <span class="c1"># true</span>
<span class="nb">p</span> <span class="vg">$"</span><span class="p">.</span><span class="nf">include?</span> <span class="s1">'/home/aki/mastodon/vendor/bundle/ruby/2.4.0/gems/openssl-2.0.5/lib/openssl.rb'</span> <span class="c1"># false</span>
<span class="vg">$:</span><span class="p">.</span><span class="nf">unshift</span> <span class="s1">'/home/aki/mastodon/vendor/bundle/ruby/2.4.0/gems/openssl-2.0.5/lib'</span>
<span class="nb">require</span> <span class="s1">'openssl'</span>
<span class="nb">p</span> <span class="vg">$"</span><span class="p">.</span><span class="nf">include?</span> <span class="s1">'/home/aki/mastodon/vendor/bundle/ruby/2.4.0/gems/openssl-2.0.5/lib/openssl.rb'</span> <span class="c1"># true (unexpected)</span>
</code></pre> Ruby master - Bug #13648 (Closed): [PATCH] Nested map of Enumerator::Lazy with packed values give...https://redmine.ruby-lang.org/issues/136482017-06-09T16:11:34Zakihikodaki (Akihiko Odaki)akihiko.odaki.4i@stu.hosei.ac.jp
<p>This test case ends up with the following result.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">class</span> <span class="nc">Step</span>
<span class="kp">include</span> <span class="no">Enumerable</span>
<span class="nb">attr_reader</span> <span class="ss">:current</span><span class="p">,</span> <span class="ss">:args</span>
<span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">enum</span><span class="p">)</span>
<span class="vi">@enum</span> <span class="o">=</span> <span class="n">enum</span>
<span class="vi">@current</span> <span class="o">=</span> <span class="kp">nil</span>
<span class="vi">@args</span> <span class="o">=</span> <span class="kp">nil</span>
<span class="k">end</span>
<span class="k">def</span> <span class="nf">each</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
<span class="vi">@args</span> <span class="o">=</span> <span class="n">args</span>
<span class="vi">@enum</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">v</span><span class="o">|</span>
<span class="vi">@current</span> <span class="o">=</span> <span class="n">v</span>
<span class="k">if</span> <span class="n">v</span><span class="p">.</span><span class="nf">is_a?</span> <span class="no">Enumerable</span>
<span class="k">yield</span> <span class="o">*</span><span class="n">v</span>
<span class="k">else</span>
<span class="k">yield</span> <span class="n">v</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="n">a</span> <span class="o">=</span> <span class="no">Step</span><span class="p">.</span><span class="nf">new</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">]])</span>
<span class="n">assert_equal</span><span class="p">([[[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">]]],</span> <span class="n">a</span><span class="p">.</span><span class="nf">lazy</span><span class="p">.</span><span class="nf">map</span> <span class="p">{</span><span class="o">|*</span><span class="n">args</span><span class="o">|</span> <span class="n">args</span><span class="p">}.</span><span class="nf">map</span> <span class="p">{</span><span class="o">|*</span><span class="n">args</span><span class="o">|</span> <span class="n">args</span><span class="p">}.</span><span class="nf">to_a</span><span class="p">)</span>
</code></pre>
<pre><code><[[[1, 2]]]> expected but was
<[[1, 2]]>.
</code></pre>
<p>Here, <code>[[[1, 2]]]</code> is expected because:</p>
<ul>
<li>An array should be created with the first map, which results in <code>[1, 2]</code>.</li>
<li>The array should be wrapped in another array with the second map, which results in <code>[[1, 2]]</code>.</li>
<li>The array should be wrapped in another array with to_a, which results in <code>[[[1, 2]]]</code>.</li>
</ul>
<p>However, it returns <code>[[1, 2]]</code> because:</p>
<ul>
<li>An array will be created with the first map, which results in <code>[1, 2]</code>.</li>
<li>However, the array will be internally considered as "packed" and the unpacked arguments will be passed to the second map.</li>
<li>The second map wraps them into another array, which results in <code>[1, 2]</code>.</li>
<li>The array will be wrapped in another array with to_a, which results in <code>[[1, 2]]</code>.</li>
</ul>
<p>I have attached the test case and a fix. The fix marks values returned by blocks are not packed.</p>