summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/dump.c4
-rw-r--r--src/etc.c20
-rw-r--r--src/load.c4
-rw-r--r--src/numeric.c16
-rw-r--r--src/string.c3
-rw-r--r--src/symbol.c4
-rw-r--r--src/vm.c3
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>
diff --git a/src/etc.c b/src/etc.c
index a5c48bbe3..f2dfac9fb 100644
--- a/src/etc.c
+++ b/src/etc.c
@@ -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;
diff --git a/src/vm.c b/src/vm.c
index 57531797c..50ad3b31d 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -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)