きしもとです

> 内部的にはcrefと呼ばれている値だろうと思いますが、これをrubyレベ
> ルから直接知る方法はありません。

ヒントありがとうございました。とりあえずでっちあげてみました。

こんなスクリプトを、下のパッチを当てた ruby で実行すると、

$ cat foo.rb
foo = Object.new
foo.instance_eval {
        p cref
}

class Foo
        p cref
        def foo
                p cref
                class << self
                        p cref
                end
        end
end

foo = Foo.new
foo.foo

こうなります。

$ ruby19 foo.rb
#<Class:#<Object:0x000008011696e0>>
Foo
Foo
#<Class:#<Foo:0x00000801169528>>

求めていたものは得られました。おさわがせしました。

以下パッチ

diff --git a/object.c b/object.c
index f52522d..9d98f88 100644
--- a/object.c
+++ b/object.c
@@ -538,6 +538,15 @@ rb_obj_tap(VALUE obj)
 }
 
 
+VALUE rb_vm_cref_cls(void);
+
+VALUE
+rb_cref(VALUE obj)
+{
+    return rb_vm_cref_cls();
+}
+
+
 /*
  * Document-method: inherited
  *
@@ -2554,6 +2563,8 @@ Init_Object(void)
     rb_define_method(rb_mKernel, "is_a?", rb_obj_is_kind_of, 1);
     rb_define_method(rb_mKernel, "tap", rb_obj_tap, 0);
 
+    rb_define_method(rb_mKernel, "cref", rb_cref, 0);
+
     rb_define_global_function("sprintf", rb_f_sprintf, -1); /* in sprintf.c */
     rb_define_global_function("format", rb_f_sprintf, -1);  /* in sprintf.c */
 
diff --git a/vm.c b/vm.c
index dd5de1f..0327c49 100644
--- a/vm.c
+++ b/vm.c
@@ -822,6 +822,12 @@ rb_vm_cref(void)
     return vm_get_cref(cfp->iseq, cfp->lfp, cfp->dfp);
 }
 
+VALUE
+rb_vm_cref_cls(void)
+{
+    return rb_vm_cref()->nd_clss;
+}
+
 #if 0
 void
 debug_cref(NODE *cref)