diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-06-01 00:31:00 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-06-01 00:31:00 +0000 |
commit | 5b95238aa7886a0c1de50895ebc98d1236eb914e (patch) | |
tree | a904225c98971cd2de7f833960c0456e3229b236 /object.c | |
parent | 53b61ccb78244733bcac744bf0edadade6a3b5da (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.c | 37 |
1 files changed, 18 insertions, 19 deletions
@@ -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; |