diff options
Diffstat (limited to 'src/numeric.c')
| -rw-r--r-- | src/numeric.c | 95 |
1 files changed, 2 insertions, 93 deletions
diff --git a/src/numeric.c b/src/numeric.c index f79369d90..ef4588f76 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -97,25 +97,9 @@ # define SIZEOF_LONG_LONG SIZEOF___INT64 #endif -#if defined HAVE_UINTPTR_T && 0 typedef uintptr_t VALUE; typedef uintptr_t ID; -# define SIGNED_VALUE intptr_t -# define SIZEOF_VALUE SIZEOF_UINTPTR_T -#elif SIZEOF_LONG == SIZEOF_VOIDP -//typedef unsigned long VALUE; -//typedef unsigned long ID; -# define SIGNED_VALUE long long -# define SIZEOF_VALUE SIZEOF_LONG -#elif SIZEOF_LONG_LONG == SIZEOF_VOIDP -typedef unsigned LONG_LONG VALUE; -typedef unsigned LONG_LONG ID; -# define SIGNED_VALUE LONG_LONG -# define LONG_LONG_VALUE 1 -# define SIZEOF_VALUE SIZEOF_LONG_LONG -#else -# error ---->> ruby requires sizeof(void*) == sizeof(long) to be compiled. <<---- -#endif +#define SIGNED_VALUE intptr_t #ifdef HAVE_INFINITY #elif BYTE_ORDER == LITTLE_ENDIAN @@ -980,80 +964,6 @@ mrb_num2ulong(mrb_state *mrb, mrb_value val) } } -#if SIZEOF_INT < SIZEOF_VALUE -void -mrb_out_of_int(mrb_state *mrb, SIGNED_VALUE num) -{ - mrb_raise(mrb, E_RANGE_ERROR, "integer %"PRIdVALUE " too %s to convert to `int'", - num, num < 0 ? "small" : "big"); -} - -static void -check_int(SIGNED_VALUE num) -{ - if ((SIGNED_VALUE)(int)num != num) { - mrb_out_of_int(num); - } -} - -static void -check_uint(mrb_state *mrb, mrb_value num, mrb_value sign) -{ - static const mrb_value mask = ~(mrb_value)UINT_MAX; - - if (RTEST(sign)) { - /* minus */ - if ((num & mask) != mask || (num & ~mask) <= INT_MAX + 1UL) - mrb_raise(mrb, E_RANGE_ERROR, "integer %"PRIdVALUE " too small to convert to `unsigned int'", num); - } - else { - /* plus */ - if ((num & mask) != 0) - mrb_raise(mrb, E_RANGE_ERROR, "integer %"PRIuVALUE " too big to convert to `unsigned int'", num); - } -} - -long -mrb_num2int(mrb_value val) -{ - long num = mrb_num2long(mrb, val); - - check_int(num); - return num; -} - -long -mrb_fix2int(mrb_state *mrb, mrb_value val) -{ - long num = FIXNUM_P(val)?mrb_fixnum(val):mrb_num2long(mrb, val); - - check_int(num); - return num; -} - -unsigned long -mrb_num2uint(mrb_value val) -{ - unsigned long num = mrb_num2ulong(val); - - check_uint(num, mrb_funcall(mrb, val, "<", 1, mrb_fixnum_value(0))); - return num; -} - -unsigned long -mrb_fix2uint(mrb_state *mrb, mrb_value val) -{ - unsigned long num; - - if (!FIXNUM_P(val)) { - return mrb_num2uint(mrb, val); - } - num = FIX2ULONG(val); - - check_uint(num, mrb_funcall(mrb, val, "<", 1, mrb_fixnum_value(0))); - return num; -} -#else long mrb_num2int(mrb_state *mrb, mrb_value val) { @@ -1065,7 +975,6 @@ mrb_fix2int(mrb_value val) { return mrb_fixnum(val); } -#endif mrb_value mrb_num2fix(mrb_state *mrb, mrb_value val) @@ -1204,7 +1113,7 @@ mrb_value rb_fix2str(mrb_state *mrb, mrb_value x, int base) { extern const char ruby_digitmap[]; - char buf[SIZEOF_VALUE*CHAR_BIT + 2], *b = buf + sizeof buf; + char buf[sizeof(mrb_int)*CHAR_BIT + 2], *b = buf + sizeof buf; long val = mrb_fixnum(x); int neg = 0; |
