Forum: Ruby-dev [ruby-trunk - Bug #7572][Open] クラス定義においてスーパークラスとしてクラスでないものを指定してもエラーにならない事がある

Posted by tadf (tadayoshi funaba) (Guest)
on 2012-12-16 10:58
(Received via mailing list)
Issue #7572 has been reported by tadf (tadayoshi funaba).

----------------------------------------
Bug #7572: クラス定義においてスーパークラスとしてクラスでないものを指定してもエラーにならない事がある
https://bugs.ruby-lang.org/issues/7572

Author: tadf (tadayoshi funaba)
Status: Open
Priority: Low
Assignee:
Category: core
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]


クラス定義においてスーパークラスとしてクラスでないものを指定してもエラーにならない事がある。

$ ruby -v -e 'class Foo < nil; end'
ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]

$ ruby -v -e 'class Foo < false; end'
ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]

$ ruby -v -e 'class Foo < true; end'
ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]
-e:1:in `<main>': wrong argument type true (expected Class) (TypeError)
Posted by shugo (Shugo Maeda) (Guest)
on 2012-12-17 15:01
(Received via mailing list)
Issue #7572 has been updated by shugo (Shugo Maeda).

File defineclass_fix.diff added
Status changed from Open to Assigned
Assignee set to ko1 (Koichi Sasada)

前田です。

tadf (tadayoshi funaba) wrote:
> クラス定義においてスーパークラスとしてクラスでないものを指定してもエラーにならない事がある。
>
> $ ruby -v -e 'class Foo < nil; end'
> ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]

以下のように、コンパイルすると'class Foo; end'と'class Foo < nil; end'が同じ命令列に
なってしまうためのようです。

$ cat defineclass.rb
ary = RubyVM::InstructionSequence.compile(<<EOF).disasm
class Foo; end
class Foo < nil; end
EOF
print ary
$ ruby defineclass.rb
== disasm: <RubyVM::InstructionSequence:<compiled>@<compiled>>==========
0000 trace            1                                               ( 
1)
0002 putspecialobject 3
0004 putnil
0005 defineclass      :Foo, <class:Foo>, 3
0009 pop
0010 trace            1                                               ( 
2)
0012 putspecialobject 3
0014 putnil
0015 defineclass      :Foo, <class:Foo>, 3
0019 leave
...

define_typeにスーパークラスを指定したかどうかを表すフラグを追加したパッチを添付します。
フラグの渡し方とかマジックナンバーでいいのかとか色々気になりますが、どうするのがよいでしょう? > ささださん

スーパークラスが指定されなかった場合はnilでなくQundefをputobjectしたらどうかとも
思ったのですが、r12621を見るとQundefはVMスタックに置かない方針なのですよね?
----------------------------------------
Bug #7572: クラス定義においてスーパークラスとしてクラスでないものを指定してもエラーにならない事がある
https://bugs.ruby-lang.org/issues/7572#change-34800

Author: tadf (tadayoshi funaba)
Status: Assigned
Priority: Low
Assignee: ko1 (Koichi Sasada)
Category: core
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]


クラス定義においてスーパークラスとしてクラスでないものを指定してもエラーにならない事がある。

$ ruby -v -e 'class Foo < nil; end'
ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]

$ ruby -v -e 'class Foo < false; end'
ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]

$ ruby -v -e 'class Foo < true; end'
ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]
-e:1:in `<main>': wrong argument type true (expected Class) (TypeError)
Posted by ko1 (Koichi Sasada) (Guest)
on 2012-12-19 23:48
(Received via mailing list)
Issue #7572 has been updated by ko1 (Koichi Sasada).


方針はその方向で,少し整理するといいでしょうか.

>スーパークラスが指定されなかった場合はnilでなくQundefをputobjectしたらどうかとも 
思ったのですが、r12621を見るとQundefはVMスタックに置かない方針なのですよね?

はい,GC で mark 出来るものしか置けないようにしています.
(GC の時,ちょっとは速度的に楽になるかな,という配慮です)
----------------------------------------
Bug #7572: クラス定義においてスーパークラスとしてクラスでないものを指定してもエラーにならない事がある
https://bugs.ruby-lang.org/issues/7572#change-34875

Author: tadf (tadayoshi funaba)
Status: Assigned
Priority: Low
Assignee: ko1 (Koichi Sasada)
Category: core
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]


クラス定義においてスーパークラスとしてクラスでないものを指定してもエラーにならない事がある。

$ ruby -v -e 'class Foo < nil; end'
ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]

$ ruby -v -e 'class Foo < false; end'
ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]

$ ruby -v -e 'class Foo < true; end'
ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]
-e:1:in `<main>': wrong argument type true (expected Class) (TypeError)
Posted by shugo (Shugo Maeda) (Guest)
on 2012-12-20 06:28
(Received via mailing list)
Issue #7572 has been updated by shugo (Shugo Maeda).

File defineclass_fix_1220.diff added

前田です。

ko1 (Koichi Sasada) wrote:
> 方針はその方向で,少し整理するといいでしょうか.

今のdefine_typeの値の付け方にとくに意味がないのであれば、scopedかどうか(class Foo::Barのような形か)も
フラグにしてしまった方がすっきりする気がします。

例えば、以下のようにしてはどうでしょうか。

  下位3ビット    -> 定義のタイプ (0 = クラス, 1 = 特異クラス, 2 = モジュール, 3以上は予約)
  下から4ビット目 -> scopedなら1、そうでなければ0
  下から5ビット目 -> スーパークラスが指定されていれば1、そうでなければ0

具体的には以下のような定義を考えています。

  typedef enum {
      VM_DEFINE_TYPE_CLASS           = 0x00,
      VM_DEFINE_TYPE_SINGLETON_CLASS = 0x01,
      VM_DEFINE_TYPE_MODULE          = 0x02,
      /* 0x03..0x06 is reserved */
      VM_DEFINE_TYPE_MASK            = 0x07,
  } rb_vm_define_type_t;

  #define VM_DEFINE_FLAG_SCOPED         0x08
  #define VM_DEFINE_FLAG_HAS_SUPERCLASS 0x10

その方針で作成したパッチを添付します。
i686-linux (Ubuntu 12.04)上でmake checkが通ることは確認しています。

----------------------------------------
Bug #7572: クラス定義においてスーパークラスとしてクラスでないものを指定してもエラーにならない事がある
https://bugs.ruby-lang.org/issues/7572#change-34885

Author: tadf (tadayoshi funaba)
Status: Assigned
Priority: Low
Assignee: ko1 (Koichi Sasada)
Category: core
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]


クラス定義においてスーパークラスとしてクラスでないものを指定してもエラーにならない事がある。

$ ruby -v -e 'class Foo < nil; end'
ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]

$ ruby -v -e 'class Foo < false; end'
ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]

$ ruby -v -e 'class Foo < true; end'
ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]
-e:1:in `<main>': wrong argument type true (expected Class) (TypeError)
Posted by SASADA Koichi (Guest)
on 2012-12-20 08:19
(Received via mailing list)
(2012/12/20 14:27), shugo (Shugo Maeda) wrote:
>
>
> その方針で作成したパッチを添付します。
> i686-linux (Ubuntu 12.04)上でmake checkが通ることは確認しています。

 どうもありがとうございます.1点だけ,define_type を defineclass_type
にして頂ければ.

 コミット頂いてもいいでしょうか.
Posted by shugo (Shugo Maeda) (Guest)
on 2012-12-20 09:16
(Received via mailing list)
Issue #7572 has been updated by shugo (Shugo Maeda).


前田です。

ko1 (Koichi Sasada) wrote:
>   どうもありがとうございます.1点だけ,define_type を defineclass_type
>  にして頂ければ.
>
>   コミット頂いてもいいでしょうか.

そのように修正してcommitしました。

----------------------------------------
Bug #7572: クラス定義においてスーパークラスとしてクラスでないものを指定してもエラーにならない事がある
https://bugs.ruby-lang.org/issues/7572#change-34899

Author: tadf (tadayoshi funaba)
Status: Closed
Priority: Low
Assignee: ko1 (Koichi Sasada)
Category: core
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]


クラス定義においてスーパークラスとしてクラスでないものを指定してもエラーにならない事がある。

$ ruby -v -e 'class Foo < nil; end'
ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]

$ ruby -v -e 'class Foo < false; end'
ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]

$ ruby -v -e 'class Foo < true; end'
ruby 2.0.0dev (2012-12-16 trunk 38415) [i686-linux]
-e:1:in `<main>': wrong argument type true (expected Class) (TypeError)
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.