--mimepart_4cdb6810aa454_566d5bc22da238b
Content-Type: text/plain
Content-Transfer-Encoding: Quoted-printable
Content-Disposition: inline

Feature #4043: 違若薜urrent_classhttp://redmine.ruby-lang.org/issues/show/4043

起票者: Makoto Kishimoto
ステータス: Open, 優先度: Low
カテゴリ: core, Target version: 1.9.x

カレントクラス(MRIの内部でいうところのcref)をRubyから調べられるメソッドcurrent_classを提案します。
グローバル関数(Kernelのプライベートメソッド)にする理由は、self(ないしなんらかのオブジェクト)とは関係ない値を返すメソッドであるため、です。
ユースケースですが、例えば以下のようにして、モジュールのinstance_evalとmodule_evalの違いをRubyプログラマが確かめることができ、Rubyの理解に役立ちます。

$ irb19
irb(main):001:0> module M ; end
=> nil
irb(main):002:0> M.instance_eval { current_class }
=> #<Class:M>
irb(main):003:0> M.module_eval { current_class }
=> M

差分を付けますが、クイックハックですので修正が必要かと思います。

diff --git a/object.c b/object.c
index 75192c1..82ad85a 100644
--- a/object.c
+++ b/object.c
@@ -2408,6 +2408,13 @@ rb_f_array(VALUE obj, VALUE arg)
     return rb_Array(arg);
 }

+VALUE rb_vm_cref_cls(void);
+static VALUE
+rb_f_current_class(VALUE obj)
+{
+    return rb_vm_cref_cls();
+}
+
 /*
  *  Document-class: Class
  *
@@ -2588,6 +2595,8 @@ Init_Object(void)
     rb_define_global_function("String", rb_f_string, 1);
     rb_define_global_function("Array", rb_f_array, 1);

+    rb_define_global_function("current_class", rb_f_current_class, 0);
+
     rb_cNilClass = rb_define_class("NilClass", rb_cObject);
     rb_define_method(rb_cNilClass, "to_i", nil_to_i, 0);
     rb_define_method(rb_cNilClass, "to_f", nil_to_f, 0);
diff --git a/vm.c b/vm.c
index 980e7ea..dcc43df 100644
--- a/vm.c
+++ b/vm.c
@@ -819,6 +819,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)


----------------------------------------
http://redmine.ruby-lang.org

--mimepart_4cdb6810aa454_566d5bc22da238b
Content-Type: application/octet-stream; name=patch-cref
Content-Transfer-Encoding: Base64
Content-Disposition: attachment; filename=patch-cref

ZGlmZiAtLWdpdCBhL29iamVjdC5jIGIvb2JqZWN0LmMKaW5kZXggNzUxOTJj
MS4uODJhZDg1YSAxMDA2NDQKLS0tIGEvb2JqZWN0LmMKKysrIGIvb2JqZWN0
LmMKQEAgLTI0MDgsNiArMjQwOCwxMyBAQCByYl9mX2FycmF5KFZBTFVFIG9i
aiwgVkFMVUUgYXJnKQogICAgIHJldHVybiByYl9BcnJheShhcmcpOwogfQog
CitWQUxVRSByYl92bV9jcmVmX2Nscyh2b2lkKTsKK3N0YXRpYyBWQUxVRQor
cmJfZl9jdXJyZW50X2NsYXNzKFZBTFVFIG9iaikKK3sKKyAgICByZXR1cm4g
cmJfdm1fY3JlZl9jbHMoKTsKK30KKwogLyoKICAqICBEb2N1bWVudC1jbGFz
czogQ2xhc3MKICAqCkBAIC0yNTg4LDYgKzI1OTUsOCBAQCBJbml0X09iamVj
dCh2b2lkKQogICAgIHJiX2RlZmluZV9nbG9iYWxfZnVuY3Rpb24oIlN0cmlu
ZyIsIHJiX2Zfc3RyaW5nLCAxKTsKICAgICByYl9kZWZpbmVfZ2xvYmFsX2Z1
bmN0aW9uKCJBcnJheSIsIHJiX2ZfYXJyYXksIDEpOwogCisgICAgcmJfZGVm
aW5lX2dsb2JhbF9mdW5jdGlvbigiY3VycmVudF9jbGFzcyIsIHJiX2ZfY3Vy
cmVudF9jbGFzcywgMCk7CisKICAgICByYl9jTmlsQ2xhc3MgPSByYl9kZWZp
bmVfY2xhc3MoIk5pbENsYXNzIiwgcmJfY09iamVjdCk7CiAgICAgcmJfZGVm
aW5lX21ldGhvZChyYl9jTmlsQ2xhc3MsICJ0b19pIiwgbmlsX3RvX2ksIDAp
OwogICAgIHJiX2RlZmluZV9tZXRob2QocmJfY05pbENsYXNzLCAidG9fZiIs
IG5pbF90b19mLCAwKTsKZGlmZiAtLWdpdCBhL3ZtLmMgYi92bS5jCmluZGV4
IDk4MGU3ZWEuLmRjYzQzZGYgMTAwNjQ0Ci0tLSBhL3ZtLmMKKysrIGIvdm0u
YwpAQCAtODE5LDYgKzgxOSwxMiBAQCByYl92bV9jcmVmKHZvaWQpCiAgICAg
cmV0dXJuIHZtX2dldF9jcmVmKGNmcC0+aXNlcSwgY2ZwLT5sZnAsIGNmcC0+
ZGZwKTsKIH0KIAorVkFMVUUKK3JiX3ZtX2NyZWZfY2xzKHZvaWQpCit7Cisg
ICAgcmV0dXJuIHJiX3ZtX2NyZWYoKS0+bmRfY2xzczsKK30KKwogI2lmIDAK
IHZvaWQKIGRlYnVnX2NyZWYoTk9ERSAqY3JlZikK

--mimepart_4cdb6810aa454_566d5bc22da238b--