Ruby Issue Tracking System: Issueshttps://redmine.ruby-lang.org/https://redmine.ruby-lang.org/favicon.ico?17113305112022-11-02T05:12:11ZRuby Issue Tracking System
Redmine Ruby master - Feature #19099 (Open): Support `private_constant` for an undefined constanthttps://redmine.ruby-lang.org/issues/190992022-11-02T05:12:11Zujihisa (Tatsuhiro Ujihisa)
<p>All the following discussion applies to <code>public_constant</code> too. Maybe <code>deprecate_constant</code> as well.</p>
<a name="Problem"></a>
<h2 >Problem<a href="#Problem" class="wiki-anchor">¶</a></h2>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">class</span> <span class="nc">C</span>
<span class="no">X</span> <span class="o">=</span> <span class="o">...</span>
<span class="n">private_constant</span> <span class="ss">:X</span>
<span class="k">end</span>
</code></pre>
<p>The above idiom usually works fine, but when <code>...</code> part is long, like a 30-line Ruby Hash, it's very easy to miss the following <code>private_constant :X</code> part.</p>
<a name="Impossible-solution"></a>
<h2 >Impossible solution<a href="#Impossible-solution" class="wiki-anchor">¶</a></h2>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">class</span> <span class="nc">C</span>
<span class="n">private_constant</span> <span class="no">X</span> <span class="o">=</span> <span class="o">...</span>
<span class="k">end</span>
</code></pre>
<p>Like <code>private</code>, if the above notation could work, it would be awesome, but it breaks so many backward compatibility. The constant assignment returns its value but not the name of the constant, and we should keep the current behaviour.</p>
<a name="Proposed-solution"></a>
<h2 >Proposed solution<a href="#Proposed-solution" class="wiki-anchor">¶</a></h2>
<p>Allow the following new notation for <code>private_constant</code> by making constant private by name without actually resolving itself and raises an error.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">class</span> <span class="nc">C</span>
<span class="n">private_constant</span> <span class="ss">:X</span>
<span class="no">X</span> <span class="o">=</span> <span class="o">...</span>
<span class="k">end</span>
</code></pre>
<p>The current behaviour is to raise NameError.</p>
<pre><code>/tmp/v8svpb4/95:2:in `private_constant': constant C::X1 not defined (NameError)
private_constant :X1
^^^^^^^^^^^^^^^^
from /tmp/v8svpb4/95:2:in `<class:C>'
from /tmp/v8svpb4/95:1:in `<main>'
</code></pre>
<p>This proposal breaks this backward compatibility.</p>
<p>Also I'm concerned about potential typos. It may be hard to find typos.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">class</span> <span class="nc">C</span>
<span class="n">private_constant</span> <span class="ss">:BEHAVIOUR</span>
<span class="no">BEHAVIOR</span> <span class="o">=</span> <span class="mi">123</span> <span class="c1"># Remains public unintentionally</span>
<span class="k">end</span>
</code></pre>
<p>Maybe we need some sort of foolproof somewhere in this way.</p> Ruby master - Bug #13790 (Closed): rubyspec.org domain seems to be expiredhttps://redmine.ruby-lang.org/issues/137902017-08-08T15:09:12Zujihisa (Tatsuhiro Ujihisa)
<a name="Summary"></a>
<h2 >Summary<a href="#Summary" class="wiki-anchor">¶</a></h2>
<p>Ruby codebase has http links to rubyspec.org, but the domain is likely owned by different person, and the web page shows completely different stuff.<br>
Should we replace these URLs, so that we don't accidentally lead people to that site, and optionally we don't raise the pagerank of that site?<br>
<a href="https://github.com/ruby/ruby/search?utf8=%E2%9C%93&q=rubyspec.org&type=" class="external">https://github.com/ruby/ruby/search?utf8=%E2%9C%93&q=rubyspec.org&type=</a></p>
<a name="Background-and-problem-details"></a>
<h2 >Background and problem details<a href="#Background-and-problem-details" class="wiki-anchor">¶</a></h2>
<p>Ruby included rubyspec couple years ago. There used to be <a href="http://www.rubyspec.org" class="external">http://www.rubyspec.org</a> which hosted actual rubyspec info that we imagine.<br>
I'm not sure when it happened, but the rubyspec.org domain seems to be expired and is currently owned by somebody different, according to how it looks like right now.</p>
<p><a href="https://github.com/ruby/ruby/search?p=1&q=rubyspec.org&type=&utf8=%E2%9C%93" class="external">https://github.com/ruby/ruby/search?p=1&q=rubyspec.org&type=&utf8=%E2%9C%93</a></p>
<p>spec/rubyspec/library/net/http/http/send_request_spec.rb: This test sends an HTTP request to <a href="http://www.rubyspec.org" class="external">www.rubyspec.org</a> just as an example. I'm surprised this test has been passing. Of course there won't be any guarantees that this passes in the future.</p>
<p>spec/mspec/mspec.gemspec: very problematic</p>
<p>spec/rubyspec/core/struct/inspect_spec.rb: (yay my name is there!) that issue is missing of course</p>
<a name="Proposed-solution"></a>
<h2 >Proposed solution<a href="#Proposed-solution" class="wiki-anchor">¶</a></h2>
<p>spec/rubyspec/library/net/http/http/send_request_spec.rb: Should we keep it? If we do, let's find another example</p>
<p>spec/mspec/mspec.gemspec: replace it with this new url <a href="http://ruby.github.io/rubyspec.github.io/" class="external">http://ruby.github.io/rubyspec.github.io/</a></p>
<p>spec/rubyspec/core/struct/inspect_spec.rb: refer webarchive url or just note that the url does not exist in the comment</p> Ruby 1.8 - Bug #3154 (Closed): Hidden allocate, new and superclass methods on 1.9.2https://redmine.ruby-lang.org/issues/31542010-04-16T07:24:02Zujihisa (Tatsuhiro Ujihisa)
<p>=begin<br>
ruby 1.9.2から、あるクラスに対してどのその親クラスからもallocate new superclassの3つのメソッドがpublic_methods(false)の一覧に出てこなくなったのですが、これは意図的な仕様変更なのでしょうか。</p>
<pre><code> $ ruby192 -ve 'class A; end; A.ancestors.map {|i| p [i, i.public_methods(false).sort] }'
ruby 1.9.2dev (2010-04-02 trunk 27162) [i386-darwin9.8.0]
[A, []]
[Object, []]
[Kernel, [:Array, :Complex, :Float, :Integer, :Rational, :String, :__callee__, :__method__, :`, :abort, :at_exit, :autoload, :autoload?, :binding, :block_given?, :caller, :catch, :eval, :exec, :exit, :exit!, :fail, :fork, :format, :gets, :global_variables, :iterator?, :lambda, :load, :local_variables, :loop, :open, :p, :print, :printf, :proc, :putc, :puts, :raise, :rand, :readline, :readlines, :require, :require_relative, :select, :set_trace_func, :sleep, :spawn, :sprintf, :srand, :syscall, :system, :test, :throw, :trace_var, :trap, :untrace_var, :warn]]
[BasicObject, []]
</code></pre>
<p>RubySpecを修正していてこの変更に気がつきました。ChangeLogや差分やメーリングリストの過去ログやRedMineを見たもののどの部分でどのような意図でこの変更がなされたのか分からなかったため、ここで質問させてください。</p>
<p>これが意図しない変更であった場合、自クラスとその全ての親クラスのpublic_methodsやsingleton_methodsに挙げられていないにも関わらずパブリックに呼び出せるメソッドがあるのは、ちょっと不思議な挙動のように感じます。<br>
=end</p> Ruby master - Bug #2516 (Rejected): IO#reopen Compatibility (original: [ruby-dev:39479])https://redmine.ruby-lang.org/issues/25162009-12-23T05:30:13Zujihisa (Tatsuhiro Ujihisa)
<p>=begin<br>
takkanmさんとなかださんの<a href="https://blade.ruby-lang.org/ruby-dev/39479">[ruby-dev:39479]</a>のスレッドによると、IO#reopenのnilの問題は解決したものの、いつのまにか挙動が変更されていたとのことです。<br>
この変更は意図的なものなのか意図していないものなのかどちらなのでしょう。</p>
<pre><code> % cat test.rb
f1 = File.open "file1.txt"
f2 = File.open "file2.txt"
f1.reopen f2
puts f1.gets
puts f1.gets
puts(f1.reopen(f2).gets)
% ruby -v
ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-darwin9]
% ruby test.rb
Line 1
Line 2
Line 1
% ruby -v
ruby 1.9.2dev (2009-10-17 trunk 25387) [i386-darwin9.8.0]
% ruby test.rb
Line 1
Line 2
Line 3
</code></pre>
<p>このissueは <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: IO#reopen Doesn't Fully Associate with Given Stream on 1.9; Ignores pos on 1.8 (Closed)" href="https://redmine.ruby-lang.org/issues/1755">#1755</a> にも関連しています。<br>
<a href="http://redmine.ruby-lang.org/issues/show/1755" class="external">http://redmine.ruby-lang.org/issues/show/1755</a></p>
<p>意図したものならば、この変更をRubySpecにも反映させます。</p>
<a name="個人的には現状の挙動が嬉しいです"></a>
<h1 >個人的には現状の挙動が嬉しいです。<a href="#個人的には現状の挙動が嬉しいです" class="wiki-anchor">¶</a></h1>
<p>=end</p> Ruby 1.8 - Bug #2474 (Closed): The __FILE__ constant equals a relative path when required using a...https://redmine.ruby-lang.org/issues/24742009-12-12T13:11:13Zujihisa (Tatsuhiro Ujihisa)
<p>=begin<br>
Ruby 1.8.7と1.8.8devで、requireされたファイルの__FILE__が異なる値を持ちます。</p>
<p>$ cat a.rb [19:50:07]<br>
p <strong>FILE</strong><br>
require <strong>FILE</strong><br>
$ ruby187 -v a.rb [20:00:31]<br>
ruby 1.8.7 (2009-07-30 patchlevel 192) [i686-darwin9.7.0]<br>
"a.rb"<br>
"./a.rb"<br>
"./a.rb"<br>
$ ruby188 -v a.rb [20:00:37]<br>
ruby 1.8.8dev (2009-12-07 revision 26034) [i386-darwin9.8.0]<br>
"a.rb"<br>
"/Users/ujihisa/a.rb"<br>
"/Users/ujihisa/a.rb"</p>
<p>ChangeLogを見ましたが、いつこの変更が行なわれたのか分かりませんでした。</p>
<p>この変更により、ruby 1.8.8devはspec/rubyspec/language/file_spec.rbに通りません。<br>
もしもこの変更が意図的ならものでしたら、RubySpec側を変更します。<br>
=end</p> Ruby master - Bug #2469 (Closed): Difference behavior of IO#read_nonblock and #read between 1.8 a...https://redmine.ruby-lang.org/issues/24692009-12-10T07:18:47Zujihisa (Tatsuhiro Ujihisa)
<p>=begin<br>
The following code doesn't finish on ruby 1.9 (both 1.9.1 and 1.9.2dev), while finishes with Errno::EAGAIN on ruby 1.8.7.</p>
<p>read, write = IO.pipe<br>
write << 'hello'<br>
read.read_nonblock(5)<br>
read.read(5)</p>
<p>I checked it on i386-darwin9.8.0 and i686-linux.<br>
(This code is extracted from spec/rubyspec/core/io/read_nonblock_spec.rb)<br>
=end</p> Ruby master - Bug #2427 (Closed): possible bug in Method#source_location (from [ruby-core:27014])https://redmine.ruby-lang.org/issues/24272009-12-04T09:53:36Zujihisa (Tatsuhiro Ujihisa)
<p>=begin<br>
Originally reported by Roger Pack:</p>
<blockquote>
<p>It appears that Method#source_location returns different values for<br>
1.9.1 and 1.9.2dev for this code:</p>
<p>class A</p>
<p>def go( a=3,<br>
b=3)<br>
end<br>
end<br>
puts A.instance_method(:go).source_location</p>
<p>1.9.1 says line 3, 1.9.2 says line 4.</p>
<p>I assume 1.9.1 is correct? (I would expect it to be the line it<br>
<em>starts</em> on, and if you take out the default values, both 1.9.1 and<br>
1.9.2 says line 3).<br>
Thanks.<br>
-r</p>
</blockquote>
<p>According to Luis Lavena's report,</p>
<blockquote>
<p>a.rb, ending either with LF or CRLF:</p>
<p>C:\Users\Luis\Desktop>pik tags yarv ruby a.rb<br>
ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-mingw32]</p>
<p>a.rb<br>
3</p>
<p>ruby 1.9.2dev (2009-11-11 trunk 25717) [i386-mingw32]</p>
<p>a.rb<br>
4</p>
</blockquote>
<p>But I couldn't reproduce the issue on Mac OS X. Both LF and CRLF scripts said the same results.</p>
<blockquote>
<p>In my environment, both versions of ruby said same results.</p>
<p>$ ruby191 -v a.rb<br>
ruby 1.9.1p281 (2009-08-09 revision 24476) [i386-darwin9.7.0]<br>
a.rb<br>
4</p>
<p>$ ruby192 -v a.rb<br>
ruby 1.9.2dev (2009-12-04 trunk 25986) [i386-darwin9.8.0]<br>
a.rb<br>
4<br>
=end</p>
</blockquote> Backport191 - Backport #2120 (Closed): Kernel.eval("local_variables", binding) in for SEGV in 1.9.1https://redmine.ruby-lang.org/issues/21202009-09-19T08:07:18Zujihisa (Tatsuhiro Ujihisa)
<p>=begin<br>
Howard Yeh showed that the following code causes SEGV in <a href="https://blade.ruby-lang.org/ruby-core/25634">[ruby-core:25634]</a> in ruby 1.9.1 (not in 1.9.2dev):</p>
<p>for i in 1..100<br>
a = 1<br>
p Kernel.eval("local_variables",binding)<br>
break<br>
end</p>
<p>The minimum bug reproduction code is</p>
<p>for i in [1]<br>
p eval('local_variables', binding)<br>
end</p>
<p>The attached patch solves this problem.<br>
=end</p> Ruby master - Bug #1876 (Closed): r24383 Build Errorhttps://redmine.ruby-lang.org/issues/18762009-08-04T11:54:50Zujihisa (Tatsuhiro Ujihisa)
<p>=begin<br>
r24383の変更で、ビルドできなくなったのでそのパッチです。<br>
=end</p> Ruby master - Bug #1582 (Closed): IO.new Raises Other Errors between 1.8 and 1.9https://redmine.ruby-lang.org/issues/15822009-06-06T06:05:12Zujihisa (Tatsuhiro Ujihisa)
<p>=begin<br>
IO.newで引数に与えたファイル記述子のファイルモードと互換性のないファイルモードを与えたとき、ruby 1.8系ではErrno::EINVALを投げるのに対し、ruby 1.9系では例外を投げず、実際に互換性のない行為を実行したときにErrno::EBADFを投げます。</p>
<pre><code> io = File.open('aaa.txt', 'w')
io2 = IO.new(io.fileno, 'r') # 1.8ではこの時点でErrno::EINVAL
io.syswrite '111'
puts io2.read # 1.9ではこの時点でErrno::EBADF
</code></pre>
<p>私にはruby 1.8系の挙動の方が心優しい気がするのですが、どうでしょう。添付のパッチを適用すると、1.9でもIO.newの時点でErrno::EINVALを投げるようになります。<br>
=end</p> Ruby master - Bug #1537 (Closed): The Feature of Hash#to_s was Changedhttps://redmine.ruby-lang.org/issues/15372009-05-29T17:00:52Zujihisa (Tatsuhiro Ujihisa)
<p>=begin<br>
r23604で、Hash#to_sの仕様が以下のように変わりましたが、これは意図的なものですか?</p>
<p>[before] Hashの各keyとvalueをinspectしたものを{}内にまとめる<br>
{'' => ''}.to_s #=> '{""=>""}'</p>
<p>[after] Hashの各keyとvalueをto_sしたものを{}内にまとめる<br>
{'' => ''}.to_s #=> '{=>}'</p>
<a name="r23604のhashcへの修正を参考にr23324での若干の低速化を改善しようとarraycを修正しようとする過程で上記変更点に気づきました"></a>
<h1 >r23604のhash.cへの修正を参考にr23324での若干の低速化を改善しようとarray.cを修正しようとする過程で上記変更点に気づきました。<a href="#r23604のhashcへの修正を参考にr23324での若干の低速化を改善しようとarraycを修正しようとする過程で上記変更点に気づきました" class="wiki-anchor">¶</a></h1>
<p>参考: <a href="http://redmine.ruby-lang.org/issues/show/1533" class="external">http://redmine.ruby-lang.org/issues/show/1533</a><br>
=end</p> Ruby master - Bug #1534 (Closed): Inconsistency Between Struct#to_s and Struct#inspecthttps://redmine.ruby-lang.org/issues/15342009-05-29T07:33:39Zujihisa (Tatsuhiro Ujihisa)
<p>=begin<br>
<a href="http://redmine.ruby-lang.org/issues/show/1427" class="external">http://redmine.ruby-lang.org/issues/show/1427</a><br>
<a href="http://redmine.ruby-lang.org/issues/show/1533" class="external">http://redmine.ruby-lang.org/issues/show/1533</a><br>
の二つと同じ問題をStructで発見しました。<br>
ruby 1.9では通常Struct#to_sとStruct#inspectは同じ文字列を返しますが、自己再帰する構造体に対しては異なる結果を返しています。</p>
<pre><code> # ruby 1.9.2dev (2009-05-28 trunk 23601) [i386-darwin9.7.0]
t = Struct.new('A', :a).new(nil)
t.a = t
puts t.to_s
#=> <struct Struct::A a=#<struct Struct::A a=#<struct Struct::A:...>>>
puts t.inspect
#=> <struct Struct::A a=#<struct Struct::A:...>>
</code></pre>
<p>添付のパッチでto_sの結果がinspectと同じになります。</p>
<p>なお、似たような実装をしているものがないかgrepしたところ, proc.c, time.c, ext/dl/cfunc.cが該当しました。が、これらは自己再帰的構造を持ち得ないため大丈夫と思います。<br>
=end</p> Ruby master - Bug #1427 (Closed): Difference between Array#to_s and Array#inspecthttps://redmine.ruby-lang.org/issues/14272009-05-01T23:48:09Zujihisa (Tatsuhiro Ujihisa)
<p>=begin<br>
ruby 1.9では通常Array#to_sとArray#inspectは同じ文字列を返しますが、自己再帰する配列に対しては異なる結果を返しています。</p>
<a name="ruby-192dev-2009-04-30-trunk-23312-i386-darwin960"></a>
<h1 >ruby 1.9.2dev (2009-04-30 trunk 23312) [i386-darwin9.6.0]<a href="#ruby-192dev-2009-04-30-trunk-23312-i386-darwin960" class="wiki-anchor">¶</a></h1>
<p>a = [1]<br>
a << a<br>
a.inspect #=> [1, [...]]<br>
a.to_s #=>[1, [1, [...]]]</p>
<p>rb_exec_recursiveのrecursive_checkで、Array#inspectはinspect -> inspectと処理が進んで再帰を判定しますが、Array#to_sはto_s -> inspect -> inspectと処理が進んで判定するため、後者の方が一回多くrb_ary_inspectを呼び出しています。</p>
<p>to_sをinspectのaliasにするパッチを添付します。<br>
=end</p> Ruby master - Feature #1422 (Rejected): Unused function rb_ary_to_shttps://redmine.ruby-lang.org/issues/14222009-04-30T10:28:54Zujihisa (Tatsuhiro Ujihisa)
<p>=begin<br>
ujihisaといいます。</p>
<p>Array#to_sがArray#inspectのaliasになったため、rb_ary_to_sがruby処理系内のどこからも呼ばれていません。<br>
<a href="http://redmine.ruby-lang.org/repositories/revision/1?rev=10879" class="external">http://redmine.ruby-lang.org/repositories/revision/1?rev=10879</a></p>
<p>RubyレベルでArray#to_sとArray#inspectを両方用意しておくのはよいとして、拡張ライブラリのためrb_ary_inspectとrb_ary_to_sの両方を用意しておく必要はないのではないかと思うのですが、どうでしょうか。対称性のためCレベルでも全てのクラスにto_sとinspectを用意しておく必要があるならば、このメールは無視してください。また、この変更で既存のライブラリがどの程度動かなくなるかも分かりません。</p>
<p>rb_ary_to_sを削除するパッチを添付します。<br>
=end</p> Ruby master - Bug #1378 (Closed): Dir.glob should not convert entries on UNIXhttps://redmine.ruby-lang.org/issues/13782009-04-14T16:23:41Zujihisa (Tatsuhiro Ujihisa)
<p>=begin<br>
ujihisaといいます。</p>
<p>r23171 から、bracketを含むDir.globがうまく動いていませんでした。<br>
$ ./ruby -e "p Dir.glob('/[ae]tc/')"<br>
[]</p>
<p>以下はパッチです。これを当てると、 mspec ./spec/rubyspec/core/dir/glob_spec.rb に通るようになります。</p>
<p>diff --git a/dir.c b/dir.c<br>
index 14b4872..dab55f7 100644<br>
--- a/dir.c<br>
+++ b/dir.c<br>
@@ -136,9 +136,12 @@ bracket(<br>
else {<br>
if (ok) continue;<br>
if (r <= (send-s) && memcmp(p, s, r) == 0) continue;</p>
<ul>
<li>
<pre><code> if (!nocase) continue;
</code></pre>
</li>
<li>
<pre><code> c1 = rb_enc_toupper(rb_enc_codepoint(s, send, enc), enc);
</code></pre>
</li>
<li>
<pre><code> c2 = rb_enc_toupper(rb_enc_codepoint(p, pend, enc), enc);
</code></pre>
</li>
</ul>
<ul>
<li>
<pre><code> c1 = rb_enc_codepoint(t1, t1 + strlen(t1), enc);
</code></pre>
</li>
<li>
<pre><code> c2 = rb_enc_codepoint(s, send, enc);
</code></pre>
</li>
<li>
<pre><code> if (nocase) {
</code></pre>
</li>
<li>
<pre><code> c1 = rb_enc_toupper(c1, enc);
</code></pre>
</li>
<li>
<pre><code> c2 = rb_enc_toupper(c2, enc);
</code></pre>
</li>
<li>
<pre><code> }
if (c1 != c2) continue;
</code></pre>
}<br>
ok = 1;<br>
=end</li>
</ul>