summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorKOBAYASHI Shuji <[email protected]>2019-09-07 21:38:11 +0900
committerKOBAYASHI Shuji <[email protected]>2019-09-07 21:38:11 +0900
commit17c53040abc93c22158515b976524757a2cb68f1 (patch)
treeafa39d50b8c7da22975ccda6e53e59cb4c656cc9
parentbb7eccc9c4e38bf247eb90e55f4f88e2a4af1762 (diff)
downloadmruby-17c53040abc93c22158515b976524757a2cb68f1.tar.gz
mruby-17c53040abc93c22158515b976524757a2cb68f1.zip
Increase symbol bit size on 32-bit mode with `MRB_WORD_BOXING`
This change increases the max length of lower inline symbols to 5 bytes.
-rw-r--r--include/mruby/boxing_word.h32
1 files changed, 21 insertions, 11 deletions
diff --git a/include/mruby/boxing_word.h b/include/mruby/boxing_word.h
index de48278da..acaae91d6 100644
--- a/include/mruby/boxing_word.h
+++ b/include/mruby/boxing_word.h
@@ -27,21 +27,20 @@ struct RCptr {
void *p;
};
-#define MRB_FIXNUM_SHIFT 1
-
enum mrb_special_consts {
- MRB_Qnil = 0,
- MRB_Qfalse = 2,
- MRB_Qtrue = 4,
- MRB_Qundef = 6,
+ MRB_Qnil = 0,
+ MRB_Qfalse = 4,
+ MRB_Qtrue = 12,
+ MRB_Qundef = 20,
};
+#define MRB_FIXNUM_SHIFT 1
+#define MRB_SYMBOL_SHIFT 2
+#define MRB_FIXNUM_FLAG (1 << (MRB_FIXNUM_SHIFT - 1))
+#define MRB_SYMBOL_FLAG (1 << (MRB_SYMBOL_SHIFT - 1))
+#define MRB_FIXNUM_MASK ((1 << MRB_FIXNUM_SHIFT) - 1)
+#define MRB_SYMBOL_MASK ((1 << MRB_SYMBOL_SHIFT) - 1)
#define MRB_IMMEDIATE_MASK 0x07
-#define MRB_FIXNUM_MASK 0x01
-#define MRB_SYMBOL_MASK 0x0f
-#define MRB_FIXNUM_FLAG 0x01
-#define MRB_SYMBOL_FLAG 0x0e
-#define MRB_SYMBOL_SHIFT 8
#ifdef MRB_64BIT
#define MRB_SYMBOL_BITSIZE (sizeof(mrb_sym) * CHAR_BIT)
@@ -58,6 +57,17 @@ enum mrb_special_consts {
#define BOXWORD_SHIFT_VALUE_P(o,n) \
(((o).w & MRB_##n##_MASK) == MRB_##n##_FLAG)
+/*
+ * mrb_value representation:
+ *
+ * nil : ...0000 0000 (all bits are zero)
+ * false : ...0000 0100
+ * true : ...0000 1100
+ * undef : ...0001 0100
+ * fixnum: ...IIII III1
+ * symbol: ...SSSS SS10 (high-order 32-bit are symbol value in 64-bit mode)
+ * object: ...PPPP P000
+ */
typedef union mrb_value {
union {
void *p;