[ruby-dev:40162] [Bug #2658] rubyspec: Ruby character strings interpolates the return value of Object#inspect, without ivars, if Object#to_s does not return a String instance ERROR

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
8 messages Options
Reply | Threaded
Open this post in threaded view
|

[ruby-dev:40162] [Bug #2658] rubyspec: Ruby character strings interpolates the return value of Object#inspect, without ivars, if Object#to_s does not return a String instance ERROR

Dennis Ranke-2
Bug #2658: rubyspec: Ruby character strings interpolates the return value of Object#inspect, without ivars, if Object#to_s does not return a String instance ERROR
http://redmine.ruby-lang.org/issues/show/2658

起票者: Yusuke Endoh
ステータス: Open, 優先度: Normal
担当者: Yukihiro Matsumoto, カテゴリ: core, Target version: 1.9.2
ruby -v: ruby 1.9.2dev (2010-01-26 trunk 26425) [i686-linux]

まつもとさん
遠藤です。

rubyspec の以下のエラーを調べてみました。


9)
Ruby character strings interpolates the return value of Object#inspect, without ivars, if Object#to_s does not return a String instance ERROR
ArgumentError: wrong number of arguments(2 for 1)
/home/mame/work/ruby/spec/rubyspec/language/string_spec.rb:158:in `[]'
/home/mame/work/ruby/spec/rubyspec/language/string_spec.rb:158:in `block (2 levels) in <top (required)>'
/home/mame/work/ruby/spec/rubyspec/language/string_spec.rb:5:in `<top (required)>'


r25428 が原因です。このコミットでは、

- rdoc の文章が壊れています。

- rdoc によると、「to_s が override されて *いない* ときは to_s を使う」
  という仕様だと思いますが、現在は to_s が override されて *いる* ときに
  to_s を使うようになっていると思います。


  $ ./ruby -ve '
  class C
    def to_s; "overridden"; end
  end
  p C.new
  '
  ruby 1.9.2dev (2010-01-26 trunk 26425) [i686-linux]
  overridden


ということで、以下のパッチをコミットをしてもいいでしょうか。
このパッチによって上記の rubyspec のエラーが消えることを確認しています。


diff --git a/object.c b/object.c
index 73e5bd1..441f226 100644
--- a/object.c
+++ b/object.c
@@ -367,8 +367,6 @@ inspect_obj(VALUE obj, VALUE str, int recur)
  *     obj.inspect   => string
  *
  *  Returns a string containing a human-readable representation of
- *  <i>obj</i>. If not overridden and no instance variables, uses the
- *  <code>to_s</code> method to generate the string.
  *  <i>obj</i>.  If not overridden, uses the <code>to_s</code> method to
  *  generate the string.
  *
@@ -381,7 +379,7 @@ extern int rb_obj_basic_to_s_p(VALUE);
 static VALUE
 rb_obj_inspect(VALUE obj)
 {
-    if (TYPE(obj) == T_OBJECT && rb_obj_basic_to_s_p(obj)) {
+    if (TYPE(obj) == T_OBJECT && !rb_obj_basic_to_s_p(obj)) {
         int has_ivar = 0;
         VALUE *ptr = ROBJECT_IVPTR(obj);
         long len = ROBJECT_NUMIV(obj);

--
Yusuke ENDOH <[hidden email]>


----------------------------------------
http://redmine.ruby-lang.org

Reply | Threaded
Open this post in threaded view
|

[ruby-dev:40163] Re: [Bug #2658] rubyspec: Ruby character strings interpolates the return value of Object#inspect, without ivars, if Object#to_s does not return a String instance ERROR

Tanaka Akira-3
2010年1月26日20:39 Yusuke Endoh <[hidden email]>:
>
> r25428 が原因です。このコミットでは、
>
> - rdoc の文章が壊れています。
>
> - rdoc によると、「to_s が override されて *いない* ときは to_s を使う」
>  という仕様だと思いますが、現在は to_s が override されて *いる* ときに
>  to_s を使うようになっていると思います。

override されてる to_s は各クラスに特化したわかりやすい to_s だろうから
inspect としてはそっちを使うっていう話なんじゃないですか。

それに、override されていないときに to_s を使うっていうなら、
メソッド呼び出しを通して dynamic binding にする意味はありませんよね。
--
[田中 哲][たなか あきら][Tanaka Akira]

Reply | Threaded
Open this post in threaded view
|

[ruby-dev:40164] Re: [Bug #2658] rubyspec: Ruby character strings interpolates the return value of Object#inspect, without ivars, if Object#to_s does not return a String instance ERROR

Yusuke ENDOH
2010年1月26日21:49 Tanaka Akira <[hidden email]>:

> 2010年1月26日20:39 Yusuke Endoh <[hidden email]>:
>>
>> r25428 が原因です。このコミットでは、
>>
>> - rdoc の文章が壊れています。
>>
>> - rdoc によると、「to_s が override されて *いない* ときは to_s を使う」
>>  という仕様だと思いますが、現在は to_s が override されて *いる* ときに
>>  to_s を使うようになっていると思います。
>
> override されてる to_s は各クラスに特化したわかりやすい to_s だろうから
> inspect としてはそっちを使うっていう話なんじゃないですか。
>
> それに、override されていないときに to_s を使うっていうなら、
> メソッド呼び出しを通して dynamic binding にする意味はありませんよね。


確かに。そういうことなら、rdoc の間違いですかね。


diff --git a/object.c b/object.c
index 73e5bd1..ab00efd 100644
--- a/object.c
+++ b/object.c
@@ -367,10 +367,8 @@ inspect_obj(VALUE obj, VALUE str, int recur)
  *     obj.inspect   => string
  *
  *  Returns a string containing a human-readable representation of
- *  <i>obj</i>. If not overridden and no instance variables, uses the
+ *  <i>obj</i>.  If <code>to_s<\code> is overridden, uses the
  *  <code>to_s</code> method to generate the string.
- *  <i>obj</i>.  If not overridden, uses the <code>to_s</code> method to
- *  generate the string.
  *
  *     [ 1, 2, 3..4, 'five' ].inspect   #=> "[1, 2, 3..4, \"five\"]"
  *     Time.new.inspect                 #=> "2008-03-08 19:43:39 +0900"


挙動は現状のままにするとして、

1. この挙動は 1.9.2 からの仕様変更 (1.9.1 はそのまま)
2. この挙動は 1.9 からの仕様変更 (1.9.1 にもバックポートする)
3. この挙動は 1.8/1.9 の仕様 (1.8.x にもバックポートする)

のどれとすべきでしょうか。rubyspec の修正依頼の内容に影響します。


(1.8 の rb_obj_inspect の rdoc と挙動があってないので、1.8 にも
なんらかの修正が必要だと思います。)

--
Yusuke ENDOH <[hidden email]>

Reply | Threaded
Open this post in threaded view
|

[ruby-dev:40179] Re: [Bug #2658] rubyspec: Ruby character strings interpolates the return value of Object#inspect, without ivars, if Object#to_s does not return a String instance ERROR

Yukihiro Matsumoto
まつもと ゆきひろです

In message "Re: [ruby-dev:40164] Re: [Bug #2658] rubyspec: Ruby character strings interpolates the return value of Object#inspect, without ivars, if Object#to_s does not return a String instance ERROR"
    on Tue, 26 Jan 2010 22:41:55 +0900, Yusuke ENDOH <[hidden email]> writes:

|> override されてる to_s は各クラスに特化したわかりやすい to_s だろうから
|> inspect としてはそっちを使うっていう話なんじゃないですか。

|確かに。そういうことなら、rdoc の間違いですかね。

あー、そういうことか。間違ってるのはRDocの方ですね。

|挙動は現状のままにするとして、
|
|1. この挙動は 1.9.2 からの仕様変更 (1.9.1 はそのまま)
|2. この挙動は 1.9 からの仕様変更 (1.9.1 にもバックポートする)
|3. この挙動は 1.8/1.9 の仕様 (1.8.x にもバックポートする)
|
|のどれとすべきでしょうか。rubyspec の修正依頼の内容に影響します。

1または2でしょうね。どちらにするかはYuguiさんにお任せします。

Reply | Threaded
Open this post in threaded view
|

[ruby-dev:40252] Re: [Bug #2658] rubyspec: Ruby character strings interpolates the return value of Object#inspect, without ivars, if Object#to_s does not return a String instance ERROR

Yugui (Yuki Sonoda)
On 1/27/10 6:29 PM, Yukihiro Matsumoto wrote:
> |挙動は現状のままにするとして、
> |
> |1. この挙動は 1.9.2 からの仕様変更 (1.9.1 はそのまま)
> |2. この挙動は 1.9 からの仕様変更 (1.9.1 にもバックポートする)
> |3. この挙動は 1.8/1.9 の仕様 (1.8.x にもバックポートする)
> |
> |のどれとすべきでしょうか。rubyspec の修正依頼の内容に影響します。
>
> 1または2でしょうね。どちらにするかはYuguiさんにお任せします。

1にします。そしてrubyspecを添付のpatchのように変更することを提案します。
理由としては
* 1.8や1.9.1の挙動を今更意味なく変えるのは反対です。
* 1.9.2のポリシーは、それはそれで肯けるので、ならば挙動は維持してrdocを
合わせましょう。
* inspectが何を表示するかは実装依存であるべきです。rb_any_to_s、つまり
  デフォルトのto_sとも独立であるべきです。
  * 当該のspecはrb_any_to_sとinspectを混同しています。

--
Yugui <[hidden email]>
http://yugui.jp
私は私をDumpする

From f86b412e1a52e2cd469abee2e8bad1a7627befe8 Mon Sep 17 00:00:00 2001
From: Yuki Sonoda (Yugui) <[hidden email]>
Date: Sat, 30 Jan 2010 12:34:02 +0900
Subject: [PATCH] The spec for interporation when Object#to_s did not return a String
 was confusing the default representation of an arbitrary object and
 Object#inspect.

---
 language/string_spec.rb |    7 ++++---
 1 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/language/string_spec.rb b/language/string_spec.rb
index c168e53..5a469ce 100644
--- a/language/string_spec.rb
+++ b/language/string_spec.rb
@@ -150,12 +150,13 @@ HERE
     "#{obj}".should == '42'
   end
 
-  it "interpolates the return value of Object#inspect, without ivars, if Object#to_s does not return a String instance" do
+  it "interpolates an implementation depended representation of an object if the object does not return a String for #to_s and the representation of the object is not empty" do
     obj = mock('to_s')
     obj.stub!(:to_s).and_return(42)
-    s = "#{obj}"[0..-2]
 
-    s.should == obj.inspect[0, s.size]
+    s = nil
+    lambda { s = "#{obj}" }.should_not raise_error
+    s.should_not be_empty
   end
 
   ruby_version_is '1.9' do
--
1.6.3.1

Reply | Threaded
Open this post in threaded view
|

[ruby-dev:40260] Re: [Bug #2658] rubyspec: Ruby character strings interpolates the return value of Object#inspect, without ivars, if Object#to_s does not return a String instance ERROR

Yusuke ENDOH
遠藤です。

2010年1月30日13:52 Yugui (Yuki Sonoda) <[hidden email]>:

> On 1/27/10 6:29 PM, Yukihiro Matsumoto wrote:
>> |挙動は現状のままにするとして、
>> |
>> |1. この挙動は 1.9.2 からの仕様変更 (1.9.1 はそのまま)
>> |2. この挙動は 1.9 からの仕様変更 (1.9.1 にもバックポートする)
>> |3. この挙動は 1.8/1.9 の仕様 (1.8.x にもバックポートする)
>> |
>> |のどれとすべきでしょうか。rubyspec の修正依頼の内容に影響します。
>>
>> 1または2でしょうね。どちらにするかはYuguiさんにお任せします。
>
> 1にします。そしてrubyspecを添付のpatchのように変更することを提案します。

ありがとうございます。そして patch に賛成します。


> 理由としては
> * 1.8や1.9.1の挙動を今更意味なく変えるのは反対です。
> * 1.9.2のポリシーは、それはそれで肯けるので、ならば挙動は維持してrdocを
> 合わせましょう。

1.9.2 からの仕様変更というのに多少抵抗はありますが、了解です。


> * inspectが何を表示するかは実装依存であるべきです。rb_any_to_s、つまり
>  デフォルトのto_sとも独立であるべきです。
>  * 当該のspecはrb_any_to_sとinspectを混同しています。

混同というか、rdoc を無視して rb_obj_inspect の実装をまるごと spec に
したんでしょうね。
inspect はほかにもそこらじゅうで spec にされてしまっているので、いずれ
直さないと、と思います。


human-readable representation というのは機械判定できないけれど、

- ASCII-8BIT 以外のエンコーディングで、valid_encoding? が true になる

くらいは仕様にしてもいい気がする。

--
Yusuke ENDOH <[hidden email]>

Reply | Threaded
Open this post in threaded view
|

[ruby-dev:40368] Re: [Bug #2658] rubyspec: Ruby character strings interpolates the return value of Object#inspect, without ivars, if Object#to_s does not return a String instance ERROR

Yusuke ENDOH
Yugui さん
遠藤です。

2010年1月30日20:36 Yusuke ENDOH <[hidden email]>:

> 2010年1月30日13:52 Yugui (Yuki Sonoda) <[hidden email]>:
>> On 1/27/10 6:29 PM, Yukihiro Matsumoto wrote:
>>> |挙動は現状のままにするとして、
>>> |
>>> |1. この挙動は 1.9.2 からの仕様変更 (1.9.1 はそのまま)
>>> |2. この挙動は 1.9 からの仕様変更 (1.9.1 にもバックポートする)
>>> |3. この挙動は 1.8/1.9 の仕様 (1.8.x にもバックポートする)
>>> |
>>> |のどれとすべきでしょうか。rubyspec の修正依頼の内容に影響します。
>>>
>>> 1または2でしょうね。どちらにするかはYuguiさんにお任せします。
>>
>> 1にします。そしてrubyspecを添付のpatchのように変更することを提案します。
>
> ありがとうございます。そして patch に賛成します。


このパッチを commit + push していただけますか?
お忙しいようなら、許可さえもらえれば私がやってもいいです。

--
Yusuke ENDOH <[hidden email]>

Reply | Threaded
Open this post in threaded view
|

[ruby-dev:40401] Re: [Bug #2658] rubyspec: Ruby character strings interpolates the return value of Object#inspect, without ivars, if Object#to_s does not return a String instance ERROR

Yusuke ENDOH
遠藤です。

2010年2月9日21:42 Yusuke ENDOH <[hidden email]>:
> このパッチを commit + push していただけますか?
> お忙しいようなら、許可さえもらえれば私がやってもいいです。

IRC で許可していただいたので、コミットしました。

--
Yusuke ENDOH <[hidden email]>