mbed I/F binding for mruby
Dependents: mruby_mbed_web mirb_mbed
boxing_word.h
00001 /* 00002 ** mruby/boxing_word.h - word boxing mrb_value definition 00003 ** 00004 ** See Copyright Notice in mruby.h 00005 */ 00006 00007 #ifndef MRUBY_BOXING_WORD_H 00008 #define MRUBY_BOXING_WORD_H 00009 00010 #if defined(MRB_INT16) 00011 # error MRB_INT16 is too small for MRB_WORD_BOXING. 00012 #endif 00013 00014 struct RFloat { 00015 MRB_OBJECT_HEADER; 00016 mrb_float f; 00017 }; 00018 00019 struct RCptr { 00020 MRB_OBJECT_HEADER; 00021 void *p; 00022 }; 00023 00024 #define MRB_FIXNUM_SHIFT 1 00025 #define MRB_TT_HAS_BASIC MRB_TT_FLOAT 00026 00027 enum mrb_special_consts { 00028 MRB_Qnil = 0, 00029 MRB_Qfalse = 2, 00030 MRB_Qtrue = 4, 00031 MRB_Qundef = 6, 00032 }; 00033 00034 #define MRB_FIXNUM_FLAG 0x01 00035 #define MRB_SYMBOL_FLAG 0x0e 00036 #define MRB_SPECIAL_SHIFT 8 00037 00038 typedef union mrb_value { 00039 union { 00040 void *p; 00041 struct { 00042 unsigned int i_flag : MRB_FIXNUM_SHIFT; 00043 mrb_int i : (MRB_INT_BIT - MRB_FIXNUM_SHIFT); 00044 }; 00045 struct { 00046 unsigned int sym_flag : MRB_SPECIAL_SHIFT; 00047 mrb_sym sym : (sizeof(mrb_sym) * CHAR_BIT); 00048 }; 00049 struct RBasic *bp; 00050 struct RFloat *fp; 00051 struct RCptr *vp; 00052 } value; 00053 unsigned long w; 00054 } mrb_value; 00055 00056 MRB_API mrb_value mrb_word_boxing_cptr_value(struct mrb_state*, void*); 00057 MRB_API mrb_value mrb_word_boxing_float_value(struct mrb_state*, mrb_float); 00058 MRB_API mrb_value mrb_word_boxing_float_pool(struct mrb_state*, mrb_float); 00059 00060 #define mrb_float_pool(mrb,f) mrb_word_boxing_float_pool(mrb,f) 00061 00062 #define mrb_ptr(o) (o).value.p 00063 #define mrb_cptr(o) (o).value.vp->p 00064 #define mrb_float(o) (o).value.fp->f 00065 #define mrb_fixnum(o) (o).value.i 00066 #define mrb_symbol(o) (o).value.sym 00067 00068 static inline enum mrb_vtype 00069 mrb_type(mrb_value o) 00070 { 00071 switch (o.w) { 00072 case MRB_Qfalse: 00073 case MRB_Qnil: 00074 return MRB_TT_FALSE; 00075 case MRB_Qtrue: 00076 return MRB_TT_TRUE; 00077 case MRB_Qundef: 00078 return MRB_TT_UNDEF; 00079 } 00080 if (o.value.i_flag == MRB_FIXNUM_FLAG) { 00081 return MRB_TT_FIXNUM; 00082 } 00083 if (o.value.sym_flag == MRB_SYMBOL_FLAG) { 00084 return MRB_TT_SYMBOL; 00085 } 00086 return o.value.bp->tt; 00087 } 00088 00089 #define mrb_bool(o) ((o).w != MRB_Qnil && (o).w != MRB_Qfalse) 00090 #define mrb_fixnum_p(o) ((o).value.i_flag == MRB_FIXNUM_FLAG) 00091 #define mrb_undef_p(o) ((o).w == MRB_Qundef) 00092 #define mrb_nil_p(o) ((o).w == MRB_Qnil) 00093 00094 #define BOXWORD_SET_VALUE(o, ttt, attr, v) do {\ 00095 (o).w = 0;\ 00096 (o).attr = (v);\ 00097 switch (ttt) {\ 00098 case MRB_TT_FALSE: (o).w = (v) ? MRB_Qfalse : MRB_Qnil; break;\ 00099 case MRB_TT_TRUE: (o).w = MRB_Qtrue; break;\ 00100 case MRB_TT_UNDEF: (o).w = MRB_Qundef; break;\ 00101 case MRB_TT_FIXNUM: (o).value.i_flag = MRB_FIXNUM_FLAG; break;\ 00102 case MRB_TT_SYMBOL: (o).value.sym_flag = MRB_SYMBOL_FLAG; break;\ 00103 default: if ((o).value.bp) (o).value.bp->tt = ttt; break;\ 00104 }\ 00105 } while (0) 00106 00107 #define SET_FLOAT_VALUE(mrb,r,v) r = mrb_word_boxing_float_value(mrb, v) 00108 #define SET_CPTR_VALUE(mrb,r,v) r = mrb_word_boxing_cptr_value(mrb, v) 00109 #define SET_NIL_VALUE(r) BOXWORD_SET_VALUE(r, MRB_TT_FALSE, value.i, 0) 00110 #define SET_FALSE_VALUE(r) BOXWORD_SET_VALUE(r, MRB_TT_FALSE, value.i, 1) 00111 #define SET_TRUE_VALUE(r) BOXWORD_SET_VALUE(r, MRB_TT_TRUE, value.i, 1) 00112 #define SET_BOOL_VALUE(r,b) BOXWORD_SET_VALUE(r, b ? MRB_TT_TRUE : MRB_TT_FALSE, value.i, 1) 00113 #define SET_INT_VALUE(r,n) BOXWORD_SET_VALUE(r, MRB_TT_FIXNUM, value.i, (n)) 00114 #define SET_SYM_VALUE(r,v) BOXWORD_SET_VALUE(r, MRB_TT_SYMBOL, value.sym, (v)) 00115 #define SET_OBJ_VALUE(r,v) BOXWORD_SET_VALUE(r, (((struct RObject*)(v))->tt), value.p, (v)) 00116 #define SET_PROC_VALUE(r,v) BOXWORD_SET_VALUE(r, MRB_TT_PROC, value.p, v) 00117 #define SET_UNDEF_VALUE(r) BOXWORD_SET_VALUE(r, MRB_TT_UNDEF, value.i, 0) 00118 00119 #endif /* MRUBY_BOXING_WORD_H */ 00120
Generated on Tue Jul 12 2022 18:00:34 by 1.7.2