[ruby-dev:31804] TYPE(cl) in rb_obj_is_kind_of

From: Tanaka Akira <akr@...>
Date: 2007-09-20 14:34:33 UTC
List: ruby-dev #31804
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 <assert.h>
 
 #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

In This Thread

Prev Next