source: EcnlProtoTool/trunk/mruby-2.1.1/include/mruby/boxing_word.h@ 439

Last change on this file since 439 was 439, checked in by coas-nagasima, 4 years ago

mrubyを2.1.1に更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-chdr;charset=UTF-8
File size: 5.6 KB
Line 
1/**
2** @file mruby/boxing_word.h - word boxing mrb_value definition
3**
4** See Copyright Notice in mruby.h
5*/
6
7#ifndef MRUBY_BOXING_WORD_H
8#define MRUBY_BOXING_WORD_H
9
10#if defined(MRB_INT64) && !defined(MRB_64BIT)
11#error MRB_INT64 cannot be used with MRB_WORD_BOXING in 32-bit mode.
12#endif
13
14#ifndef MRB_WITHOUT_FLOAT
15struct RFloat {
16 MRB_OBJECT_HEADER;
17 mrb_float f;
18};
19#endif
20
21struct RCptr {
22 MRB_OBJECT_HEADER;
23 void *p;
24};
25
26enum mrb_special_consts {
27 MRB_Qnil = 0,
28 MRB_Qfalse = 4,
29 MRB_Qtrue = 12,
30 MRB_Qundef = 20,
31};
32
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
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 */
74typedef union mrb_value {
75 union {
76 void *p;
77#ifdef MRB_64BIT
78 /* use struct to avoid bit shift. */
79 struct {
80 MRB_ENDIAN_LOHI(
81 mrb_sym sym;
82 ,uint32_t sym_flag;
83 )
84 };
85#endif
86 struct RBasic *bp;
87#ifndef MRB_WITHOUT_FLOAT
88 struct RFloat *fp;
89#endif
90 struct RCptr *vp;
91 } value;
92 unsigned long w;
93} mrb_value;
94
95MRB_API mrb_value mrb_word_boxing_cptr_value(struct mrb_state*, void*);
96#ifndef MRB_WITHOUT_FLOAT
97MRB_API mrb_value mrb_word_boxing_float_value(struct mrb_state*, mrb_float);
98MRB_API mrb_value mrb_word_boxing_float_pool(struct mrb_state*, mrb_float);
99#endif
100
101#ifndef MRB_WITHOUT_FLOAT
102#define mrb_float_pool(mrb,f) mrb_word_boxing_float_pool(mrb,f)
103#endif
104
105#define mrb_ptr(o) (o).value.p
106#define mrb_cptr(o) (o).value.vp->p
107#ifndef MRB_WITHOUT_FLOAT
108#define mrb_float(o) (o).value.fp->f
109#endif
110#define mrb_fixnum(o) BOXWORD_SHIFT_VALUE(o, FIXNUM, mrb_int)
111#ifdef MRB_64BIT
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)
117
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
170mrb_type(mrb_value o)
171{
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;
178}
179
180#endif /* MRUBY_BOXING_WORD_H */
Note: See TracBrowser for help on using the repository browser.