mruby  2.0.1
mruby is the lightweight implementation of the Ruby language
boxing_word.h
Go to the documentation of this file.
1 
7 #ifndef MRUBY_BOXING_WORD_H
8 #define MRUBY_BOXING_WORD_H
9 
10 #if defined(MRB_INT16)
11 # error MRB_INT16 is too small for MRB_WORD_BOXING.
12 #endif
13 
14 #if defined(MRB_INT64) && !defined(MRB_64BIT)
15 #error MRB_INT64 cannot be used with MRB_WORD_BOXING in 32-bit mode.
16 #endif
17 
18 #ifndef MRB_WITHOUT_FLOAT
19 struct RFloat {
20  MRB_OBJECT_HEADER;
21  mrb_float f;
22 };
23 #endif
24 
25 struct RCptr {
26  MRB_OBJECT_HEADER;
27  void *p;
28 };
29 
30 #define MRB_FIXNUM_SHIFT 1
31 #ifdef MRB_WITHOUT_FLOAT
32 #define MRB_TT_HAS_BASIC MRB_TT_CPTR
33 #else
34 #define MRB_TT_HAS_BASIC MRB_TT_FLOAT
35 #endif
36 
37 enum mrb_special_consts {
38  MRB_Qnil = 0,
39  MRB_Qfalse = 2,
40  MRB_Qtrue = 4,
41  MRB_Qundef = 6,
42 };
43 
44 #define MRB_FIXNUM_FLAG 0x01
45 #define MRB_SYMBOL_FLAG 0x0e
46 #define MRB_SPECIAL_SHIFT 8
47 
48 #if defined(MRB_64BIT)
49 #define MRB_SYMBOL_BITSIZE (sizeof(mrb_sym) * CHAR_BIT)
50 #define MRB_SYMBOL_MAX UINT32_MAX
51 #else
52 #define MRB_SYMBOL_BITSIZE (sizeof(mrb_sym) * CHAR_BIT - MRB_SPECIAL_SHIFT)
53 #define MRB_SYMBOL_MAX (UINT32_MAX >> MRB_SPECIAL_SHIFT)
54 #endif
55 
56 typedef union mrb_value {
57  union {
58  void *p;
59  struct {
60  unsigned int i_flag : MRB_FIXNUM_SHIFT;
61  mrb_int i : (MRB_INT_BIT - MRB_FIXNUM_SHIFT);
62  };
63  struct {
64  unsigned int sym_flag : MRB_SPECIAL_SHIFT;
65  mrb_sym sym : MRB_SYMBOL_BITSIZE;
66  };
67  struct RBasic *bp;
68 #ifndef MRB_WITHOUT_FLOAT
69  struct RFloat *fp;
70 #endif
71  struct RCptr *vp;
72  } value;
73  unsigned long w;
74 } mrb_value;
75 
76 MRB_API mrb_value mrb_word_boxing_cptr_value(struct mrb_state*, void*);
77 #ifndef MRB_WITHOUT_FLOAT
78 MRB_API mrb_value mrb_word_boxing_float_value(struct mrb_state*, mrb_float);
79 MRB_API mrb_value mrb_word_boxing_float_pool(struct mrb_state*, mrb_float);
80 #endif
81 
82 #ifndef MRB_WITHOUT_FLOAT
83 #define mrb_float_pool(mrb,f) mrb_word_boxing_float_pool(mrb,f)
84 #endif
85 
86 #define mrb_ptr(o) (o).value.p
87 #define mrb_cptr(o) (o).value.vp->p
88 #ifndef MRB_WITHOUT_FLOAT
89 #define mrb_float(o) (o).value.fp->f
90 #endif
91 #define mrb_fixnum(o) ((mrb_int)(o).value.i)
92 #define mrb_symbol(o) (o).value.sym
93 
94 MRB_INLINE enum mrb_vtype
95 mrb_type(mrb_value o)
96 {
97  switch (o.w) {
98  case MRB_Qfalse:
99  case MRB_Qnil:
100  return MRB_TT_FALSE;
101  case MRB_Qtrue:
102  return MRB_TT_TRUE;
103  case MRB_Qundef:
104  return MRB_TT_UNDEF;
105  }
106  if (o.value.i_flag == MRB_FIXNUM_FLAG) {
107  return MRB_TT_FIXNUM;
108  }
109  if (o.value.sym_flag == MRB_SYMBOL_FLAG) {
110  return MRB_TT_SYMBOL;
111  }
112  return o.value.bp->tt;
113 }
114 
115 #define mrb_bool(o) ((o).w != MRB_Qnil && (o).w != MRB_Qfalse)
116 #define mrb_fixnum_p(o) ((o).value.i_flag == MRB_FIXNUM_FLAG)
117 #define mrb_undef_p(o) ((o).w == MRB_Qundef)
118 #define mrb_nil_p(o) ((o).w == MRB_Qnil)
119 #define mrb_false_p(o) ((o).w == MRB_Qfalse)
120 #define mrb_true_p(o) ((o).w == MRB_Qtrue)
121 
122 #ifndef MRB_WITHOUT_FLOAT
123 #define SET_FLOAT_VALUE(mrb,r,v) ((r) = mrb_word_boxing_float_value(mrb, v))
124 #endif
125 #define SET_CPTR_VALUE(mrb,r,v) ((r) = mrb_word_boxing_cptr_value(mrb, v))
126 #define SET_UNDEF_VALUE(r) ((r).w = MRB_Qundef)
127 #define SET_NIL_VALUE(r) ((r).w = MRB_Qnil)
128 #define SET_FALSE_VALUE(r) ((r).w = MRB_Qfalse)
129 #define SET_TRUE_VALUE(r) ((r).w = MRB_Qtrue)
130 #define SET_BOOL_VALUE(r,b) ((b) ? SET_TRUE_VALUE(r) : SET_FALSE_VALUE(r))
131 #define SET_INT_VALUE(r,n) do { \
132  (r).w = 0; \
133  (r).value.i_flag = MRB_FIXNUM_FLAG; \
134  (r).value.i = (n); \
135 } while (0)
136 #define SET_SYM_VALUE(r,v) do { \
137  (r).w = 0; \
138  (r).value.sym_flag = MRB_SYMBOL_FLAG; \
139  (r).value.sym = (v); \
140 } while (0)
141 #define SET_OBJ_VALUE(r,v) do { \
142  (r).w = 0; \
143  (r).value.p = (v); \
144 } while (0)
145 
146 #endif /* MRUBY_BOXING_WORD_H */
mruby Symbol.
Definition: boxing_word.h:19
Definition: object.h:19
Definition: boxing_word.h:25
#define MRB_API
Declare a public MRuby API function.
Definition: common.h:73
Definition: boxing_nan.h:39
Definition: mruby.h:215
#define MRB_INLINE
Declare a function as always inlined.
Definition: common.h:62