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)
on 2012-12-16 10:58
on 2012-12-17 15:01
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)
on 2012-12-19 23:48
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)
on 2012-12-20 06:28
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)
on 2012-12-20 08:19
(2012/12/20 14:27), shugo (Shugo Maeda) wrote: > > > その方針で作成したパッチを添付します。 > i686-linux (Ubuntu 12.04)上でmake checkが通ることは確認しています。 どうもありがとうございます.1点だけ,define_type を defineclass_type にして頂ければ. コミット頂いてもいいでしょうか.
on 2012-12-20 09:16
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
Log in with Google account | Log in with Yahoo account
No account? Register here.