mbed I/F binding for mruby

Dependents:   mruby_mbed_web mirb_mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers boxing_word.h Source File

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