[前][次][番号順一覧][スレッド一覧]

ruby-changes:23808

From: nobu <ko1@a...>
Date: Fri, 1 Jun 2012 09:31:46 +0900 (JST)
Subject: [ruby-changes:23808] nobu:r35859 (trunk): class_or_module_required

nobu	2012-06-01 09:31:00 +0900 (Fri, 01 Jun 2012)

  New Revision: 35859

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=35859

  Log:
    class_or_module_required
    
    * object.c (class_or_module_required): extract check for class or
      module.

  Modified files:
    trunk/ChangeLog
    trunk/object.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 35858)
+++ ChangeLog	(revision 35859)
@@ -1,3 +1,8 @@
+Fri Jun  1 09:30:53 2012  Nobuyoshi Nakada  <nobu@r...>
+
+	* object.c (class_or_module_required): extract check for class or
+	  module.
+
 Fri Jun  1 08:50:47 2012  Eric Hodel  <drbrain@s...>
 
 	* array.c:  Updated Array documentation formatting.  Patch by Zachary
Index: object.c
===================================================================
--- object.c	(revision 35858)
+++ object.c	(revision 35859)
@@ -509,7 +509,23 @@
     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:
  *     obj.instance_of?(class)    -> true or false
@@ -530,15 +546,7 @@
 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 @@
 {
     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;

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]