diff options
Diffstat (limited to 'mrbgems/mruby-random/src/random.c')
| -rw-r--r-- | mrbgems/mruby-random/src/random.c | 48 |
1 files changed, 28 insertions, 20 deletions
diff --git a/mrbgems/mruby-random/src/random.c b/mrbgems/mruby-random/src/random.c index ac43d1bbe..ac8f24a18 100644 --- a/mrbgems/mruby-random/src/random.c +++ b/mrbgems/mruby-random/src/random.c @@ -14,7 +14,6 @@ #include <time.h> static char const GLOBAL_RAND_SEED_KEY[] = "$mrb_g_rand_seed"; -static char const INSTANCE_RAND_SEED_KEY[] = "$mrb_i_rand_seed"; static char const MT_STATE_KEY[] = "$mrb_i_mt_state"; static const struct mrb_data_type mt_state_type = { @@ -188,7 +187,14 @@ mrb_random_init(mrb_state *mrb, mrb_value self) seed = get_opt(mrb); seed = mrb_random_mt_srand(mrb, t, seed); - mrb_iv_set(mrb, self, mrb_intern_lit(mrb, INSTANCE_RAND_SEED_KEY), seed); + if (mrb_nil_p(seed)) { + t->has_seed = FALSE; + } + else { + mrb_assert(mrb_fixnum_p(seed)); + t->has_seed = TRUE; + t->seed = mrb_fixnum(seed); + } DATA_PTR(self) = t; @@ -196,13 +202,9 @@ mrb_random_init(mrb_state *mrb, mrb_value self) } static void -mrb_random_rand_seed(mrb_state *mrb, mrb_value self) +mrb_random_rand_seed(mrb_state *mrb, mt_state *t) { - mrb_value seed; - mt_state *t = DATA_PTR(self); - - seed = mrb_iv_get(mrb, self, mrb_intern_lit(mrb, INSTANCE_RAND_SEED_KEY)); - if (mrb_nil_p(seed)) { + if (!t->has_seed) { mrb_random_mt_srand(mrb, t, mrb_nil_value()); } } @@ -214,7 +216,7 @@ mrb_random_rand(mrb_state *mrb, mrb_value self) mt_state *t = DATA_PTR(self); max = get_opt(mrb); - mrb_random_rand_seed(mrb, self); + mrb_random_rand_seed(mrb, t); return mrb_random_mt_rand(mrb, t, max); } @@ -227,8 +229,15 @@ mrb_random_srand(mrb_state *mrb, mrb_value self) seed = get_opt(mrb); seed = mrb_random_mt_srand(mrb, t, seed); - old_seed = mrb_iv_get(mrb, self, mrb_intern_lit(mrb, INSTANCE_RAND_SEED_KEY)); - mrb_iv_set(mrb, self, mrb_intern_lit(mrb, INSTANCE_RAND_SEED_KEY), seed); + old_seed = t->has_seed? mrb_fixnum_value(t->seed) : mrb_nil_value(); + if (mrb_nil_p(seed)) { + t->has_seed = FALSE; + } + else { + mrb_assert(mrb_fixnum_p(seed)); + t->has_seed = TRUE; + t->seed = mrb_fixnum(seed); + } return old_seed; } @@ -244,17 +253,16 @@ static mrb_value mrb_ary_shuffle_bang(mrb_state *mrb, mrb_value ary) { mrb_int i; - mrb_value random = mrb_nil_value(); + mt_state *random = NULL; if (RARRAY_LEN(ary) > 1) { - mrb_get_args(mrb, "|o", &random); + mrb_get_args(mrb, "|d", &random, &mt_state_type); - if (mrb_nil_p(random)) { - mrb_random_g_rand_seed(mrb); + if (random) { + mrb_random_rand_seed(mrb, random); } else { - mrb_data_check_type(mrb, random, &mt_state_type); - mrb_random_rand_seed(mrb, random); + mrb_random_g_rand_seed(mrb); } mrb_ary_modify(mrb, mrb_ary_ptr(ary)); @@ -263,11 +271,11 @@ mrb_ary_shuffle_bang(mrb_state *mrb, mrb_value ary) mrb_int j; mrb_value tmp; - if (mrb_nil_p(random)) { - j = mrb_fixnum(mrb_random_mt_g_rand(mrb, mrb_fixnum_value(RARRAY_LEN(ary)))); + if (random) { + j = mrb_fixnum(mrb_random_mt_rand(mrb, random, mrb_fixnum_value(RARRAY_LEN(ary)))); } else { - j = mrb_fixnum(mrb_random_mt_rand(mrb, DATA_PTR(random), mrb_fixnum_value(RARRAY_LEN(ary)))); + j = mrb_fixnum(mrb_random_mt_g_rand(mrb, mrb_fixnum_value(RARRAY_LEN(ary)))); } tmp = RARRAY_PTR(ary)[i]; |
