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

ruby-changes:11338

From: nobu <ko1@a...>
Date: Sat, 14 Mar 2009 18:18:20 +0900 (JST)
Subject: [ruby-changes:11338] Ruby:r22955 (trunk): * proc.c (rb_proc_call, rb_node_arity, bmcall, curry): checks

nobu	2009-03-14 18:18:09 +0900 (Sat, 14 Mar 2009)

  New Revision: 22955

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

  Log:
    * proc.c (rb_proc_call, rb_node_arity, bmcall, curry): checks
      overflow.

  Modified files:
    trunk/ChangeLog
    trunk/proc.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 22954)
+++ ChangeLog	(revision 22955)
@@ -1,6 +1,7 @@
-Sat Mar 14 18:05:08 2009  Nobuyoshi Nakada  <nobu@r...>
+Sat Mar 14 18:18:08 2009  Nobuyoshi Nakada  <nobu@r...>
 
-	* proc.c (rb_proc_call): checks overflow.
+	* proc.c (rb_proc_call, rb_node_arity, bmcall, curry): checks
+	  overflow.
 
 	* proc.c (rb_proc_parameters): unnamed_parameters() expects in
 	  not VALUE.
Index: proc.c
===================================================================
--- proc.c	(revision 22954)
+++ proc.c	(revision 22955)
@@ -526,20 +526,28 @@
 			     argc, argv, blockptr);
 }
 
-VALUE
-rb_proc_call(VALUE self, VALUE args)
+#if SIZEOF_LONG > SIZEOF_INT
+static inline int
+check_argc(long argc)
 {
-    long argc = RARRAY_LEN(args);
-    rb_proc_t *proc;
-    GetProcPtr(self, proc);
-#if SIZEOF_LONG > SIZEOF_INT
     if (argc > INT_MAX || argc < 0) {
 	rb_raise(rb_eArgError, "too many arguments (%lu)",
 		 (unsigned long)argc);
     }
+    return (int)argc;
+}
+#else
+#define check_argc(argc) (argc)
 #endif
+
+VALUE
+rb_proc_call(VALUE self, VALUE args)
+{
+    long argc = ;
+    rb_proc_t *proc;
+    GetProcPtr(self, proc);
     return rb_vm_invoke_proc(GET_THREAD(), proc, proc->block.self,
-			     (int)argc, RARRAY_PTR(args), 0);
+			     check_argc(RARRAY_LEN(args)), RARRAY_PTR(args), 0);
 }
 
 VALUE
@@ -850,7 +858,7 @@
 	rb_print_undef(rclass, oid, 0);
     }
     if (scope && (body->nd_noex & NOEX_MASK) != NOEX_PUBLIC) {
-	rb_print_undef(rclass, oid, (body->nd_noex & NOEX_MASK));
+	rb_print_undef(rclass, oid, (int)(body->nd_noex & NOEX_MASK));
     }
 
     klass = body->nd_clss;
@@ -1418,7 +1426,7 @@
       case NODE_CFUNC:
 	if (body->nd_argc < 0)
 	    return -1;
-	return body->nd_argc;
+	return check_argc(body->nd_argc);
       case NODE_ZSUPER:
 	return -1;
       case NODE_ATTRSET:
@@ -1630,13 +1638,19 @@
 bmcall(VALUE args, VALUE method)
 {
     volatile VALUE a;
+    VALUE ret;
+    int argc;
 
     if (CLASS_OF(args) != rb_cArray) {
 	args = rb_ary_new3(1, args);
+	argc = 1;
     }
-
+    else {
+	argc = check_argc(RARRAY_LEN(argc));
+    }
+    ret = rb_method_call(argc, RARRAY_PTR(a), method);
     a = args;
-    return rb_method_call(RARRAY_LEN(a), RARRAY_PTR(a), method);
+    return ret;
 }
 
 VALUE
@@ -1773,7 +1787,8 @@
 	return arity;
     }
     else {
-	return rb_proc_call_with_block(proc, RARRAY_LEN(passed), RARRAY_PTR(passed), passed_proc);
+	return rb_proc_call_with_block(proc, check_argc(RARRAY_LEN(passed)),
+				       RARRAY_PTR(passed), passed_proc);
     }
 }
 

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

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