From: Tanaka Akira Date: 2007-09-20T23:34:33+09:00 Subject: [ruby-dev:31804] TYPE(cl) in rb_obj_is_kind_of rb_obj_is_kind_of 中で TYPE(cl) が T_CLASS や T_ICLASS でな いことは正常なのでしょうか? つまり、以下の表明は間違っているでしょうか? Index: object.c =================================================================== --- object.c (revision 13472) +++ object.c (working copy) @@ -11,6 +11,7 @@ Copyright (C) 2000 Information-technology Promotion Agency, Japan **********************************************************************/ +#include #include "ruby/ruby.h" #include "ruby/st.h" @@ -390,6 +391,7 @@ rb_obj_is_kind_of(VALUE obj, VALUE c) { VALUE cl = CLASS_OF(obj); + assert(TYPE(cl) == T_CLASS || TYPE(cl) == T_ICLASS); switch (TYPE(c)) { case T_MODULE: この表明をつけると、test/runner.rb が以下のように失敗します。 % ./ruby test/runner.rb ruby: object.c:394: rb_obj_is_kind_of: Assertion `rb_type((VALUE)(cl)) == RUBY_T_CLASS || rb_type((VALUE)(cl)) == RUBY_T_ICLASS' failed. 以下のようにすれば、小さなスクリプトで再現させることができま す。 % ls -l empty.rb z.rb -rw-r--r-- 1 akr akr 0 Sep 20 23:29 empty.rb -rw-r--r-- 1 akr akr 81 Sep 20 23:29 z.rb % cat z.rb eval("require 'empty'", TOPLEVEL_BINDING) ObjectSpace.each_object(Class) {|x| } % ./ruby z.rb ruby: object.c:394: rb_obj_is_kind_of: Assertion `rb_type((VALUE)(cl)) == RUBY_T_CLASS || rb_type((VALUE)(cl)) == RUBY_T_ICLASS' failed. -- Tanaka Akira