Ignore:
Timestamp:
Jul 9, 2020, 8:51:43 AM (4 years ago)
Author:
coas-nagasima
Message:

mrubyを2.1.1に更新

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 definition
     1/**
     2** @file mruby/boxing_word.h - word boxing mrb_value definition
    33**
    44** See Copyright Notice in mruby.h
     
    88#define MRUBY_BOXING_WORD_H
    99
    10 #if defined(MRB_INT16)
    11 # error MRB_INT16 is too small for MRB_WORD_BOXING.
    12 #endif
    13 
    1410#if defined(MRB_INT64) && !defined(MRB_64BIT)
    1511#error MRB_INT64 cannot be used with MRB_WORD_BOXING in 32-bit mode.
    1612#endif
    1713
     14#ifndef MRB_WITHOUT_FLOAT
    1815struct RFloat {
    1916  MRB_OBJECT_HEADER;
    2017  mrb_float f;
    2118};
     19#endif
    2220
    2321struct RCptr {
     
    2624};
    2725
    28 #define MRB_FIXNUM_SHIFT 1
    29 #define MRB_TT_HAS_BASIC MRB_TT_FLOAT
    30 
    3126enum 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,
    3631};
    3732
    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
    4139
     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 */
    4274typedef union mrb_value {
    4375  union {
    4476    void *p;
     77#ifdef MRB_64BIT
     78    /* use struct to avoid bit shift. */
    4579    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      )
    4884    };
    49     struct {
    50       unsigned int sym_flag : MRB_SPECIAL_SHIFT;
    51       mrb_sym sym : (sizeof(mrb_sym) * CHAR_BIT);
    52     };
     85#endif
    5386    struct RBasic *bp;
     87#ifndef MRB_WITHOUT_FLOAT
    5488    struct RFloat *fp;
     89#endif
    5590    struct RCptr *vp;
    5691  } value;
     
    5994
    6095MRB_API mrb_value mrb_word_boxing_cptr_value(struct mrb_state*, void*);
     96#ifndef MRB_WITHOUT_FLOAT
    6197MRB_API mrb_value mrb_word_boxing_float_value(struct mrb_state*, mrb_float);
    6298MRB_API mrb_value mrb_word_boxing_float_pool(struct mrb_state*, mrb_float);
     99#endif
    63100
     101#ifndef MRB_WITHOUT_FLOAT
    64102#define mrb_float_pool(mrb,f) mrb_word_boxing_float_pool(mrb,f)
     103#endif
    65104
    66105#define mrb_ptr(o)     (o).value.p
    67106#define mrb_cptr(o)    (o).value.vp->p
     107#ifndef MRB_WITHOUT_FLOAT
    68108#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
    70112#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)
    71117
    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
     169MRB_INLINE enum mrb_vtype
    73170mrb_type(mrb_value o)
    74171{
    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;
    91178}
    92179
    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 
    120180#endif  /* MRUBY_BOXING_WORD_H */
Note: See TracChangeset for help on using the changeset viewer.