summaryrefslogtreecommitdiff
path: root/object.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-06-01 00:31:00 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-06-01 00:31:00 +0000
commit5b95238aa7886a0c1de50895ebc98d1236eb914e (patch)
treea904225c98971cd2de7f833960c0456e3229b236 /object.c
parent53b61ccb78244733bcac744bf0edadade6a3b5da (diff)
class_or_module_required
* object.c (class_or_module_required): extract check for class or module. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35859 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'object.c')
-rw-r--r--object.c37
1 files changed, 18 insertions, 19 deletions
diff --git a/object.c b/object.c
index daa7015254..dbb8db63dd 100644
--- a/object.c
+++ b/object.c
@@ -509,6 +509,22 @@ rb_obj_inspect(VALUE obj)
return rb_funcall(obj, rb_intern("to_s"), 0, 0);
}
+static VALUE
+class_or_module_required(VALUE c)
+{
+ if (SPECIAL_CONST_P(c)) goto not_class;
+ switch (BUILTIN_TYPE(c)) {
+ case T_MODULE:
+ case T_CLASS:
+ case T_ICLASS:
+ break;
+
+ default:
+ not_class:
+ rb_raise(rb_eTypeError, "class or module required");
+ }
+ return c;
+}
/*
* call-seq:
@@ -530,15 +546,7 @@ rb_obj_inspect(VALUE obj)
VALUE
rb_obj_is_instance_of(VALUE obj, VALUE c)
{
- switch (TYPE(c)) {
- case T_MODULE:
- case T_CLASS:
- case T_ICLASS:
- break;
- default:
- rb_raise(rb_eTypeError, "class or module required");
- }
-
+ c = class_or_module_required(c);
if (rb_obj_class(obj) == c) return Qtrue;
return Qfalse;
}
@@ -577,16 +585,7 @@ rb_obj_is_kind_of(VALUE obj, VALUE c)
{
VALUE cl = CLASS_OF(obj);
- switch (TYPE(c)) {
- case T_MODULE:
- case T_CLASS:
- case T_ICLASS:
- break;
-
- default:
- rb_raise(rb_eTypeError, "class or module required");
- }
-
+ c = class_or_module_required(c);
while (cl) {
if (cl == c || RCLASS_M_TBL(cl) == RCLASS_M_TBL(c))
return Qtrue;