summaryrefslogtreecommitdiff
path: root/numeric.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2021-10-26 23:39:43 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2021-10-27 02:05:06 +0900
commite3a783b14191fef175c9a59996afdc744c8edc4c (patch)
tree33e1fa96535433dc67e7b8fac63c738e32e88b0c /numeric.c
parentafdca0e780760e008e26f4c9fc7262a0a4fe56bb (diff)
downloadruby-e3a783b14191fef175c9a59996afdc744c8edc4c.tar.gz
Align `RFloat` at VALUE boundary
Diffstat (limited to 'numeric.c')
-rw-r--r--numeric.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/numeric.c b/numeric.c
index e12bcce5b8..3ee98343a7 100644
--- a/numeric.c
+++ b/numeric.c
@@ -951,10 +951,14 @@ rb_float_new_in_heap(double d)
{
NEWOBJ_OF(flt, struct RFloat, rb_cFloat, T_FLOAT | (RGENGC_WB_PROTECTED_FLOAT ? FL_WB_PROTECTED : 0));
-#if UNALIGNED_DOUBLE_ACCESS
+#if SIZEOF_DOUBLE < SIZEOF_VALUE
flt->float_value = d;
#else
- memcpy(&flt->float_value, &d, sizeof(double));
+ union {
+ double d;
+ rb_float_value_type v;
+ } u = {d};
+ flt->float_value = u.v;
#endif
OBJ_FREEZE((VALUE)flt);
return (VALUE)flt;