summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2013-11-27 17:29:28 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2013-11-27 17:29:28 +0900
commit9ac386923d6a2dc62b5ec61fa8bcbc2f1f551be9 (patch)
tree391196c4f63325b549a42529421e222a78d02f41
parente9e1259b61ec869eb64f0c872508957eb7a9d2b8 (diff)
downloadmruby-9ac386923d6a2dc62b5ec61fa8bcbc2f1f551be9.tar.gz
mruby-9ac386923d6a2dc62b5ec61fa8bcbc2f1f551be9.zip
float objects in pool are objects when MRB_WORD_BOXING is set
-rw-r--r--include/mruby/value.h6
-rw-r--r--src/codegen.c4
-rw-r--r--src/etc.c10
-rw-r--r--src/load.c2
-rw-r--r--src/state.c5
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
@@ -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);