diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-11-27 17:29:28 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-11-27 17:29:28 +0900 |
| commit | 9ac386923d6a2dc62b5ec61fa8bcbc2f1f551be9 (patch) | |
| tree | 391196c4f63325b549a42529421e222a78d02f41 /src | |
| parent | e9e1259b61ec869eb64f0c872508957eb7a9d2b8 (diff) | |
| download | mruby-9ac386923d6a2dc62b5ec61fa8bcbc2f1f551be9.tar.gz mruby-9ac386923d6a2dc62b5ec61fa8bcbc2f1f551be9.zip | |
float objects in pool are objects when MRB_WORD_BOXING is set
Diffstat (limited to 'src')
| -rw-r--r-- | src/codegen.c | 4 | ||||
| -rw-r--r-- | src/etc.c | 10 | ||||
| -rw-r--r-- | src/load.c | 2 | ||||
| -rw-r--r-- | src/state.c | 5 |
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; @@ -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); |
