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/