summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/codegen.c4
-rw-r--r--src/etc.c10
-rw-r--r--src/load.c2
-rw-r--r--src/state.c5
4 files changed, 20 insertions, 1 deletions
diff --git a/src/codegen.c b/src/codegen.c
index 9d55297a7..8c38615a4 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -444,6 +444,10 @@ new_lit(codegen_scope *s, mrb_value val)
break;
case MRB_TT_FLOAT:
+#ifdef MRB_WORD_BOXING
+ *pv = mrb_float_pool(s->mrb, mrb_float(val));
+ break;
+#endif
case MRB_TT_FIXNUM:
*pv = val;
break;
diff --git a/src/etc.c b/src/etc.c
index 70b22cfc4..82394891f 100644
--- a/src/etc.c
+++ b/src/etc.c
@@ -199,6 +199,16 @@ mrb_float_value(mrb_state *mrb, mrb_float f)
}
mrb_value
+mrb_float_pool(mrb_state *mrb, mrb_float f)
+{
+ struct RFloat *nf = (struct RFloat *)mrb_malloc(mrb, sizeof(struct RFloat));
+ nf->tt = MRB_TT_FLOAT;
+ nf->c = mrb->float_class;
+ nf->f = f;
+ return mrb_obj_value(nf);
+}
+
+mrb_value
mrb_cptr_value(mrb_state *mrb, void *p)
{
mrb_value v;
diff --git a/src/load.c b/src/load.c
index be42478a8..c60c393b8 100644
--- a/src/load.c
+++ b/src/load.c
@@ -106,7 +106,7 @@ read_irep_record_1(mrb_state *mrb, const uint8_t *bin, uint32_t *len)
break;
case IREP_TT_FLOAT:
- irep->pool[i] = mrb_float_value(mrb, mrb_str_to_dbl(mrb, s, FALSE));
+ irep->pool[i] = mrb_float_pool(mrb, mrb_str_to_dbl(mrb, s, FALSE));
break;
case IREP_TT_STRING:
diff --git a/src/state.c b/src/state.c
index 00e113998..a8158ab29 100644
--- a/src/state.c
+++ b/src/state.c
@@ -139,6 +139,11 @@ mrb_irep_free(mrb_state *mrb, mrb_irep *irep)
mrb_free(mrb, mrb_str_ptr(irep->pool[i])->ptr);
mrb_free(mrb, mrb_obj_ptr(irep->pool[i]));
}
+#ifdef MRB_WORD_BOXING
+ else if (mrb_type(irep->pool[i]) == MRB_TT_FLOAT) {
+ mrb_free(mrb, mrb_obj_ptr(irep->pool[i]));
+ }
+#endif
}
mrb_free(mrb, irep->pool);
mrb_free(mrb, irep->syms);