sabme ua / mruby-mbed

Dependents:   mruby_mbed_web mirb_mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers value.h Source File

value.h

00001 /*
00002 ** mruby/value.h - mruby value definitions
00003 **
00004 ** See Copyright Notice in mruby.h
00005 */
00006 
00007 #ifndef MRUBY_VALUE_H
00008 #define MRUBY_VALUE_H
00009 
00010 typedef uint32_t mrb_sym;
00011 typedef uint8_t mrb_bool;
00012 struct mrb_state;
00013 
00014 #if defined(MRB_INT16) && defined(MRB_INT64)
00015 # error "You can't define MRB_INT16 and MRB_INT64 at the same time."
00016 #endif
00017 
00018 #if defined(MRB_INT64)
00019   typedef int64_t mrb_int;
00020 # define MRB_INT_BIT 64
00021 # define MRB_INT_MIN (INT64_MIN>>MRB_FIXNUM_SHIFT)
00022 # define MRB_INT_MAX (INT64_MAX>>MRB_FIXNUM_SHIFT)
00023 #elif defined(MRB_INT16)
00024   typedef int16_t mrb_int;
00025 # define MRB_INT_BIT 16
00026 # define MRB_INT_MIN (INT16_MIN>>MRB_FIXNUM_SHIFT)
00027 # define MRB_INT_MAX (INT16_MAX>>MRB_FIXNUM_SHIFT)
00028 #else
00029   typedef int32_t mrb_int;
00030 # define MRB_INT_BIT 32
00031 # define MRB_INT_MIN (INT32_MIN>>MRB_FIXNUM_SHIFT)
00032 # define MRB_INT_MAX (INT32_MAX>>MRB_FIXNUM_SHIFT)
00033 #endif
00034 
00035 #ifdef MRB_USE_FLOAT
00036   typedef float mrb_float;
00037 # define mrb_float_to_str(buf, i) sprintf(buf, "%.7e", i)
00038 # define str_to_mrb_float(buf) strtof(buf, NULL)
00039 #else
00040   typedef double mrb_float;
00041 # define mrb_float_to_str(buf, i) sprintf(buf, "%.16e", i)
00042 # define str_to_mrb_float(buf) strtod(buf, NULL)
00043 #endif
00044 
00045 #ifdef _MSC_VER
00046 # ifndef __cplusplus
00047 #  define inline __inline
00048 # endif
00049 # if _MSC_VER < 1900
00050 #  include <stdarg.h>
00051 MRB_API int mrb_msvc_vsnprintf(char *s, size_t n, const char *format, va_list arg);
00052 MRB_API int mrb_msvc_snprintf(char *s, size_t n, const char *format, ...);
00053 #  define vsnprintf(s, n, format, arg) mrb_msvc_vsnprintf(s, n, format, arg)
00054 #  define snprintf(s, n, format, ...) mrb_msvc_snprintf(s, n, format, __VA_ARGS__)
00055 # endif
00056 # if _MSC_VER < 1800
00057 #  include <float.h>
00058 #  define isfinite(n) _finite(n)
00059 #  define isnan _isnan
00060 #  define isinf(n) (!_finite(n) && !_isnan(n))
00061 #  define signbit(n) (_copysign(1.0, (n)) < 0.0)
00062 #  define strtof (float)strtod
00063 static const unsigned int IEEE754_INFINITY_BITS_SINGLE = 0x7F800000;
00064 #  define INFINITY (*(float *)&IEEE754_INFINITY_BITS_SINGLE)
00065 #  define NAN ((float)(INFINITY - INFINITY))
00066 # else
00067 #  include <inttypes.h>
00068 # endif
00069 #else
00070 # include <inttypes.h>
00071 #endif
00072 
00073 enum mrb_vtype {
00074   MRB_TT_FALSE = 0,   /*   0 */
00075   MRB_TT_FREE,        /*   1 */
00076   MRB_TT_TRUE,        /*   2 */
00077   MRB_TT_FIXNUM,      /*   3 */
00078   MRB_TT_SYMBOL,      /*   4 */
00079   MRB_TT_UNDEF,       /*   5 */
00080   MRB_TT_FLOAT,       /*   6 */
00081   MRB_TT_CPTR,        /*   7 */
00082   MRB_TT_OBJECT,      /*   8 */
00083   MRB_TT_CLASS,       /*   9 */
00084   MRB_TT_MODULE,      /*  10 */
00085   MRB_TT_ICLASS,      /*  11 */
00086   MRB_TT_SCLASS,      /*  12 */
00087   MRB_TT_PROC,        /*  13 */
00088   MRB_TT_ARRAY,       /*  14 */
00089   MRB_TT_HASH,        /*  15 */
00090   MRB_TT_STRING,      /*  16 */
00091   MRB_TT_RANGE,       /*  17 */
00092   MRB_TT_EXCEPTION,   /*  18 */
00093   MRB_TT_FILE,        /*  19 */
00094   MRB_TT_ENV,         /*  20 */
00095   MRB_TT_DATA,        /*  21 */
00096   MRB_TT_FIBER,       /*  22 */
00097   MRB_TT_MAXDEFINE    /*  23 */
00098 };
00099 
00100 #include "mruby/object.h"
00101 
00102 #if defined(MRB_NAN_BOXING)
00103 #include "boxing_nan.h"
00104 #elif defined(MRB_WORD_BOXING)
00105 #include "boxing_word.h"
00106 #else
00107 #include "boxing_no.h"
00108 #endif
00109 
00110 #ifndef mrb_fixnum_p
00111 #define mrb_fixnum_p(o) (mrb_type(o) == MRB_TT_FIXNUM)
00112 #endif
00113 #ifndef mrb_undef_p
00114 #define mrb_undef_p(o) (mrb_type(o) == MRB_TT_UNDEF)
00115 #endif
00116 #ifndef mrb_nil_p
00117 #define mrb_nil_p(o)  (mrb_type(o) == MRB_TT_FALSE && !mrb_fixnum(o))
00118 #endif
00119 #ifndef mrb_bool
00120 #define mrb_bool(o)   (mrb_type(o) != MRB_TT_FALSE)
00121 #endif
00122 #define mrb_float_p(o) (mrb_type(o) == MRB_TT_FLOAT)
00123 #define mrb_symbol_p(o) (mrb_type(o) == MRB_TT_SYMBOL)
00124 #define mrb_array_p(o) (mrb_type(o) == MRB_TT_ARRAY)
00125 #define mrb_string_p(o) (mrb_type(o) == MRB_TT_STRING)
00126 #define mrb_hash_p(o) (mrb_type(o) == MRB_TT_HASH)
00127 #define mrb_cptr_p(o) (mrb_type(o) == MRB_TT_CPTR)
00128 #define mrb_exception_p(o) (mrb_type(o) == MRB_TT_EXCEPTION)
00129 #define mrb_test(o)   mrb_bool(o)
00130 MRB_API mrb_bool mrb_regexp_p(struct mrb_state*, mrb_value);
00131 
00132 static inline mrb_value
00133 mrb_float_value(struct mrb_state *mrb, mrb_float f)
00134 {
00135   mrb_value v;
00136   (void) mrb;
00137   SET_FLOAT_VALUE(mrb, v, f);
00138   return v;
00139 }
00140 
00141 static inline mrb_value
00142 mrb_cptr_value(struct mrb_state *mrb, void *p)
00143 {
00144   mrb_value v;
00145   (void) mrb;
00146   SET_CPTR_VALUE(mrb,v,p);
00147   return v;
00148 }
00149 
00150 static inline mrb_value
00151 mrb_fixnum_value(mrb_int i)
00152 {
00153   mrb_value v;
00154   SET_INT_VALUE(v, i);
00155   return v;
00156 }
00157 
00158 static inline mrb_value
00159 mrb_symbol_value(mrb_sym i)
00160 {
00161   mrb_value v;
00162   SET_SYM_VALUE(v, i);
00163   return v;
00164 }
00165 
00166 static inline mrb_value
00167 mrb_obj_value(void *p)
00168 {
00169   mrb_value v;
00170   SET_OBJ_VALUE(v, (struct RBasic*)p);
00171   return v;
00172 }
00173 
00174 static inline mrb_value
00175 mrb_nil_value(void)
00176 {
00177   mrb_value v;
00178   SET_NIL_VALUE(v);
00179   return v;
00180 }
00181 
00182 static inline mrb_value
00183 mrb_false_value(void)
00184 {
00185   mrb_value v;
00186   SET_FALSE_VALUE(v);
00187   return v;
00188 }
00189 
00190 static inline mrb_value
00191 mrb_true_value(void)
00192 {
00193   mrb_value v;
00194   SET_TRUE_VALUE(v);
00195   return v;
00196 }
00197 
00198 static inline mrb_value
00199 mrb_bool_value(mrb_bool boolean)
00200 {
00201   mrb_value v;
00202   SET_BOOL_VALUE(v, boolean);
00203   return v;
00204 }
00205 
00206 static inline mrb_value
00207 mrb_undef_value(void)
00208 {
00209   mrb_value v;
00210   SET_UNDEF_VALUE(v);
00211   return v;
00212 }
00213 
00214 #ifdef MRB_USE_ETEXT_EDATA
00215 extern char _etext[];
00216 #ifdef MRB_NO_INIT_ARRAY_START
00217 extern char _edata[];
00218 
00219 static inline mrb_bool
00220 mrb_ro_data_p(const char *p)
00221 {
00222   return _etext < p && p < _edata;
00223 }
00224 #else
00225 extern char __init_array_start[];
00226 
00227 static inline mrb_bool
00228 mrb_ro_data_p(const char *p)
00229 {
00230   return _etext < p && p < (char*)&__init_array_start;
00231 }
00232 #endif
00233 #else
00234 # define mrb_ro_data_p(p) FALSE
00235 #endif
00236 
00237 #endif  /* MRUBY_VALUE_H */
00238