Commit 00854497 authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto

Merge pull request #1075 from mattn/refactoring_rand

Refactoring mruby-random
parents 523118ce 46a46733
...@@ -55,178 +55,80 @@ static mrb_value mrb_random_mt_rand(mrb_state *mrb, mrb_value max) ...@@ -55,178 +55,80 @@ static mrb_value mrb_random_mt_rand(mrb_state *mrb, mrb_value max)
return value; return value;
} }
static mrb_value get_opt(mrb_state* mrb)
static mrb_value mrb_random_g_rand(mrb_state *mrb, mrb_value self)
{ {
mrb_value *argv; mrb_value arg;
mrb_int argc;
mrb_value max;
mrb_get_args(mrb, "*", &argv, &argc);
if (argc == 0) { arg = mrb_fixnum_value(0);
max = mrb_fixnum_value(0); mrb_get_args(mrb, "|o", &arg);
} else if (argc == 1) {
max = argv[0];
if (!mrb_nil_p(max) && !mrb_fixnum_p(max)) {
max = mrb_check_convert_type(mrb, max, MRB_TT_FIXNUM, "Fixnum", "to_int");
}
if (!mrb_nil_p(max) && mrb_fixnum(max) < 0) {
max = mrb_fixnum_value(0 - mrb_fixnum(max));
}
if (!mrb_fixnum_p(max)) { if (!mrb_nil_p(arg)) {
if (!mrb_fixnum_p(arg)) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid argument type"); mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid argument type");
return mrb_nil_value();
} }
} else { arg = mrb_check_convert_type(mrb, arg, MRB_TT_FIXNUM, "Fixnum", "to_int");
mrb_raisef(mrb, E_ARGUMENT_ERROR, "wrong number of arguments (%d for 0..1)", argc); if (mrb_fixnum(arg) < 0) {
return mrb_nil_value(); arg = mrb_fixnum_value(0 - mrb_fixnum(arg));
}
} }
return arg;
}
mrb_value seed = mrb_gv_get(mrb, mrb_intern(mrb, GLOBAL_RAND_SEED_KEY)); static mrb_value mrb_random_g_rand(mrb_state *mrb, mrb_value self)
if (mrb_nil_p(seed)) {
mrb_random_mt_srand(mrb, mrb_nil_value()); mrb_value max;
mrb_value seed;
max = get_opt(mrb);
seed = mrb_gv_get(mrb, mrb_intern(mrb, GLOBAL_RAND_SEED_KEY));
if (mrb_nil_p(seed)) {
mrb_random_mt_srand(mrb, mrb_nil_value());
}
return mrb_random_mt_rand(mrb, max); return mrb_random_mt_rand(mrb, max);
} }
static mrb_value mrb_random_g_srand(mrb_state *mrb, mrb_value self) static mrb_value mrb_random_g_srand(mrb_state *mrb, mrb_value self)
{ {
mrb_int argc;
mrb_value *argv;
mrb_value seed; mrb_value seed;
mrb_value old_seed;
mrb_get_args(mrb, "*", &argv, &argc); seed = get_opt(mrb);
if (argc == 0) {
seed = mrb_nil_value();
} else if (argc == 1) {
seed = argv[0];
if (!mrb_nil_p(seed) && !mrb_fixnum_p(seed)) {
seed = mrb_check_convert_type(mrb, seed, MRB_TT_FIXNUM, "Fixnum", "to_int");
}
if (!mrb_nil_p(seed) && mrb_fixnum(seed) < 0) {
seed = mrb_fixnum_value(0 - mrb_fixnum(seed));
}
if (!mrb_fixnum_p(seed)) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid argument type");
return mrb_nil_value();
}
} else {
mrb_raisef(mrb, E_ARGUMENT_ERROR, "wrong number of arguments (%d for 0..1)", argc);
return mrb_nil_value();
}
seed = mrb_random_mt_srand(mrb, seed); seed = mrb_random_mt_srand(mrb, seed);
mrb_value old_seed = mrb_gv_get(mrb, mrb_intern(mrb, GLOBAL_RAND_SEED_KEY)); old_seed = mrb_gv_get(mrb, mrb_intern(mrb, GLOBAL_RAND_SEED_KEY));
mrb_gv_set(mrb, mrb_intern(mrb, GLOBAL_RAND_SEED_KEY), seed); mrb_gv_set(mrb, mrb_intern(mrb, GLOBAL_RAND_SEED_KEY), seed);
return old_seed; return old_seed;
} }
static mrb_value mrb_random_init(mrb_state *mrb, mrb_value self) static mrb_value mrb_random_init(mrb_state *mrb, mrb_value self)
{ {
mrb_int argc;
mrb_value *argv;
mrb_value seed; mrb_value seed;
mrb_get_args(mrb, "*", &argv, &argc); seed = get_opt(mrb);
if (argc == 0) {
seed = mrb_nil_value();
} else if (argc == 1) {
seed = argv[0];
if (!mrb_nil_p(seed) && !mrb_fixnum_p(seed)) {
seed = mrb_check_convert_type(mrb, seed, MRB_TT_FIXNUM, "Fixnum", "to_int");
}
if (!mrb_nil_p(seed) && mrb_fixnum(seed) < 0) {
seed = mrb_fixnum_value(0 - mrb_fixnum(seed));
}
if (!mrb_fixnum_p(seed)) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid argument type");
return mrb_nil_value();
}
} else {
mrb_raisef(mrb, E_ARGUMENT_ERROR, "wrong number of arguments (%d for 0..1)", argc);
return mrb_nil_value();
}
seed = mrb_random_mt_srand(mrb, seed); seed = mrb_random_mt_srand(mrb, seed);
mrb_iv_set(mrb, self, mrb_intern(mrb, INSTANCE_RAND_SEED_KEY), seed); mrb_iv_set(mrb, self, mrb_intern(mrb, INSTANCE_RAND_SEED_KEY), seed);
return self; return self;
} }
static mrb_value mrb_random_rand(mrb_state *mrb, mrb_value self) static mrb_value mrb_random_rand(mrb_state *mrb, mrb_value self)
{ {
mrb_value *argv;
mrb_int argc;
mrb_value max; mrb_value max;
mrb_get_args(mrb, "*", &argv, &argc); max = get_opt(mrb);
if (argc == 0) {
max = mrb_fixnum_value(0);
} else if (argc == 1) {
max = argv[0];
if (!mrb_nil_p(max) && !mrb_fixnum_p(max)) {
max = mrb_check_convert_type(mrb, max, MRB_TT_FIXNUM, "Fixnum", "to_int");
}
if (!mrb_nil_p(max) && mrb_fixnum(max) < 0) {
max = mrb_fixnum_value(0 - mrb_fixnum(max));
}
if (!mrb_fixnum_p(max)) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid argument type");
return mrb_nil_value();
}
} else {
mrb_raisef(mrb, E_ARGUMENT_ERROR, "wrong number of arguments (%d for 0..1)", argc);
return mrb_nil_value();
}
mrb_value seed = mrb_iv_get(mrb, self, mrb_intern(mrb, INSTANCE_RAND_SEED_KEY)); mrb_value seed = mrb_iv_get(mrb, self, mrb_intern(mrb, INSTANCE_RAND_SEED_KEY));
if (mrb_nil_p(seed)) if (mrb_nil_p(seed)) {
mrb_random_mt_srand(mrb, mrb_nil_value()); mrb_random_mt_srand(mrb, mrb_nil_value());
}
return mrb_random_mt_rand(mrb, max); return mrb_random_mt_rand(mrb, max);
} }
static mrb_value mrb_random_srand(mrb_state *mrb, mrb_value self) static mrb_value mrb_random_srand(mrb_state *mrb, mrb_value self)
{ {
mrb_int argc;
mrb_value *argv;
mrb_value seed; mrb_value seed;
mrb_get_args(mrb, "*", &argv, &argc); seed = get_opt(mrb);
if (argc == 0) {
seed = mrb_nil_value();
} else if (argc == 1) {
seed = argv[0];
if (!mrb_nil_p(seed) && !mrb_fixnum_p(seed)) {
seed = mrb_check_convert_type(mrb, seed, MRB_TT_FIXNUM, "Fixnum", "to_int");
}
if (!mrb_nil_p(seed) && mrb_fixnum(seed) < 0) {
seed = mrb_fixnum_value(0 - mrb_fixnum(seed));
}
if (!mrb_fixnum_p(seed)) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid argument type");
return mrb_nil_value();
}
} else {
mrb_raisef(mrb, E_ARGUMENT_ERROR, "wrong number of arguments (%d for 0..1)", argc);
return mrb_nil_value();
}
seed = mrb_random_mt_srand(mrb, seed); seed = mrb_random_mt_srand(mrb, seed);
mrb_value old_seed = mrb_iv_get(mrb, self, mrb_intern(mrb, INSTANCE_RAND_SEED_KEY)); mrb_value old_seed = mrb_iv_get(mrb, self, mrb_intern(mrb, INSTANCE_RAND_SEED_KEY));
mrb_iv_set(mrb, self, mrb_intern(mrb, INSTANCE_RAND_SEED_KEY), seed); mrb_iv_set(mrb, self, mrb_intern(mrb, INSTANCE_RAND_SEED_KEY), seed);
return old_seed; return old_seed;
} }
...@@ -234,16 +136,16 @@ void mrb_mruby_random_gem_init(mrb_state *mrb) ...@@ -234,16 +136,16 @@ void mrb_mruby_random_gem_init(mrb_state *mrb)
{ {
struct RClass *random; struct RClass *random;
mrb_define_method(mrb, mrb->kernel_module, "rand", mrb_random_g_rand, ARGS_ANY()); mrb_define_method(mrb, mrb->kernel_module, "rand", mrb_random_g_rand, ARGS_OPT(1));
mrb_define_method(mrb, mrb->kernel_module, "srand", mrb_random_g_srand, ARGS_ANY()); mrb_define_method(mrb, mrb->kernel_module, "srand", mrb_random_g_srand, ARGS_OPT(1));
random = mrb_define_class(mrb, "Random", mrb->object_class); random = mrb_define_class(mrb, "Random", mrb->object_class);
mrb_define_class_method(mrb, random, "rand", mrb_random_g_rand, ARGS_ANY()); mrb_define_class_method(mrb, random, "rand", mrb_random_g_rand, ARGS_OPT(1));
mrb_define_class_method(mrb, random, "srand", mrb_random_g_srand, ARGS_ANY()); mrb_define_class_method(mrb, random, "srand", mrb_random_g_srand, ARGS_OPT(1));
mrb_define_method(mrb, random, "initialize", mrb_random_init, ARGS_ANY()); mrb_define_method(mrb, random, "initialize", mrb_random_init, ARGS_OPT(1));
mrb_define_method(mrb, random, "rand", mrb_random_rand, ARGS_ANY()); mrb_define_method(mrb, random, "rand", mrb_random_rand, ARGS_OPT(1));
mrb_define_method(mrb, random, "srand", mrb_random_srand, ARGS_ANY()); mrb_define_method(mrb, random, "srand", mrb_random_srand, ARGS_OPT(1));
} }
void mrb_mruby_random_gem_final(mrb_state *mrb) void mrb_mruby_random_gem_final(mrb_state *mrb)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment