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

ruby-changes:37516

From: nobu <ko1@a...>
Date: Sat, 14 Feb 2015 13:11:40 +0900 (JST)
Subject: [ruby-changes:37516] nobu:r49597 (trunk): random.c: allow negative argument to random_number

nobu	2015-02-14 13:11:26 +0900 (Sat, 14 Feb 2015)

  New Revision: 49597

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

  Log:
    random.c: allow negative argument to random_number
    
    * random.c (rand_random_number): allow negative argument as it is
      allowed by SecureRandom.random_number.

  Modified files:
    trunk/random.c
Index: random.c
===================================================================
--- random.c	(revision 49596)
+++ random.c	(revision 49597)
@@ -1070,6 +1070,13 @@ domain_error(void) https://github.com/ruby/ruby/blob/trunk/random.c#L1070
     rb_exc_raise(rb_class_new_instance(1, &error, rb_eSystemCallError));
 }
 
+NORETURN(static void invalid_argument(VALUE));
+static void
+invalid_argument(VALUE arg0)
+{
+    rb_raise(rb_eArgError, "invalid argument - %"PRIsVALUE, arg0);
+}
+
 static inline double
 float_value(VALUE v)
 {
@@ -1190,7 +1197,9 @@ static VALUE rand_random(int argc, VALUE https://github.com/ruby/ruby/blob/trunk/random.c#L1197
 static VALUE
 random_rand(int argc, VALUE *argv, VALUE obj)
 {
-    return rand_random(argc, argv, obj, get_rnd(obj));
+    VALUE v = rand_random(argc, argv, obj, get_rnd(obj));
+    if (NIL_P(v)) invalid_argument(argv[0]);
+    return v;
 }
 
 static VALUE
@@ -1236,18 +1245,16 @@ rand_random(int argc, VALUE *argv, VALUE https://github.com/ruby/ruby/blob/trunk/random.c#L1245
 	v = Qnil;
 	(void)NUM2LONG(vmax);
     }
-    if (NIL_P(v)) {
-	rb_raise(rb_eArgError, "invalid argument - %"PRIsVALUE, argv[0]);
-    }
-
     return v;
 }
 
 static VALUE
 rand_random_number(int argc, VALUE *argv, VALUE obj)
 {
-    if (argc == 1 && argv[0] == INT2FIX(0)) --argc;
-    return rand_random(argc, argv, obj, try_get_rnd(obj));
+    rb_random_t *rnd = try_get_rnd(obj);
+    VALUE v = rand_random(argc, argv, obj, rnd);
+    if (NIL_P(v)) v = rand_random(0, 0, obj, rnd);
+    return v;
 }
 
 /*
@@ -1350,7 +1357,9 @@ rb_f_rand(int argc, VALUE *argv, VALUE o https://github.com/ruby/ruby/blob/trunk/random.c#L1357
 static VALUE
 random_s_rand(int argc, VALUE *argv, VALUE obj)
 {
-    return rand_random(argc, argv, Qnil, rand_start(&default_rand));
+    VALUE v = rand_random(argc, argv, Qnil, rand_start(&default_rand));
+    if (NIL_P(v)) invalid_argument(argv[0]);
+    return v;
 }
 
 #define SIP_HASH_STREAMING 0

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

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