summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-random/src/random.c
diff options
context:
space:
mode:
Diffstat (limited to 'mrbgems/mruby-random/src/random.c')
-rw-r--r--mrbgems/mruby-random/src/random.c62
1 files changed, 33 insertions, 29 deletions
diff --git a/mrbgems/mruby-random/src/random.c b/mrbgems/mruby-random/src/random.c
index 0d71ce2df..ac8f24a18 100644
--- a/mrbgems/mruby-random/src/random.c
+++ b/mrbgems/mruby-random/src/random.c
@@ -13,13 +13,8 @@
#include <time.h>
-#define GLOBAL_RAND_SEED_KEY "$mrb_g_rand_seed"
-#define GLOBAL_RAND_SEED_KEY_CSTR_LEN 16
-
-#define INSTANCE_RAND_SEED_KEY "$mrb_i_rand_seed"
-#define INSTANCE_RAND_SEED_KEY_CSTR_LEN 16
-
-#define MT_STATE_KEY "$mrb_i_mt_state"
+static char const GLOBAL_RAND_SEED_KEY[] = "$mrb_g_rand_seed";
+static char const MT_STATE_KEY[] = "$mrb_i_mt_state";
static const struct mrb_data_type mt_state_type = {
MT_STATE_KEY, mrb_free,
@@ -143,7 +138,7 @@ mrb_random_g_rand_seed(mrb_state *mrb)
{
mrb_value seed;
- seed = mrb_gv_get(mrb, mrb_intern(mrb, GLOBAL_RAND_SEED_KEY, GLOBAL_RAND_SEED_KEY_CSTR_LEN));
+ seed = mrb_gv_get(mrb, mrb_intern_lit(mrb, GLOBAL_RAND_SEED_KEY));
if (mrb_nil_p(seed)) {
mrb_random_mt_g_srand(mrb, mrb_nil_value());
}
@@ -167,8 +162,8 @@ mrb_random_g_srand(mrb_state *mrb, mrb_value self)
seed = get_opt(mrb);
seed = mrb_random_mt_g_srand(mrb, seed);
- old_seed = mrb_gv_get(mrb, mrb_intern(mrb, GLOBAL_RAND_SEED_KEY, GLOBAL_RAND_SEED_KEY_CSTR_LEN));
- mrb_gv_set(mrb, mrb_intern(mrb, GLOBAL_RAND_SEED_KEY, GLOBAL_RAND_SEED_KEY_CSTR_LEN), seed);
+ old_seed = mrb_gv_get(mrb, mrb_intern_lit(mrb, GLOBAL_RAND_SEED_KEY));
+ mrb_gv_set(mrb, mrb_intern_lit(mrb, GLOBAL_RAND_SEED_KEY), seed);
return old_seed;
}
@@ -192,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(mrb, INSTANCE_RAND_SEED_KEY, INSTANCE_RAND_SEED_KEY_CSTR_LEN), 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;
@@ -200,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(mrb, INSTANCE_RAND_SEED_KEY, INSTANCE_RAND_SEED_KEY_CSTR_LEN));
- if (mrb_nil_p(seed)) {
+ if (!t->has_seed) {
mrb_random_mt_srand(mrb, t, mrb_nil_value());
}
}
@@ -218,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);
}
@@ -231,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(mrb, INSTANCE_RAND_SEED_KEY, INSTANCE_RAND_SEED_KEY_CSTR_LEN));
- mrb_iv_set(mrb, self, mrb_intern(mrb, INSTANCE_RAND_SEED_KEY, INSTANCE_RAND_SEED_KEY_CSTR_LEN), 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;
}
@@ -248,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));
@@ -267,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];