boxing_word.h: use memcpy-based RFloat access for unaligned 32-bit

On 32-bit with MRB_WORDBOX_NO_FLOAT_TRUNCATE, RFloat stores a double
(8-byte alignment) but GC heap slots only guarantee 4-byte alignment.
Use char array + memcpy accessors to avoid misaligned access (SIGBUS
on MIPS, undefined behavior per C standard).

Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
Yukihiro "Matz" Matsumoto
2026-02-27 10:08:37 +09:00
parent eaaa66b39b
commit 32f99a622d
3 changed files with 36 additions and 7 deletions
+1 -1
View File
@@ -3997,7 +3997,7 @@ init_copy(mrb_state *mrb, mrb_value dest, mrb_value obj)
case MRB_TT_FLOAT:
{
struct RFloat *f = (struct RFloat*)mrb_obj_ptr(dest);
f->f = mrb_float(obj);
mrb_rfloat_set(f, mrb_float(obj));
}
break;
#endif
+5 -5
View File
@@ -288,7 +288,7 @@ mrb_word_boxing_float_value(mrb_state *mrb, mrb_float f)
#ifdef MRB_WORDBOX_NO_FLOAT_TRUNCATE
v.p = mrb_obj_alloc(mrb, MRB_TT_FLOAT, mrb->float_class);
v.fp->f = f;
mrb_rfloat_set(v.fp, f);
v.bp->frozen = 1;
#elif defined(MRB_64BIT) && defined(MRB_USE_FLOAT32)
v.w = 0;
@@ -323,7 +323,7 @@ mrb_word_boxing_float_value(mrb_state *mrb, mrb_float f)
else {
float_heap:
v.p = mrb_obj_alloc(mrb, MRB_TT_FLOAT, mrb->float_class);
v.fp->f = f;
mrb_rfloat_set(v.fp, f);
v.bp->frozen = 1;
}
}
@@ -357,7 +357,7 @@ mrb_word_boxing_float_value(mrb_state *mrb, mrb_float f)
else {
float_heap:
v.p = mrb_obj_alloc(mrb, MRB_TT_FLOAT, mrb->float_class);
v.fp->f = f;
mrb_rfloat_set(v.fp, f);
v.bp->frozen = 1;
}
}
@@ -399,7 +399,7 @@ mrb_word_boxing_value_float(mrb_value v)
else {
union mrb_value_ u;
u.value = v;
return u.fp->f;
return mrb_rfloat_value(u.fp);
}
#else
/* 32-bit + float32: rotation decoding */
@@ -420,7 +420,7 @@ mrb_word_boxing_value_float(mrb_value v)
else {
union mrb_value_ u;
u.value = v;
return u.fp->f;
return mrb_rfloat_value(u.fp);
}
#endif
}