summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-05-13 05:50:38 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-05-13 05:50:38 +0000
commit609c7420d77aed3492648b6dae7adf118d3a8ab9 (patch)
tree49c7334638da00e14c044070b1727fef327af379
parent111c791c3730608a0a961ab86d153c824e26db9f (diff)
class.c: rb_singleton_class_get
* class.c (rb_singleton_class_get): get the singleton class if exists, or nil. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40682 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--class.c20
-rw-r--r--internal.h1
3 files changed, 26 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 96f0535e3c..43ceb05184 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Mon May 13 14:50:35 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * class.c (rb_singleton_class_get): get the singleton class if exists,
+ or nil.
+
Mon May 13 10:20:59 2013 Yuki Yugui Sonoda <yugui@google.com>
* ext/openssl/ossl_ssl.c: Disabled OpenSSL::SSL::SSLSocket if
diff --git a/class.c b/class.c
index 2035d90faa..a37a153d77 100644
--- a/class.c
+++ b/class.c
@@ -1448,6 +1448,26 @@ singleton_class_of(VALUE obj)
return klass;
}
+/*!
+ * Returns the singleton class of \a obj, or nil if obj is not a
+ * singleton object.
+ *
+ * \param obj an arbitrary object.
+ * \return the singleton class or nil.
+ */
+VALUE
+rb_singleton_class_get(VALUE obj)
+{
+ VALUE klass;
+
+ if (SPECIAL_CONST_P(obj)) {
+ return rb_special_singleton_class(obj);
+ }
+ klass = RBASIC(obj)->klass;
+ if (!FL_TEST(klass, FL_SINGLETON)) return Qnil;
+ if (rb_ivar_get(klass, id_attached) != obj) return Qnil;
+ return klass;
+}
/*!
* Returns the singleton class of \a obj. Creates it if necessary.
diff --git a/internal.h b/internal.h
index 7044efe5df..89a0e3ed2b 100644
--- a/internal.h
+++ b/internal.h
@@ -96,6 +96,7 @@ VALUE rb_obj_public_methods(int argc, VALUE *argv, VALUE obj);
int rb_obj_basic_to_s_p(VALUE);
VALUE rb_special_singleton_class(VALUE);
VALUE rb_singleton_class_clone_and_attach(VALUE obj, VALUE attach);
+VALUE rb_singleton_class_get(VALUE obj);
void Init_class_hierarchy(void);
/* compar.c */