summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--README.md4
-rw-r--r--include/mruby/numeric.h1
-rw-r--r--include/mruby/value.h5
-rw-r--r--mrbgems/mruby-random/src/mt19937ar.c4
-rw-r--r--mrbgems/mruby-random/src/random.c99
-rw-r--r--mrbgems/mruby-time/src/time.c19
-rw-r--r--src/kernel.c1
-rw-r--r--src/numeric.c30
8 files changed, 59 insertions, 104 deletions
diff --git a/README.md b/README.md
index 0f247699f..7386f28bb 100644
--- a/README.md
+++ b/README.md
@@ -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 */