ruby-changes:69459
From: Nobuyoshi <ko1@a...>
Date: Tue, 26 Oct 2021 20:22:47 +0900 (JST)
Subject: [ruby-changes:69459] afdca0e780 (master): Fix unaligned access to `double` in RFloat
https://git.ruby-lang.org/ruby.git/commit/?id=afdca0e780 From afdca0e780760e008e26f4c9fc7262a0a4fe56bb Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada <nobu@r...> Date: Tue, 26 Oct 2021 20:14:19 +0900 Subject: Fix unaligned access to `double` in RFloat --- internal/numeric.h | 12 ++++++++++++ numeric.c | 4 ++++ 2 files changed, 16 insertions(+) diff --git a/internal/numeric.h b/internal/numeric.h index 6bb7baf204a..3d88845a169 100644 --- a/internal/numeric.h +++ b/internal/numeric.h @@ -206,10 +206,22 @@ rb_float_flonum_value(VALUE v) https://github.com/ruby/ruby/blob/trunk/internal/numeric.h#L206 return 0.0; } +#if SIZEOF_VALUE >= SIZEOF_DOUBLE || defined(UNALIGNED_WORD_ACCESS) +# define UNALIGNED_DOUBLE_ACCESS 1 +#else +# define UNALIGNED_DOUBLE_ACCESS 0 +#endif + static inline double rb_float_noflonum_value(VALUE v) { +#if UNALIGNED_DOUBLE_ACCESS return RFLOAT(v)->float_value; +#else + double d; + memcpy(&d, &RFLOAT(v)->float_value, sizeof(double)); + return d; +#endif } static inline double diff --git a/numeric.c b/numeric.c index d2162405204..e12bcce5b8f 100644 --- a/numeric.c +++ b/numeric.c @@ -951,7 +951,11 @@ rb_float_new_in_heap(double d) https://github.com/ruby/ruby/blob/trunk/numeric.c#L951 { NEWOBJ_OF(flt, struct RFloat, rb_cFloat, T_FLOAT | (RGENGC_WB_PROTECTED_FLOAT ? FL_WB_PROTECTED : 0)); +#if UNALIGNED_DOUBLE_ACCESS flt->float_value = d; +#else + memcpy(&flt->float_value, &d, sizeof(double)); +#endif OBJ_FREEZE((VALUE)flt); return (VALUE)flt; } -- cgit v1.2.1 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/