float objects in pool are objects when MRB_WORD_BOXING is set

This commit is contained in:
Yukihiro "Matz" Matsumoto
2013-11-27 17:29:28 +09:00
parent e9e1259b61
commit 9ac386923d
5 changed files with 24 additions and 3 deletions
+4 -2
View File
@@ -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 */
+4
View File
@@ -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;
+10
View File
@@ -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)
{
+1 -1
View File
@@ -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:
+5
View File
@@ -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);