summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--internal/numeric.h5
-rw-r--r--io_buffer.c5
-rw-r--r--numeric.c5
3 files changed, 9 insertions, 6 deletions
diff --git a/internal/numeric.h b/internal/numeric.h
index 75181a7f16..d3905f048c 100644
--- a/internal/numeric.h
+++ b/internal/numeric.h
@@ -164,6 +164,11 @@ union rb_int128 {
};
typedef union rb_int128 rb_int128_t;
+union uint128_int128_conversion {
+ rb_uint128_t uint128;
+ rb_int128_t int128;
+};
+
// Conversion functions for 128-bit integers:
rb_uint128_t rb_numeric_to_uint128(VALUE x);
rb_int128_t rb_numeric_to_int128(VALUE x);
diff --git a/io_buffer.c b/io_buffer.c
index b81527ff71..55f1933194 100644
--- a/io_buffer.c
+++ b/io_buffer.c
@@ -1928,11 +1928,6 @@ ruby_swap128_uint(rb_uint128_t x)
return result;
}
-union uint128_int128_conversion {
- rb_uint128_t uint128;
- rb_int128_t int128;
-};
-
static inline rb_int128_t
ruby_swap128_int(rb_int128_t x)
{
diff --git a/numeric.c b/numeric.c
index d9e837644f..1942a6164f 100644
--- a/numeric.c
+++ b/numeric.c
@@ -3638,7 +3638,10 @@ rb_int128_to_numeric(rb_int128_t n)
}
else {
// Positive value
- return rb_uint128_to_numeric(*(rb_uint128_t*)&n);
+ union uint128_int128_conversion conversion = {
+ .int128 = n
+ };
+ return rb_uint128_to_numeric(conversion.uint128);
}
#endif
}