diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/dump.c | 4 | ||||
| -rw-r--r-- | src/etc.c | 20 | ||||
| -rw-r--r-- | src/load.c | 4 | ||||
| -rw-r--r-- | src/numeric.c | 16 | ||||
| -rw-r--r-- | src/string.c | 3 | ||||
| -rw-r--r-- | src/symbol.c | 4 | ||||
| -rw-r--r-- | src/vm.c | 3 |
7 files changed, 39 insertions, 15 deletions
diff --git a/src/dump.c b/src/dump.c index 94d5cf74d..4327cb375 100644 --- a/src/dump.c +++ b/src/dump.c @@ -4,12 +4,12 @@ ** See Copyright Notice in mruby.h */ -#include <string.h> -#include <math.h> +#include <mruby.h> #include <mruby/dump.h> #include <mruby/string.h> #include <mruby/irep.h> #include <mruby/debug.h> +#include <string.h> #ifndef MRB_NO_FLOAT #include <mruby/endian.h> @@ -158,11 +158,31 @@ mrb_word_boxing_float_value(mrb_state *mrb, mrb_float f) { union mrb_value_ v; +#ifndef MRB_USE_FLOAT_FULL_PRECISION +#if defined(MRB_64BIT) && defined(MRB_USE_FLOAT32) + v.w = 0; +#endif + v.f = f; + v.w = (v.w & ~3) | 2; +#else v.p = mrb_obj_alloc(mrb, MRB_TT_FLOAT, mrb->float_class); v.fp->f = f; MRB_SET_FROZEN_FLAG(v.bp); +#endif return v.value; } + + +#ifndef MRB_USE_FLOAT_FULL_PRECISION +MRB_API mrb_float +mrb_word_boxing_value_float(mrb_value v) +{ + union mrb_value_ u; + u.value = v; + u.w = u.w & ~3; + return u.f; +} +#endif #endif /* MRB_NO_FLOAT */ MRB_API mrb_value diff --git a/src/load.c b/src/load.c index 83e06f1f8..b5b069fcf 100644 --- a/src/load.c +++ b/src/load.c @@ -4,8 +4,7 @@ ** See Copyright Notice in mruby.h */ -#include <string.h> -#include <math.h> +#include <mruby.h> #include <mruby/dump.h> #include <mruby/irep.h> #include <mruby/proc.h> @@ -14,6 +13,7 @@ #include <mruby/error.h> #include <mruby/data.h> #include <mruby/endian.h> +#include <string.h> #if SIZE_MAX < UINT32_MAX # error size_t must be at least 32 bits wide diff --git a/src/numeric.c b/src/numeric.c index 5fbf9c586..1a006b7e3 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -4,17 +4,13 @@ ** See Copyright Notice in mruby.h */ -#ifndef MRB_NO_FLOAT -#include <math.h> -#endif -#include <string.h> - #include <mruby.h> #include <mruby/array.h> #include <mruby/numeric.h> #include <mruby/string.h> #include <mruby/class.h> #include <mruby/presym.h> +#include <string.h> #ifndef MRB_NO_FLOAT #ifdef MRB_USE_FLOAT32 @@ -982,6 +978,15 @@ flo_nan_p(mrb_state *mrb, mrb_value num) { return mrb_bool_value(isnan(mrb_float(num))); } + +static mrb_value +flo_abs(mrb_state *mrb, mrb_value num) +{ + mrb_float f = mrb_float(num); + + if (signbit(f)) return mrb_float_value(mrb, -f); + return num; +} #endif /* @@ -1914,6 +1919,7 @@ mrb_init_numeric(mrb_state *mrb) mrb_define_method(mrb, fl, "to_s", flo_to_s, MRB_ARGS_NONE()); /* 15.2.9.3.16(x) */ mrb_define_method(mrb, fl, "inspect", flo_to_s, MRB_ARGS_NONE()); mrb_define_method(mrb, fl, "nan?", flo_nan_p, MRB_ARGS_NONE()); + mrb_define_method(mrb, fl, "abs", flo_abs, MRB_ARGS_NONE()); /* 15.2.7.4.3 */ #ifdef INFINITY mrb_define_const_id(mrb, fl, MRB_SYM(INFINITY), mrb_float_value(mrb, INFINITY)); diff --git a/src/string.c b/src/string.c index 97e115a19..30d1bcab3 100644 --- a/src/string.c +++ b/src/string.c @@ -15,9 +15,6 @@ #include <mruby/string.h> #include <mruby/numeric.h> #include <mruby/presym.h> -#ifndef MRB_NO_FLOAT -#include <math.h> -#endif #include <string.h> typedef struct mrb_shared_string { diff --git a/src/symbol.c b/src/symbol.c index 9d68b5cf3..dbdeca459 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -73,7 +73,11 @@ static const char pack_table[] = "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRS static mrb_sym sym_inline_pack(const char *name, size_t len) { +#if defined(MRB_WORD_BOXING) && defined(MRB_32BIT) && !defined(MRB_USE_FLOAT_FULL_PRECISION) + const size_t pack_length_max = 4; +#else const size_t pack_length_max = 5; +#endif char c; const char *p; @@ -20,9 +20,6 @@ #include <mruby/throw.h> #include <mruby/dump.h> #include <mruby/presym.h> -#ifndef MRB_NO_FLOAT -#include <math.h> -#endif #ifdef MRB_NO_STDIO #if defined(__cplusplus) |
