From 9ac386923d6a2dc62b5ec61fa8bcbc2f1f551be9 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 27 Nov 2013 17:29:28 +0900 Subject: float objects in pool are objects when MRB_WORD_BOXING is set --- src/codegen.c | 4 ++++ src/etc.c | 10 ++++++++++ src/load.c | 2 +- src/state.c | 5 +++++ 4 files changed, 20 insertions(+), 1 deletion(-) (limited to 'src') 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 @@ -198,6 +198,16 @@ mrb_float_value(mrb_state *mrb, mrb_float f) return v; } +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) { 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); -- cgit v1.2.3