summaryrefslogtreecommitdiffhomepage
path: root/include
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2021-01-12 16:26:05 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2021-01-12 16:26:05 +0900
commitb64ec814d6d5d663e7a88a36161f92431616fe62 (patch)
treecc25c4c9d80b7b75a9f96071585a507372f5bbe7 /include
parent1310368b3f78e9304b7231eb1d6408842340c6cf (diff)
downloadmruby-b64ec814d6d5d663e7a88a36161f92431616fe62.tar.gz
mruby-b64ec814d6d5d663e7a88a36161f92431616fe62.zip
Fix a signed shift bug on 32 bit platforms; ref e1c9e7e
Diffstat (limited to 'include')
-rw-r--r--include/mruby/boxing_word.h6
1 files changed, 2 insertions, 4 deletions
diff --git a/include/mruby/boxing_word.h b/include/mruby/boxing_word.h
index 9e01de4ed..86a04368f 100644
--- a/include/mruby/boxing_word.h
+++ b/include/mruby/boxing_word.h
@@ -55,8 +55,6 @@ enum mrb_special_consts {
#define BOXWORD_SYMBOL_MASK ((1 << BOXWORD_SYMBOL_BIT_POS) - 1)
#define BOXWORD_IMMEDIATE_MASK 0x07
-#define BOXWORD_SHIFT_VALUE(o,n,t) \
- (t)(((intptr_t)(o).w) >> BOXWORD_##n##_SHIFT)
#define BOXWORD_SET_SHIFT_VALUE(o,n,v) \
((o).w = (((uintptr_t)(v)) << BOXWORD_##n##_SHIFT) | BOXWORD_##n##_FLAG)
#define BOXWORD_SHIFT_VALUE_P(o,n) \
@@ -123,7 +121,7 @@ MRB_API mrb_value mrb_word_boxing_int_value(struct mrb_state*, mrb_int);
#ifndef MRB_NO_FLOAT
#define mrb_float(o) mrb_val_union(o).fp->f
#endif
-#define mrb_fixnum(o) BOXWORD_SHIFT_VALUE(o, FIXNUM, mrb_int)
+#define mrb_fixnum(o) (mrb_int)(((intptr_t)(o).w) >> BOXWORD_FIXNUM_SHIFT)
MRB_INLINE mrb_int
mrb_integer_func(mrb_value o) {
if (mrb_immediate_p(o)) return mrb_fixnum(o);
@@ -133,7 +131,7 @@ mrb_integer_func(mrb_value o) {
#ifdef MRB_64BIT
#define mrb_symbol(o) mrb_val_union(o).sym
#else
-#define mrb_symbol(o) BOXWORD_SHIFT_VALUE(o, SYMBOL, mrb_sym)
+#define mrb_symbol(o) (mrb_sym)(((o).w) >> BOXWORD_SYMBOL_SHIFT)
#endif
#define mrb_bool(o) (((o).w & ~(uintptr_t)MRB_Qfalse) != 0)