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 --- include/mruby/value.h | 6 ++++-- src/codegen.c | 4 ++++ src/etc.c | 10 ++++++++++ src/load.c | 2 +- src/state.c | 5 +++++ 5 files changed, 24 insertions(+), 3 deletions(-) diff --git a/include/mruby/value.h b/include/mruby/value.h index f666de9dd..cc0440bbc 100644 --- a/include/mruby/value.h +++ b/include/mruby/value.h @@ -183,6 +183,7 @@ mrb_float_value(struct mrb_state *mrb, mrb_float f) } return v; } +#define mrb_float_pool(mrb,f) mrb_float_value(mrb,f) #else @@ -264,8 +265,8 @@ typedef union mrb_value { }\ } while (0) -extern mrb_value -mrb_float_value(struct mrb_state *mrb, mrb_float f); +mrb_value mrb_float_value(struct mrb_state *mrb, mrb_float f); +mrb_value mrb_float_pool(struct mrb_state *mrb, mrb_float f); #else /* No MRB_xxx_BOXING */ @@ -299,6 +300,7 @@ mrb_float_value(struct mrb_state *mrb, mrb_float f) MRB_SET_VALUE(v, MRB_TT_FLOAT, value.f, f); return v; } +#define mrb_float_pool(mrb,f) mrb_float_value(mrb,f) #endif /* no boxing */ 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