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

ruby-changes:15063

From: nobu <ko1@a...>
Date: Mon, 15 Mar 2010 18:34:41 +0900 (JST)
Subject: [ruby-changes:15063] Ruby:r26939 (trunk): * random.c (default_rand): removed initial buffer.

nobu	2010-03-15 18:33:39 +0900 (Mon, 15 Mar 2010)

  New Revision: 26939

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

  Log:
    * random.c (default_rand): removed initial buffer.
    
    * random.c (Init_RandomSeed): initialize seed of default random.
    
    * random.c (Init_RandomSeed2): turn the seed to Bignum object.

  Modified files:
    trunk/ChangeLog
    trunk/random.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 26938)
+++ ChangeLog	(revision 26939)
@@ -1,3 +1,11 @@
+Mon Mar 15 18:33:36 2010  Nobuyoshi Nakada  <nobu@r...>
+
+	* random.c (default_rand): removed initial buffer.
+
+	* random.c (Init_RandomSeed): initialize seed of default random.
+
+	* random.c (Init_RandomSeed2): turn the seed to Bignum object.
+
 Mon Mar 15 17:28:30 2010  Yukihiro Matsumoto  <matz@r...>
 
 	* io.c (rb_io_print): RDoc update.  a patch from Daniel Kelley
Index: random.c
===================================================================
--- random.c	(revision 26938)
+++ random.c	(revision 26939)
@@ -215,20 +215,15 @@
 
 #define DEFAULT_SEED_CNT 4
 
-struct Random {
-    rb_random_t rnd;
-    unsigned int initial[DEFAULT_SEED_CNT];
-};
+static rb_random_t default_rand;
 
-static struct Random default_rand;
-
 static VALUE rand_init(struct MT *mt, VALUE vseed);
 static VALUE random_seed(void);
 
 static struct MT *
 default_mt(void)
 {
-    rb_random_t *r = &default_rand.rnd;
+    rb_random_t *r = &default_rand;
     struct MT *mt = &r->mt;
     if (!genrand_initialized(mt)) {
 	r->seed = rand_init(mt, random_seed());
@@ -353,7 +348,7 @@
 random_alloc(VALUE klass)
 {
     rb_random_t *rnd;
-    VALUE obj = TypedData_Make_Struct(rb_cRandom, rb_random_t, &random_data_type, rnd);
+    VALUE obj = TypedData_Make_Struct(klass, rb_random_t, &random_data_type, rnd);
     rnd->seed = INT2FIX(0);
     return obj;
 }
@@ -601,7 +596,7 @@
 static VALUE
 random_s_state(VALUE klass)
 {
-    return mt_state(&default_rand.rnd.mt);
+    return mt_state(&default_rand.mt);
 }
 
 /* :nodoc: */
@@ -616,7 +611,7 @@
 static VALUE
 random_s_left(VALUE klass)
 {
-    return INT2FIX(default_rand.rnd.mt.left);
+    return INT2FIX(default_rand.mt.left);
 }
 
 /* :nodoc: */
@@ -739,7 +734,7 @@
 rb_f_srand(int argc, VALUE *argv, VALUE obj)
 {
     VALUE seed, old;
-    struct Random *r = &default_rand;
+    rb_random_t *r = &default_rand;
 
     rb_secure(4);
     if (argc == 0) {
@@ -748,8 +743,8 @@
     else {
 	rb_scan_args(argc, argv, "01", &seed);
     }
-    old = r->rnd.seed;
-    r->rnd.seed = rand_init(&r->rnd.mt, seed);
+    old = r->seed;
+    r->seed = rand_init(&r->mt, seed);
 
     return old;
 }
@@ -1136,15 +1131,25 @@
 
 static st_index_t hashseed;
 
+static VALUE
+init_randomseed(struct MT *mt, unsigned int initial[DEFAULT_SEED_CNT])
+{
+    VALUE seed;
+    fill_random_seed(initial);
+    init_by_array(mt, initial, DEFAULT_SEED_CNT);
+    seed = make_seed_value(initial);
+    memset(initial, 0, DEFAULT_SEED_LEN);
+    return seed;
+}
+
 void
 Init_RandomSeed(void)
 {
-    struct Random *r = &default_rand;
-    struct MT *mt = &r->rnd.mt;
+    rb_random_t *r = &default_rand;
+    unsigned int initial[DEFAULT_SEED_CNT];
+    struct MT *mt = &r->mt;
+    VALUE seed = init_randomseed(mt, initial);
 
-    fill_random_seed(r->initial);
-    init_by_array(mt, r->initial, DEFAULT_SEED_CNT);
-
     hashseed = genrand_int32(mt);
 #if SIZEOF_ST_INDEX_T*CHAR_BIT > 4*8
     hashseed <<= 32;
@@ -1158,6 +1163,9 @@
     hashseed <<= 32;
     hashseed |= genrand_int32(mt);
 #endif
+
+    rb_global_variable(&r->seed);
+    r->seed = seed;
 }
 
 st_index_t
@@ -1169,18 +1177,19 @@
 static void
 Init_RandomSeed2(void)
 {
-    struct Random *r = &default_rand;
-    rb_global_variable(&r->rnd.seed);
-    r->rnd.seed = make_seed_value(r->initial);
-    memset(r->initial, 0, DEFAULT_SEED_LEN);
+    VALUE seed = default_rand.seed;
+
+    if (RB_TYPE_P(seed, T_BIGNUM)) {
+	RBASIC(seed)->klass = rb_cBignum;
+    }
 }
 
 void
 rb_reset_random_seed(void)
 {
-    struct Random *r = &default_rand;
-    uninit_genrand(&r->rnd.mt);
-    r->rnd.seed = INT2FIX(0);
+    rb_random_t *r = &default_rand;
+    uninit_genrand(&r->mt);
+    r->seed = INT2FIX(0);
 }
 
 void

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

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