summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/etc.c17
-rw-r--r--src/symbol.c4
2 files changed, 21 insertions, 0 deletions
diff --git a/src/etc.c b/src/etc.c
index a5c48bbe3..4d08ba400 100644
--- a/src/etc.c
+++ b/src/etc.c
@@ -158,11 +158,28 @@ mrb_word_boxing_float_value(mrb_state *mrb, mrb_float f)
{
union mrb_value_ v;
+#ifndef MRB_USE_FLOAT_FULL_PRECISION
+ 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/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;