diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-04-15 00:06:13 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-04-15 00:06:13 +0000 |
commit | 57fb2199059cb55b632d093c2e64c8a3c60acfbb (patch) | |
tree | e35e0fb134907d12cee224d3750f4cc00c7b7634 /bignum.c | |
parent | b860144680e3af51f7fc0d7185185a92c4fa6aca (diff) | |
download | ruby-57fb2199059cb55b632d093c2e64c8a3c60acfbb.tar.gz |
* reduce UNREACHABLE.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35333 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'bignum.c')
-rw-r--r-- | bignum.c | 42 |
1 files changed, 18 insertions, 24 deletions
@@ -2976,33 +2976,31 @@ big_fdiv(VALUE x, VALUE y) switch (TYPE(y)) { case T_FIXNUM: y = rb_int2big(FIX2LONG(y)); - case T_BIGNUM: { + case T_BIGNUM: bigtrunc(y); l = RBIGNUM_LEN(y) - 1; ey = l * BITSPERDIG; ey += bdigbitsize(BDIGITS(y)[l]); ey -= DBL_BIGDIG * BITSPERDIG; if (ey) y = big_shift(y, ey); - bignum: - bigdivrem(x, y, &z, 0); - l = ex - ey; -#if SIZEOF_LONG > SIZEOF_INT - { - /* Visual C++ can't be here */ - if (l > INT_MAX) return DBL2NUM(INFINITY); - if (l < INT_MIN) return DBL2NUM(0.0); - } -#endif - return DBL2NUM(ldexp(big2dbl(z), (int)l)); - } + break; case T_FLOAT: y = dbl2big(ldexp(frexp(RFLOAT_VALUE(y), &i), DBL_MANT_DIG)); ey = i - DBL_MANT_DIG; - goto bignum; + break; + default: + rb_bug("big_fdiv"); } - rb_bug("big_fdiv"); - - UNREACHABLE; + bigdivrem(x, y, &z, 0); + l = ex - ey; +#if SIZEOF_LONG > SIZEOF_INT + { + /* Visual C++ can't be here */ + if (l > INT_MAX) return DBL2NUM(INFINITY); + if (l < INT_MIN) return DBL2NUM(0.0); + } +#endif + return DBL2NUM(ldexp(big2dbl(z), (int)l)); } /* @@ -3665,17 +3663,13 @@ static VALUE rb_big_coerce(VALUE x, VALUE y) { if (FIXNUM_P(y)) { - return rb_assoc_new(rb_int2big(FIX2LONG(y)), x); - } - else if (RB_TYPE_P(y, T_BIGNUM)) { - return rb_assoc_new(y, x); + y = rb_int2big(FIX2LONG(y)); } - else { + else if (!RB_TYPE_P(y, T_BIGNUM)) { rb_raise(rb_eTypeError, "can't coerce %s to Bignum", rb_obj_classname(y)); } - - UNREACHABLE; + return rb_assoc_new(y, x); } /* |