diff options
| author | KOBAYASHI Shuji <[email protected]> | 2019-09-07 21:38:11 +0900 |
|---|---|---|
| committer | KOBAYASHI Shuji <[email protected]> | 2019-09-07 21:38:11 +0900 |
| commit | 17c53040abc93c22158515b976524757a2cb68f1 (patch) | |
| tree | afa39d50b8c7da22975ccda6e53e59cb4c656cc9 /include | |
| parent | bb7eccc9c4e38bf247eb90e55f4f88e2a4af1762 (diff) | |
| download | mruby-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.
Diffstat (limited to 'include')
| -rw-r--r-- | include/mruby/boxing_word.h | 32 |
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; |
