summaryrefslogtreecommitdiffhomepage
path: root/src/numeric.c
diff options
context:
space:
mode:
authorsnaba <[email protected]>2012-04-23 09:42:29 +0900
committersnaba <[email protected]>2012-04-23 09:42:29 +0900
commit1f87caa2c76bc3b522455b400ab1ff362bfeaa15 (patch)
tree713cf17746e245aa03af0d86c8f62bd5b983bebd /src/numeric.c
parent210fcdc14b7531e2888e9ebb67d2c77b9f5302c0 (diff)
parentcf6e7966d3de0de1cf03e8c72dbde474d61d9f7d (diff)
downloadmruby-1f87caa2c76bc3b522455b400ab1ff362bfeaa15.tar.gz
mruby-1f87caa2c76bc3b522455b400ab1ff362bfeaa15.zip
Merge branch 'master' of github.com:mruby/mruby
Diffstat (limited to 'src/numeric.c')
-rw-r--r--src/numeric.c173
1 files changed, 7 insertions, 166 deletions
diff --git a/src/numeric.c b/src/numeric.c
index f79369d90..135691644 100644
--- a/src/numeric.c
+++ b/src/numeric.c
@@ -88,34 +88,9 @@
#define mrb_rational_raw1(x) mrb_rational_raw(x, INT2FIX(1))
-#if SIZEOF_LONG_LONG > 0
-# define LONG_LONG long long
-#elif SIZEOF___INT64 > 0
-# define HAVE_LONG_LONG 1
-# define LONG_LONG __int64
-# undef SIZEOF_LONG_LONG
-# 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 +955,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 +966,6 @@ mrb_fix2int(mrb_value val)
{
return mrb_fixnum(val);
}
-#endif
mrb_value
mrb_num2fix(mrb_state *mrb, mrb_value val)
@@ -1076,59 +976,10 @@ mrb_num2fix(mrb_state *mrb, mrb_value val)
v = mrb_num2long(mrb, val);
if (!FIXABLE(v))
- mrb_raise(mrb, E_RANGE_ERROR, "integer %"PRIdVALUE " out of range of fixnum", v);
+ mrb_raise(mrb, E_RANGE_ERROR, "integer %ld out of range of fixnum", v);
return mrb_fixnum_value(v);
}
-#if HAVE_LONG_LONG
-
-LONG_LONG
-mrb_num2ll(mrb_state *mrb, mrb_value val)
-{
- if (mrb_nil_p(val)) {
- mrb_raise(mrb, E_TYPE_ERROR, "no implicit conversion from nil");
- }
-
- if (FIXNUM_P(val)) return (LONG_LONG)mrb_fixnum(val);
-
- switch (mrb_type(val)) {
- case MRB_TT_FLOAT:
- if (mrb_float(val) <= (double)LLONG_MAX
- && mrb_float(val) >= (double)LLONG_MIN) {
- return (LONG_LONG)(mrb_float(val));
- }
- else {
- char buf[24];
- char *s;
-
- snprintf(buf, sizeof(buf), "%-.10g", mrb_float(val));
- if ((s = strchr(buf, ' ')) != 0) *s = '\0';
- mrb_raise(mrb, E_RANGE_ERROR, "float %s out of range of long long", buf);
- }
-
- case MRB_TT_STRING:
- mrb_raise(mrb, E_TYPE_ERROR, "no implicit conversion from string");
- return mrb_nil_value(); /* not reached */
-
- case MRB_TT_TRUE:
- case MRB_TT_FALSE:
- mrb_raise(mrb, E_TYPE_ERROR, "no implicit conversion from boolean");
- return mrb_nil_value(); /* not reached */
-
- default:
- val = mrb_to_int(mrb, val);
- return NUM2LL(val);
- }
-}
-
-unsigned LONG_LONG
-mrb_num2ull(mrb_state *mrb, mrb_value val)
-{
- return (unsigned LONG_LONG)mrb_num2ll(mrb, val);
-}
-
-#endif /* HAVE_LONG_LONG */
-
/*
* Document-class: Integer
*
@@ -1204,7 +1055,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;
@@ -1229,7 +1080,7 @@ rb_fix2str(mrb_state *mrb, mrb_value x, int base)
return mrb_usascii_str_new2(mrb, b);
}
-#define SQRT_LONG_MAX ((SIGNED_VALUE)1<<((SIZEOF_LONG*CHAR_BIT-1)/2))
+#define SQRT_LONG_MAX ((SIGNED_VALUE)1<<((sizeof(intptr_t)*CHAR_BIT-1)/2))
/*tests if N*N would overflow*/
#define FIT_SQRT_LONG(n) (((n)<SQRT_LONG_MAX)&&((n)>=-SQRT_LONG_MAX))
@@ -1255,21 +1106,12 @@ fix_mul(mrb_state *mrb, mrb_value x)
volatile
#endif
long a, b;
-#if SIZEOF_LONG * 2 <= SIZEOF_LONG_LONG
- LONG_LONG d;
-#else
long c;
mrb_value r;
-#endif
a = mrb_fixnum(x);
b = mrb_fixnum(y);
-#if SIZEOF_LONG * 2 <= SIZEOF_LONG_LONG
- d = (LONG_LONG)a * b;
- if (FIXABLE(d)) return mrb_fixnum_value(d);
- return mrb_nil_value();// rb_ll2inum(d);
-#else
if (FIT_SQRT_LONG(a) && FIT_SQRT_LONG(b))
return mrb_fixnum_value(a*b);
c = a * b;
@@ -1281,7 +1123,6 @@ fix_mul(mrb_state *mrb, mrb_value x)
r = mrb_fixnum_value(a*b);
}
return r;
-#endif
}
switch (mrb_type(y)) {
case MRB_TT_FLOAT:
@@ -1615,9 +1456,9 @@ mrb_fix_lshift(mrb_state *mrb, mrb_value x)
static mrb_value
fix_lshift(mrb_state *mrb, long val, unsigned long width)
{
- if (width > (SIZEOF_LONG*CHAR_BIT-1)
- || ((unsigned long)abs(val))>>(SIZEOF_LONG*CHAR_BIT-1-width) > 0) {
- mrb_raise(mrb, E_RANGE_ERROR, "width(%d) > (SIZEOF_LONG*CHAR_BIT-1)", width);
+ if (width > (sizeof(intptr_t)*CHAR_BIT-1)
+ || ((unsigned long)abs(val))>>(sizeof(intptr_t)*CHAR_BIT-1-width) > 0) {
+ mrb_raise(mrb, E_RANGE_ERROR, "width(%d) > (sizeof(intptr_t)*CHAR_BIT-1)", width);
}
val = val << width;
return mrb_fixnum_value(val);