diff options
| author | YAMAMOTO Masaya <[email protected]> | 2017-10-11 17:53:17 +0900 |
|---|---|---|
| committer | YAMAMOTO Masaya <[email protected]> | 2017-10-11 17:58:11 +0900 |
| commit | acdc2d1f242f2547ca842be5d62a2b06356b39ea (patch) | |
| tree | 3479c21be76ce7edde6a5fcacb6f60c1a5698a8a /include | |
| parent | 679dfd75a8aeb26ee4ff0d7c148e1f6e88e39c3d (diff) | |
| download | mruby-acdc2d1f242f2547ca842be5d62a2b06356b39ea.tar.gz mruby-acdc2d1f242f2547ca842be5d62a2b06356b39ea.zip | |
Add MRB_WITHOUT_FLOAT
Diffstat (limited to 'include')
| -rw-r--r-- | include/mrbconf.h | 5 | ||||
| -rw-r--r-- | include/mruby.h | 8 | ||||
| -rw-r--r-- | include/mruby/boxing_nan.h | 4 | ||||
| -rw-r--r-- | include/mruby/boxing_no.h | 8 | ||||
| -rw-r--r-- | include/mruby/boxing_word.h | 16 | ||||
| -rw-r--r-- | include/mruby/class.h | 2 | ||||
| -rw-r--r-- | include/mruby/compile.h | 2 | ||||
| -rw-r--r-- | include/mruby/numeric.h | 6 | ||||
| -rw-r--r-- | include/mruby/value.h | 8 |
9 files changed, 57 insertions, 2 deletions
diff --git a/include/mrbconf.h b/include/mrbconf.h index b8d603e1c..36008f917 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -28,6 +28,9 @@ /* add -DMRB_USE_FLOAT to use float instead of double for floating point numbers */ //#define MRB_USE_FLOAT +/* exclude floating point numbers */ +//#define MRB_WITUOUT_FLOAT + /* add -DMRB_INT16 to use 16bit integer for mrb_int; conflict with MRB_INT64 */ //#define MRB_INT16 @@ -45,7 +48,7 @@ # endif #endif -/* represent mrb_value in boxed double; conflict with MRB_USE_FLOAT */ +/* represent mrb_value in boxed double; conflict with MRB_USE_FLOAT and MRB_WITUOUT_FLOAT */ //#define MRB_NAN_BOXING /* define on big endian machines; used by MRB_NAN_BOXING */ diff --git a/include/mruby.h b/include/mruby.h index 316707909..81963908e 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -65,6 +65,7 @@ #include "mrbconf.h" +#ifndef MRB_WITHOUT_FLOAT #ifndef FLT_EPSILON #define FLT_EPSILON (1.19209290e-07f) #endif @@ -80,6 +81,7 @@ #else #define MRB_FLOAT_EPSILON DBL_EPSILON #endif +#endif #include "mruby/common.h" #include <mruby/value.h> @@ -206,7 +208,9 @@ typedef struct mrb_state { struct RClass *hash_class; struct RClass *range_class; +#ifndef MRB_WITHOUT_FLOAT struct RClass *float_class; +#endif struct RClass *fixnum_class; struct RClass *true_class; struct RClass *false_class; @@ -1056,7 +1060,9 @@ MRB_API mrb_bool mrb_obj_equal(mrb_state*, mrb_value, mrb_value); MRB_API mrb_bool mrb_equal(mrb_state *mrb, mrb_value obj1, mrb_value obj2); MRB_API mrb_value mrb_convert_to_integer(mrb_state *mrb, mrb_value val, mrb_int base); MRB_API mrb_value mrb_Integer(mrb_state *mrb, mrb_value val); +#ifndef MRB_WITHOUT_FLOAT MRB_API mrb_value mrb_Float(mrb_state *mrb, mrb_value val); +#endif MRB_API mrb_value mrb_inspect(mrb_state *mrb, mrb_value obj); MRB_API mrb_bool mrb_eql(mrb_state *mrb, mrb_value obj1, mrb_value obj2); @@ -1146,7 +1152,9 @@ MRB_API void mrb_print_error(mrb_state *mrb); #define E_REGEXP_ERROR (mrb_exc_get(mrb, "RegexpError")) #define E_NOTIMP_ERROR (mrb_exc_get(mrb, "NotImplementedError")) +#ifndef MRB_WITHOUT_FLOAT #define E_FLOATDOMAIN_ERROR (mrb_exc_get(mrb, "FloatDomainError")) +#endif #define E_KEY_ERROR (mrb_exc_get(mrb, "KeyError")) diff --git a/include/mruby/boxing_nan.h b/include/mruby/boxing_nan.h index 700ea2ed3..3d9bbdc69 100644 --- a/include/mruby/boxing_nan.h +++ b/include/mruby/boxing_nan.h @@ -11,6 +11,10 @@ # error ---->> MRB_NAN_BOXING and MRB_USE_FLOAT conflict <<---- #endif +#ifdef MRB_WITHOUT_FLOAT +# error ---->> MRB_NAN_BOXING and MRB_WITHOUT_FLOAT conflict <<---- +#endif + #ifdef MRB_INT64 # error ---->> MRB_NAN_BOXING and MRB_INT64 conflict <<---- #endif diff --git a/include/mruby/boxing_no.h b/include/mruby/boxing_no.h index 7ee44a934..86ce64555 100644 --- a/include/mruby/boxing_no.h +++ b/include/mruby/boxing_no.h @@ -12,7 +12,9 @@ typedef struct mrb_value { union { +#ifndef MRB_WITHOUT_FLOAT mrb_float f; +#endif void *p; mrb_int i; mrb_sym sym; @@ -20,11 +22,15 @@ typedef struct mrb_value { enum mrb_vtype tt; } mrb_value; +#ifndef MRB_WITHOUT_FLOAT #define mrb_float_pool(mrb,f) mrb_float_value(mrb,f) +#endif #define mrb_ptr(o) (o).value.p #define mrb_cptr(o) mrb_ptr(o) +#ifndef MRB_WITHOUT_FLOAT #define mrb_float(o) (o).value.f +#endif #define mrb_fixnum(o) (o).value.i #define mrb_symbol(o) (o).value.sym #define mrb_type(o) (o).tt @@ -39,7 +45,9 @@ typedef struct mrb_value { #define SET_TRUE_VALUE(r) BOXNIX_SET_VALUE(r, MRB_TT_TRUE, value.i, 1) #define SET_BOOL_VALUE(r,b) BOXNIX_SET_VALUE(r, b ? MRB_TT_TRUE : MRB_TT_FALSE, value.i, 1) #define SET_INT_VALUE(r,n) BOXNIX_SET_VALUE(r, MRB_TT_FIXNUM, value.i, (n)) +#ifndef MRB_WITHOUT_FLOAT #define SET_FLOAT_VALUE(mrb,r,v) BOXNIX_SET_VALUE(r, MRB_TT_FLOAT, value.f, (v)) +#endif #define SET_SYM_VALUE(r,v) BOXNIX_SET_VALUE(r, MRB_TT_SYMBOL, value.sym, (v)) #define SET_OBJ_VALUE(r,v) BOXNIX_SET_VALUE(r, (((struct RObject*)(v))->tt), value.p, (v)) #define SET_CPTR_VALUE(mrb,r,v) BOXNIX_SET_VALUE(r, MRB_TT_CPTR, value.p, v) diff --git a/include/mruby/boxing_word.h b/include/mruby/boxing_word.h index d1c457fae..b17bfc973 100644 --- a/include/mruby/boxing_word.h +++ b/include/mruby/boxing_word.h @@ -15,10 +15,12 @@ #error MRB_INT64 cannot be used with MRB_WORD_BOXING in 32-bit mode. #endif +#ifndef MRB_WITHOUT_FLOAT struct RFloat { MRB_OBJECT_HEADER; mrb_float f; }; +#endif struct RCptr { MRB_OBJECT_HEADER; @@ -26,7 +28,11 @@ struct RCptr { }; #define MRB_FIXNUM_SHIFT 1 +#ifdef MRB_WITHOUT_FLOAT +#define MRB_TT_HAS_BASIC MRB_TT_CPTR +#else #define MRB_TT_HAS_BASIC MRB_TT_FLOAT +#endif enum mrb_special_consts { MRB_Qnil = 0, @@ -51,21 +57,29 @@ typedef union mrb_value { mrb_sym sym : (sizeof(mrb_sym) * CHAR_BIT); }; struct RBasic *bp; +#ifndef MRB_WITHOUT_FLOAT struct RFloat *fp; +#endif struct RCptr *vp; } value; unsigned long w; } mrb_value; MRB_API mrb_value mrb_word_boxing_cptr_value(struct mrb_state*, void*); +#ifndef MRB_WITHOUT_FLOAT MRB_API mrb_value mrb_word_boxing_float_value(struct mrb_state*, mrb_float); MRB_API mrb_value mrb_word_boxing_float_pool(struct mrb_state*, mrb_float); +#endif +#ifndef MRB_WITHOUT_FLOAT #define mrb_float_pool(mrb,f) mrb_word_boxing_float_pool(mrb,f) +#endif #define mrb_ptr(o) (o).value.p #define mrb_cptr(o) (o).value.vp->p +#ifndef MRB_WITHOUT_FLOAT #define mrb_float(o) (o).value.fp->f +#endif #define mrb_fixnum(o) ((mrb_int)(o).value.i) #define mrb_symbol(o) (o).value.sym @@ -106,7 +120,9 @@ mrb_type(mrb_value o) }\ } while (0) +#ifndef MRB_WITHOUT_FLOAT #define SET_FLOAT_VALUE(mrb,r,v) r = mrb_word_boxing_float_value(mrb, v) +#endif #define SET_CPTR_VALUE(mrb,r,v) r = mrb_word_boxing_cptr_value(mrb, v) #define SET_NIL_VALUE(r) BOXWORD_SET_VALUE(r, MRB_TT_FALSE, value.i, 0) #define SET_FALSE_VALUE(r) BOXWORD_SET_VALUE(r, MRB_TT_FALSE, value.i, 1) diff --git a/include/mruby/class.h b/include/mruby/class.h index e9df7764c..1e1d3c136 100644 --- a/include/mruby/class.h +++ b/include/mruby/class.h @@ -40,8 +40,10 @@ mrb_class(mrb_state *mrb, mrb_value v) return mrb->symbol_class; case MRB_TT_FIXNUM: return mrb->fixnum_class; +#ifndef MRB_WITHOUT_FLOAT case MRB_TT_FLOAT: return mrb->float_class; +#endif case MRB_TT_CPTR: return mrb->object_class; case MRB_TT_ENV: diff --git a/include/mruby/compile.h b/include/mruby/compile.h index d1ff0530f..051935ee1 100644 --- a/include/mruby/compile.h +++ b/include/mruby/compile.h @@ -165,7 +165,9 @@ struct mrb_parser_state { MRB_API struct mrb_parser_state* mrb_parser_new(mrb_state*); MRB_API void mrb_parser_free(struct mrb_parser_state*); MRB_API void mrb_parser_parse(struct mrb_parser_state*,mrbc_context*); +#ifndef MRB_WITHOUT_FLOAT MRB_API double mrb_float_read(const char*, char**); +#endif MRB_API void mrb_parser_set_filename(struct mrb_parser_state*, char const*); MRB_API char const* mrb_parser_get_filename(struct mrb_parser_state*, uint16_t idx); diff --git a/include/mruby/numeric.h b/include/mruby/numeric.h index 042311df8..da9225aaa 100644 --- a/include/mruby/numeric.h +++ b/include/mruby/numeric.h @@ -22,13 +22,19 @@ MRB_BEGIN_DECL #define POSFIXABLE(f) TYPED_POSFIXABLE(f,mrb_int) #define NEGFIXABLE(f) TYPED_NEGFIXABLE(f,mrb_int) #define FIXABLE(f) TYPED_FIXABLE(f,mrb_int) +#ifndef MRB_WITHOUT_FLOAT #define FIXABLE_FLOAT(f) TYPED_FIXABLE(f,double) +#endif +#ifndef MRB_WITHOUT_FLOAT MRB_API mrb_value mrb_flo_to_fixnum(mrb_state *mrb, mrb_value val); +#endif MRB_API mrb_value mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, mrb_int base); /* ArgumentError if format string doesn't match /%(\.[0-9]+)?[aAeEfFgG]/ */ +#ifndef MRB_WITHOUT_FLOAT MRB_API mrb_value mrb_float_to_str(mrb_state *mrb, mrb_value x, const char *fmt); MRB_API mrb_float mrb_to_flo(mrb_state *mrb, mrb_value x); +#endif mrb_value mrb_fixnum_plus(mrb_state *mrb, mrb_value x, mrb_value y); mrb_value mrb_fixnum_minus(mrb_state *mrb, mrb_value x, mrb_value y); diff --git a/include/mruby/value.h b/include/mruby/value.h index 98c68d657..f988826ca 100644 --- a/include/mruby/value.h +++ b/include/mruby/value.h @@ -63,12 +63,14 @@ struct mrb_state; #endif +#ifndef MRB_WITHOUT_FLOAT MRB_API double mrb_float_read(const char*, char**); #ifdef MRB_USE_FLOAT typedef float mrb_float; #else typedef double mrb_float; #endif +#endif #if defined _MSC_VER && _MSC_VER < 1900 # ifndef __cplusplus @@ -79,7 +81,7 @@ MRB_API int mrb_msvc_vsnprintf(char *s, size_t n, const char *format, va_list ar MRB_API int mrb_msvc_snprintf(char *s, size_t n, const char *format, ...); # define vsnprintf(s, n, format, arg) mrb_msvc_vsnprintf(s, n, format, arg) # define snprintf(s, n, format, ...) mrb_msvc_snprintf(s, n, format, __VA_ARGS__) -# if _MSC_VER < 1800 +# if _MSC_VER < 1800 && !defined MRB_WITHOUT_FLOAT # include <float.h> # define isfinite(n) _finite(n) # define isnan _isnan @@ -158,7 +160,9 @@ typedef void mrb_value; #ifndef mrb_bool #define mrb_bool(o) (mrb_type(o) != MRB_TT_FALSE) #endif +#ifndef MRB_WITHOUT_FLOAT #define mrb_float_p(o) (mrb_type(o) == MRB_TT_FLOAT) +#endif #define mrb_symbol_p(o) (mrb_type(o) == MRB_TT_SYMBOL) #define mrb_array_p(o) (mrb_type(o) == MRB_TT_ARRAY) #define mrb_string_p(o) (mrb_type(o) == MRB_TT_STRING) @@ -171,6 +175,7 @@ MRB_API mrb_bool mrb_regexp_p(struct mrb_state*, mrb_value); /* * Returns a float in Ruby. */ +#ifndef MRB_WITHOUT_FLOAT MRB_INLINE mrb_value mrb_float_value(struct mrb_state *mrb, mrb_float f) { mrb_value v; @@ -178,6 +183,7 @@ MRB_INLINE mrb_value mrb_float_value(struct mrb_state *mrb, mrb_float f) SET_FLOAT_VALUE(mrb, v, f); return v; } +#endif static inline mrb_value mrb_cptr_value(struct mrb_state *mrb, void *p) |
