From 5b95238aa7886a0c1de50895ebc98d1236eb914e Mon Sep 17 00:00:00 2001 From: nobu Date: Fri, 1 Jun 2012 00:31:00 +0000 Subject: [PATCH] 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 --- ChangeLog | 5 +++++ object.c | 37 ++++++++++++++++++------------------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/ChangeLog b/ChangeLog index c0ee850e6611da..8c45f46420bd86 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Fri Jun 1 09:30:53 2012 Nobuyoshi Nakada + + * object.c (class_or_module_required): extract check for class or + module. + Fri Jun 1 08:50:47 2012 Eric Hodel * array.c: Updated Array documentation formatting. Patch by Zachary diff --git a/object.c b/object.c index daa7015254d066..dbb8db63dda154 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;