mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
float objects in pool are objects when MRB_WORD_BOXING is set
This commit is contained in:
@@ -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 */
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user