- Timestamp:
- Jul 9, 2020, 8:51:43 AM (4 years ago)
- Location:
- EcnlProtoTool/trunk/mruby-2.1.1
- Files:
-
- 1 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/mruby-2.1.1/include/mruby/boxing_word.h
r331 r439 1 /* 2 ** mruby/boxing_word.h - word boxing mrb_value definition1 /** 2 ** @file mruby/boxing_word.h - word boxing mrb_value definition 3 3 ** 4 4 ** See Copyright Notice in mruby.h … … 8 8 #define MRUBY_BOXING_WORD_H 9 9 10 #if defined(MRB_INT16)11 # error MRB_INT16 is too small for MRB_WORD_BOXING.12 #endif13 14 10 #if defined(MRB_INT64) && !defined(MRB_64BIT) 15 11 #error MRB_INT64 cannot be used with MRB_WORD_BOXING in 32-bit mode. 16 12 #endif 17 13 14 #ifndef MRB_WITHOUT_FLOAT 18 15 struct RFloat { 19 16 MRB_OBJECT_HEADER; 20 17 mrb_float f; 21 18 }; 19 #endif 22 20 23 21 struct RCptr { … … 26 24 }; 27 25 28 #define MRB_FIXNUM_SHIFT 129 #define MRB_TT_HAS_BASIC MRB_TT_FLOAT30 31 26 enum mrb_special_consts { 32 MRB_Qnil = 0,33 MRB_Qfalse = 2,34 MRB_Qtrue = 4,35 MRB_Qundef = 6,27 MRB_Qnil = 0, 28 MRB_Qfalse = 4, 29 MRB_Qtrue = 12, 30 MRB_Qundef = 20, 36 31 }; 37 32 38 #define MRB_FIXNUM_FLAG 0x01 39 #define MRB_SYMBOL_FLAG 0x0e 40 #define MRB_SPECIAL_SHIFT 8 33 #if defined(MRB_64BIT) && defined(MRB_INT32) 34 #define MRB_FIXNUM_SHIFT 0 35 #else 36 #define MRB_FIXNUM_SHIFT BOXWORD_FIXNUM_SHIFT 37 #endif 38 #define MRB_SYMBOL_SHIFT BOXWORD_SYMBOL_SHIFT 41 39 40 #define BOXWORD_FIXNUM_BIT_POS 1 41 #define BOXWORD_SYMBOL_BIT_POS 2 42 #define BOXWORD_FIXNUM_SHIFT BOXWORD_FIXNUM_BIT_POS 43 #ifdef MRB_64BIT 44 #define BOXWORD_SYMBOL_SHIFT 0 45 #else 46 #define BOXWORD_SYMBOL_SHIFT BOXWORD_SYMBOL_BIT_POS 47 #endif 48 #define BOXWORD_FIXNUM_FLAG (1 << (BOXWORD_FIXNUM_BIT_POS - 1)) 49 #define BOXWORD_SYMBOL_FLAG (1 << (BOXWORD_SYMBOL_BIT_POS - 1)) 50 #define BOXWORD_FIXNUM_MASK ((1 << BOXWORD_FIXNUM_BIT_POS) - 1) 51 #define BOXWORD_SYMBOL_MASK ((1 << BOXWORD_SYMBOL_BIT_POS) - 1) 52 #define BOXWORD_IMMEDIATE_MASK 0x07 53 54 #define BOXWORD_SHIFT_VALUE(o,n,t) \ 55 (t)(((long)(o).w) >> BOXWORD_##n##_SHIFT) 56 #define BOXWORD_SET_SHIFT_VALUE(o,n,v) \ 57 ((o).w = (((unsigned long)(v)) << BOXWORD_##n##_SHIFT) | BOXWORD_##n##_FLAG) 58 #define BOXWORD_SHIFT_VALUE_P(o,n) \ 59 (((o).w & BOXWORD_##n##_MASK) == BOXWORD_##n##_FLAG) 60 #define BOXWORD_OBJ_TYPE_P(o,n) \ 61 (!mrb_immediate_p(o) && (o).value.bp->tt == MRB_TT_##n) 62 63 /* 64 * mrb_value representation: 65 * 66 * nil : ...0000 0000 (all bits are 0) 67 * false : ...0000 0100 (mrb_fixnum(v) != 0) 68 * true : ...0000 1100 69 * undef : ...0001 0100 70 * fixnum: ...IIII III1 71 * symbol: ...SSSS SS10 (use only upper 32-bit as symbol value on 64-bit CPU) 72 * object: ...PPPP P000 (any bits are 1) 73 */ 42 74 typedef union mrb_value { 43 75 union { 44 76 void *p; 77 #ifdef MRB_64BIT 78 /* use struct to avoid bit shift. */ 45 79 struct { 46 unsigned int i_flag : MRB_FIXNUM_SHIFT; 47 mrb_int i : (MRB_INT_BIT - MRB_FIXNUM_SHIFT); 80 MRB_ENDIAN_LOHI( 81 mrb_sym sym; 82 ,uint32_t sym_flag; 83 ) 48 84 }; 49 struct { 50 unsigned int sym_flag : MRB_SPECIAL_SHIFT; 51 mrb_sym sym : (sizeof(mrb_sym) * CHAR_BIT); 52 }; 85 #endif 53 86 struct RBasic *bp; 87 #ifndef MRB_WITHOUT_FLOAT 54 88 struct RFloat *fp; 89 #endif 55 90 struct RCptr *vp; 56 91 } value; … … 59 94 60 95 MRB_API mrb_value mrb_word_boxing_cptr_value(struct mrb_state*, void*); 96 #ifndef MRB_WITHOUT_FLOAT 61 97 MRB_API mrb_value mrb_word_boxing_float_value(struct mrb_state*, mrb_float); 62 98 MRB_API mrb_value mrb_word_boxing_float_pool(struct mrb_state*, mrb_float); 99 #endif 63 100 101 #ifndef MRB_WITHOUT_FLOAT 64 102 #define mrb_float_pool(mrb,f) mrb_word_boxing_float_pool(mrb,f) 103 #endif 65 104 66 105 #define mrb_ptr(o) (o).value.p 67 106 #define mrb_cptr(o) (o).value.vp->p 107 #ifndef MRB_WITHOUT_FLOAT 68 108 #define mrb_float(o) (o).value.fp->f 69 #define mrb_fixnum(o) ((mrb_int)(o).value.i) 109 #endif 110 #define mrb_fixnum(o) BOXWORD_SHIFT_VALUE(o, FIXNUM, mrb_int) 111 #ifdef MRB_64BIT 70 112 #define mrb_symbol(o) (o).value.sym 113 #else 114 #define mrb_symbol(o) BOXWORD_SHIFT_VALUE(o, SYMBOL, mrb_sym) 115 #endif 116 #define mrb_bool(o) (((o).w & ~(unsigned long)MRB_Qfalse) != 0) 71 117 72 static inline enum mrb_vtype 118 #define mrb_immediate_p(o) ((o).w & BOXWORD_IMMEDIATE_MASK || (o).w == MRB_Qnil) 119 #define mrb_fixnum_p(o) BOXWORD_SHIFT_VALUE_P(o, FIXNUM) 120 #ifdef MRB_64BIT 121 #define mrb_symbol_p(o) ((o).value.sym_flag == BOXWORD_SYMBOL_FLAG) 122 #else 123 #define mrb_symbol_p(o) BOXWORD_SHIFT_VALUE_P(o, SYMBOL) 124 #endif 125 #define mrb_undef_p(o) ((o).w == MRB_Qundef) 126 #define mrb_nil_p(o) ((o).w == MRB_Qnil) 127 #define mrb_false_p(o) ((o).w == MRB_Qfalse) 128 #define mrb_true_p(o) ((o).w == MRB_Qtrue) 129 #ifndef MRB_WITHOUT_FLOAT 130 #define mrb_float_p(o) BOXWORD_OBJ_TYPE_P(o, FLOAT) 131 #endif 132 #define mrb_array_p(o) BOXWORD_OBJ_TYPE_P(o, ARRAY) 133 #define mrb_string_p(o) BOXWORD_OBJ_TYPE_P(o, STRING) 134 #define mrb_hash_p(o) BOXWORD_OBJ_TYPE_P(o, HASH) 135 #define mrb_cptr_p(o) BOXWORD_OBJ_TYPE_P(o, CPTR) 136 #define mrb_exception_p(o) BOXWORD_OBJ_TYPE_P(o, EXCEPTION) 137 #define mrb_free_p(o) BOXWORD_OBJ_TYPE_P(o, FREE) 138 #define mrb_object_p(o) BOXWORD_OBJ_TYPE_P(o, OBJECT) 139 #define mrb_class_p(o) BOXWORD_OBJ_TYPE_P(o, CLASS) 140 #define mrb_module_p(o) BOXWORD_OBJ_TYPE_P(o, MODULE) 141 #define mrb_iclass_p(o) BOXWORD_OBJ_TYPE_P(o, ICLASS) 142 #define mrb_sclass_p(o) BOXWORD_OBJ_TYPE_P(o, SCLASS) 143 #define mrb_proc_p(o) BOXWORD_OBJ_TYPE_P(o, PROC) 144 #define mrb_range_p(o) BOXWORD_OBJ_TYPE_P(o, RANGE) 145 #define mrb_file_p(o) BOXWORD_OBJ_TYPE_P(o, FILE) 146 #define mrb_env_p(o) BOXWORD_OBJ_TYPE_P(o, ENV) 147 #define mrb_data_p(o) BOXWORD_OBJ_TYPE_P(o, DATA) 148 #define mrb_fiber_p(o) BOXWORD_OBJ_TYPE_P(o, FIBER) 149 #define mrb_istruct_p(o) BOXWORD_OBJ_TYPE_P(o, ISTRUCT) 150 #define mrb_break_p(o) BOXWORD_OBJ_TYPE_P(o, BREAK) 151 152 #ifndef MRB_WITHOUT_FLOAT 153 #define SET_FLOAT_VALUE(mrb,r,v) ((r) = mrb_word_boxing_float_value(mrb, v)) 154 #endif 155 #define SET_CPTR_VALUE(mrb,r,v) ((r) = mrb_word_boxing_cptr_value(mrb, v)) 156 #define SET_UNDEF_VALUE(r) ((r).w = MRB_Qundef) 157 #define SET_NIL_VALUE(r) ((r).w = MRB_Qnil) 158 #define SET_FALSE_VALUE(r) ((r).w = MRB_Qfalse) 159 #define SET_TRUE_VALUE(r) ((r).w = MRB_Qtrue) 160 #define SET_BOOL_VALUE(r,b) ((b) ? SET_TRUE_VALUE(r) : SET_FALSE_VALUE(r)) 161 #define SET_INT_VALUE(r,n) BOXWORD_SET_SHIFT_VALUE(r, FIXNUM, n) 162 #ifdef MRB_64BIT 163 #define SET_SYM_VALUE(r,v) ((r).value.sym = v, (r).value.sym_flag = BOXWORD_SYMBOL_FLAG) 164 #else 165 #define SET_SYM_VALUE(r,n) BOXWORD_SET_SHIFT_VALUE(r, SYMBOL, n) 166 #endif 167 #define SET_OBJ_VALUE(r,v) ((r).value.p = v) 168 169 MRB_INLINE enum mrb_vtype 73 170 mrb_type(mrb_value o) 74 171 { 75 switch (o.w) { 76 case MRB_Qfalse: 77 case MRB_Qnil: 78 return MRB_TT_FALSE; 79 case MRB_Qtrue: 80 return MRB_TT_TRUE; 81 case MRB_Qundef: 82 return MRB_TT_UNDEF; 83 } 84 if (o.value.i_flag == MRB_FIXNUM_FLAG) { 85 return MRB_TT_FIXNUM; 86 } 87 if (o.value.sym_flag == MRB_SYMBOL_FLAG) { 88 return MRB_TT_SYMBOL; 89 } 90 return o.value.bp->tt; 172 return !mrb_bool(o) ? MRB_TT_FALSE : 173 mrb_true_p(o) ? MRB_TT_TRUE : 174 mrb_fixnum_p(o) ? MRB_TT_FIXNUM : 175 mrb_symbol_p(o) ? MRB_TT_SYMBOL : 176 mrb_undef_p(o) ? MRB_TT_UNDEF : 177 o.value.bp->tt; 91 178 } 92 179 93 #define mrb_bool(o) ((o).w != MRB_Qnil && (o).w != MRB_Qfalse)94 #define mrb_fixnum_p(o) ((o).value.i_flag == MRB_FIXNUM_FLAG)95 #define mrb_undef_p(o) ((o).w == MRB_Qundef)96 #define mrb_nil_p(o) ((o).w == MRB_Qnil)97 98 #define BOXWORD_SET_VALUE(o, ttt, attr, v) do { \99 switch (ttt) {\100 case MRB_TT_FALSE: (o).w = (v) ? MRB_Qfalse : MRB_Qnil; break;\101 case MRB_TT_TRUE: (o).w = MRB_Qtrue; break;\102 case MRB_TT_UNDEF: (o).w = MRB_Qundef; break;\103 case MRB_TT_FIXNUM: (o).w = 0;(o).value.i_flag = MRB_FIXNUM_FLAG; (o).attr = (v); break;\104 case MRB_TT_SYMBOL: (o).w = 0;(o).value.sym_flag = MRB_SYMBOL_FLAG; (o).attr = (v); break;\105 default: (o).w = 0; (o).attr = (v); if ((o).value.bp) (o).value.bp->tt = ttt; break;\106 }\107 } while (0)108 109 #define SET_FLOAT_VALUE(mrb,r,v) r = mrb_word_boxing_float_value(mrb, v)110 #define SET_CPTR_VALUE(mrb,r,v) r = mrb_word_boxing_cptr_value(mrb, v)111 #define SET_NIL_VALUE(r) BOXWORD_SET_VALUE(r, MRB_TT_FALSE, value.i, 0)112 #define SET_FALSE_VALUE(r) BOXWORD_SET_VALUE(r, MRB_TT_FALSE, value.i, 1)113 #define SET_TRUE_VALUE(r) BOXWORD_SET_VALUE(r, MRB_TT_TRUE, value.i, 1)114 #define SET_BOOL_VALUE(r,b) BOXWORD_SET_VALUE(r, b ? MRB_TT_TRUE : MRB_TT_FALSE, value.i, 1)115 #define SET_INT_VALUE(r,n) BOXWORD_SET_VALUE(r, MRB_TT_FIXNUM, value.i, (n))116 #define SET_SYM_VALUE(r,v) BOXWORD_SET_VALUE(r, MRB_TT_SYMBOL, value.sym, (v))117 #define SET_OBJ_VALUE(r,v) BOXWORD_SET_VALUE(r, (((struct RObject*)(v))->tt), value.p, (v))118 #define SET_UNDEF_VALUE(r) BOXWORD_SET_VALUE(r, MRB_TT_UNDEF, value.i, 0)119 120 180 #endif /* MRUBY_BOXING_WORD_H */
Note:
See TracChangeset
for help on using the changeset viewer.