diff options
| -rw-r--r-- | README.md | 4 | ||||
| -rw-r--r-- | include/mruby/numeric.h | 1 | ||||
| -rw-r--r-- | include/mruby/value.h | 5 | ||||
| -rw-r--r-- | mrbgems/mruby-random/src/mt19937ar.c | 4 | ||||
| -rw-r--r-- | mrbgems/mruby-random/src/random.c | 99 | ||||
| -rw-r--r-- | mrbgems/mruby-time/src/time.c | 19 | ||||
| -rw-r--r-- | src/kernel.c | 1 | ||||
| -rw-r--r-- | src/numeric.c | 30 |
8 files changed, 59 insertions, 104 deletions
@@ -38,9 +38,7 @@ following command: ## mruby home-page -mruby's website is not launched yet but we are actively working on it. - -The URL of the mruby home-page will be: +The URL of the mruby home-page is: http://www.mruby.org/ diff --git a/include/mruby/numeric.h b/include/mruby/numeric.h index d866d36d1..d0305160c 100644 --- a/include/mruby/numeric.h +++ b/include/mruby/numeric.h @@ -16,7 +16,6 @@ extern "C" { #define FIXABLE(f) (POSFIXABLE(f) && NEGFIXABLE(f)) mrb_value mrb_flo_to_fixnum(mrb_state *mrb, mrb_value val); -mrb_value mrb_flo_to_str(mrb_state *mrb, mrb_value flo); mrb_value mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, int base); diff --git a/include/mruby/value.h b/include/mruby/value.h index 13acd039e..562817678 100644 --- a/include/mruby/value.h +++ b/include/mruby/value.h @@ -59,6 +59,7 @@ typedef short mrb_sym; # include <float.h> # define isnan _isnan # define isinf(n) (!_finite(n) && !_isnan(n)) +# define signbit(n) (_copysign(1.0, (n)) < 0.0) # define strtoll _strtoi64 # define strtof (float)strtod # define PRId32 "I32d" @@ -99,7 +100,7 @@ enum mrb_vtype { MRB_TT_SYMBOL, /* 5 */ MRB_TT_UNDEF, /* 6 */ MRB_TT_FLOAT, /* 7 */ - MRB_TT_CPTR, /* 8 */ + MRB_TT_CPTR, /* 8 */ MRB_TT_OBJECT, /* 9 */ MRB_TT_CLASS, /* 10 */ MRB_TT_MODULE, /* 11 */ @@ -195,7 +196,7 @@ enum mrb_vtype { MRB_TT_SYMBOL, /* 4 */ MRB_TT_UNDEF, /* 5 */ MRB_TT_FLOAT, /* 6 */ - MRB_TT_CPTR, /* 7 */ + MRB_TT_CPTR, /* 7 */ MRB_TT_OBJECT, /* 8 */ MRB_TT_CLASS, /* 9 */ MRB_TT_MODULE, /* 10 */ diff --git a/mrbgems/mruby-random/src/mt19937ar.c b/mrbgems/mruby-random/src/mt19937ar.c index 2c22b23ad..b237af56d 100644 --- a/mrbgems/mruby-random/src/mt19937ar.c +++ b/mrbgems/mruby-random/src/mt19937ar.c @@ -14,8 +14,10 @@ #define UPPER_MASK 0x80000000UL /* most significant w-r bits */ #define LOWER_MASK 0x7fffffffUL /* least significant r bits */ +#if 0 /* dead_code */ static unsigned long mt[N]; /* the array for the state vector */ static int mti=N+1; /* mti==N+1 means mt[N] is not initialized */ +#endif /* dead_code */ void mrb_random_init_genrand(mt_state *t, unsigned long s) { @@ -74,6 +76,7 @@ double mrb_random_genrand_real1(mt_state *t) /* divided by 2^32-1 */ } +#if 0 /* dead_code */ /* initializes mt[N] with a seed */ void init_genrand(unsigned long s) { @@ -191,3 +194,4 @@ double genrand_res53(void) return(a*67108864.0+b)*(1.0/9007199254740992.0); } /* These real versions are due to Isaku Wada, 2002/01/09 added */ +#endif /* dead_code */ diff --git a/mrbgems/mruby-random/src/random.c b/mrbgems/mruby-random/src/random.c index ac8f24a18..a708923d3 100644 --- a/mrbgems/mruby-random/src/random.c +++ b/mrbgems/mruby-random/src/random.c @@ -20,51 +20,9 @@ static const struct mrb_data_type mt_state_type = { MT_STATE_KEY, mrb_free, }; -static void mt_g_srand(unsigned long seed) -{ - init_genrand(seed); -} +static mrb_value mrb_random_rand(mrb_state *mrb, mrb_value self); +static mrb_value mrb_random_srand(mrb_state *mrb, mrb_value self); -static unsigned long mt_g_rand(void) -{ - return genrand_int32(); -} - -static double mt_g_rand_real(void) -{ - return genrand_real1(); -} - -static mrb_value -mrb_random_mt_g_srand(mrb_state *mrb, mrb_value seed) -{ - if (mrb_nil_p(seed)) { - seed = mrb_fixnum_value(time(NULL) + mt_g_rand()); - if (mrb_fixnum(seed) < 0) { - seed = mrb_fixnum_value( 0 - mrb_fixnum(seed)); - } - } - - mt_g_srand((unsigned) mrb_fixnum(seed)); - - return seed; -} - -static mrb_value -mrb_random_mt_g_rand(mrb_state *mrb, mrb_value max) -{ - mrb_value value; - - if (mrb_fixnum(max) == 0) { - value = mrb_float_value(mrb, mt_g_rand_real()); - } - else { - value = mrb_fixnum_value(mt_g_rand() % mrb_fixnum(max)); - } - - return value; -} - static void mt_srand(mt_state *t, unsigned long seed) { @@ -133,38 +91,22 @@ get_opt(mrb_state* mrb) return arg; } -static void -mrb_random_g_rand_seed(mrb_state *mrb) -{ - mrb_value seed; - - 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()); - } -} - static mrb_value mrb_random_g_rand(mrb_state *mrb, mrb_value self) { - mrb_value max; - - max = get_opt(mrb); - mrb_random_g_rand_seed(mrb); - return mrb_random_mt_g_rand(mrb, max); + mrb_value random = mrb_const_get(mrb, + mrb_obj_value(mrb_class_get(mrb, "Random")), + mrb_intern_lit(mrb, "DEFAULT")); + return mrb_random_rand(mrb, random); } static mrb_value mrb_random_g_srand(mrb_state *mrb, mrb_value self) { - mrb_value seed; - mrb_value old_seed; - - seed = get_opt(mrb); - seed = mrb_random_mt_g_srand(mrb, 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; + mrb_value random = mrb_const_get(mrb, + mrb_obj_value(mrb_class_get(mrb, "Random")), + mrb_intern_lit(mrb, "DEFAULT")); + return mrb_random_srand(mrb, random); } static mrb_value @@ -258,12 +200,13 @@ mrb_ary_shuffle_bang(mrb_state *mrb, mrb_value ary) if (RARRAY_LEN(ary) > 1) { mrb_get_args(mrb, "|d", &random, &mt_state_type); - if (random) { - mrb_random_rand_seed(mrb, random); - } - else { - mrb_random_g_rand_seed(mrb); + if (random == NULL) { + mrb_value random_val = mrb_const_get(mrb, + mrb_obj_value(mrb_class_get(mrb, "Random")), + mrb_intern_lit(mrb, "DEFAULT")); + random = (mt_state *)DATA_PTR(random_val); } + mrb_random_rand_seed(mrb, random); mrb_ary_modify(mrb, mrb_ary_ptr(ary)); @@ -271,12 +214,7 @@ mrb_ary_shuffle_bang(mrb_state *mrb, mrb_value ary) mrb_int j; mrb_value tmp; - if (random) { - j = mrb_fixnum(mrb_random_mt_rand(mrb, random, mrb_fixnum_value(RARRAY_LEN(ary)))); - } - else { - j = mrb_fixnum(mrb_random_mt_g_rand(mrb, mrb_fixnum_value(RARRAY_LEN(ary)))); - } + j = mrb_fixnum(mrb_random_mt_rand(mrb, random, mrb_fixnum_value(RARRAY_LEN(ary)))); tmp = RARRAY_PTR(ary)[i]; RARRAY_PTR(ary)[i] = RARRAY_PTR(ary)[j]; @@ -322,6 +260,9 @@ void mrb_mruby_random_gem_init(mrb_state *mrb) mrb_define_method(mrb, array, "shuffle", mrb_ary_shuffle, MRB_ARGS_OPT(1)); mrb_define_method(mrb, array, "shuffle!", mrb_ary_shuffle_bang, MRB_ARGS_OPT(1)); + + mrb_const_set(mrb, mrb_obj_value(random), mrb_intern_lit(mrb, "DEFAULT"), + mrb_obj_new(mrb, random, 0, NULL)); } void mrb_mruby_random_gem_final(mrb_state *mrb) diff --git a/mrbgems/mruby-time/src/time.c b/mrbgems/mruby-time/src/time.c index 8bea2cb5b..a13af790b 100644 --- a/mrbgems/mruby-time/src/time.c +++ b/mrbgems/mruby-time/src/time.c @@ -93,11 +93,16 @@ enum mrb_timezone { MRB_TIMEZONE_LAST = 3 }; -static const char *timezone_names[] = { - "none", - "UTC", - "LOCAL", - NULL +typedef struct mrb_timezone_name { + const char *name; + size_t len; +} mrb_timezone_name; + +static mrb_timezone_name timezone_names[] = { + { "none", sizeof("none") - 1 }, + { "UTC", sizeof("UTC") - 1 }, + { "LOCAL", sizeof("LOCAL") - 1 }, + { NULL, 0 } }; static const char *mon_names[] = { @@ -401,7 +406,9 @@ mrb_time_zone(mrb_state *mrb, mrb_value self) tm = DATA_GET_PTR(mrb, self, &mrb_time_type, struct mrb_time); if (tm->timezone <= MRB_TIMEZONE_NONE) return mrb_nil_value(); if (tm->timezone >= MRB_TIMEZONE_LAST) return mrb_nil_value(); - return mrb_str_new_cstr(mrb, timezone_names[tm->timezone]); + return mrb_str_new_static(mrb, + timezone_names[tm->timezone].name, + timezone_names[tm->timezone].len); } /* 15.2.19.7.4 */ diff --git a/src/kernel.c b/src/kernel.c index 9aec33d67..25863c897 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -309,6 +309,7 @@ init_copy(mrb_state *mrb, mrb_value dest, mrb_value obj) case MRB_TT_CLASS: case MRB_TT_MODULE: copy_class(mrb, dest, obj); + /* fall through */ case MRB_TT_OBJECT: case MRB_TT_SCLASS: case MRB_TT_HASH: diff --git a/src/numeric.c b/src/numeric.c index e081cf80a..5f23b2461 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -108,18 +108,12 @@ num_div(mrb_state *mrb, mrb_value x) * representation. */ -mrb_value -mrb_flo_to_str(mrb_state *mrb, mrb_value flo) +static mrb_value +mrb_flo_to_str(mrb_state *mrb, mrb_float flo) { - double n; + double n = (double)flo; int max_digits = FLO_MAX_DIGITS; - if (!mrb_float_p(flo)) { - mrb_raise(mrb, E_TYPE_ERROR, "non float value"); - } - - n = (double)mrb_float(flo); - if (isnan(n)) { return mrb_str_new_lit(mrb, "NaN"); } @@ -140,12 +134,22 @@ mrb_flo_to_str(mrb_state *mrb, mrb_value flo) char *c = &s[0]; int length = 0; - if (n < 0) { + if (signbit(n)) { n = -n; *(c++) = '-'; } - exp = (n > 1) ? floor(log10(n)) : -ceil(-log10(n)); + if (n != 0.0) { + if (n > 1.0) { + exp = (int)floor(log10(n)); + } + else { + exp = (int)-ceil(-log10(n)); + } + } + else { + exp = 0; + } /* preserve significands */ if (exp < 0) { @@ -188,7 +192,7 @@ mrb_flo_to_str(mrb_state *mrb, mrb_value flo) while (max_digits >= 0) { double weight = pow(10.0, m); double fdigit = n / weight; - + if (fdigit < 0) fdigit = n = 0; if (m < -1 && fdigit < FLO_EPSILON) { if (e || exp > 0 || m <= -abs(exp)) { @@ -254,7 +258,7 @@ mrb_flo_to_str(mrb_state *mrb, mrb_value flo) static mrb_value flo_to_s(mrb_state *mrb, mrb_value flt) { - return mrb_flo_to_str(mrb, flt); + return mrb_flo_to_str(mrb, mrb_float(flt)); } /* 15.2.9.3.2 */ |
