aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormrkn <mrkn@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-11-12 11:52:00 +0000
committermrkn <mrkn@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-11-12 11:52:00 +0000
commit16e0c00fecf560ff1b3a07e53b89a4f224eabccb (patch)
tree0e297e6dd44c8eecd819addd0969ac19c5f11a61
parentce35f121872f5a7b3b0690f692792f52c554966d (diff)
downloadruby-16e0c00fecf560ff1b3a07e53b89a4f224eabccb.tar.gz
rational.c: optimize Float#to_r
* rational.c (float_to_r): optimize Float#to_r. * numeric.c (rb_int_lshift): exported. * internal.h (rb_int_lshift): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56750 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--internal.h1
-rw-r--r--numeric.c2
-rw-r--r--rational.c11
3 files changed, 9 insertions, 5 deletions
diff --git a/internal.h b/internal.h
index 6a7f039cd0..dd7d09a6e3 100644
--- a/internal.h
+++ b/internal.h
@@ -1178,6 +1178,7 @@ VALUE rb_int_cmp(VALUE x, VALUE y);
VALUE rb_int_equal(VALUE x, VALUE y);
VALUE rb_int_divmod(VALUE x, VALUE y);
VALUE rb_int_and(VALUE x, VALUE y);
+VALUE rb_int_lshift(VALUE x, VALUE y);
#if USE_FLONUM
#define RUBY_BIT_ROTL(v, n) (((v) << (n)) | ((v) >> ((sizeof(v) * 8) - n)))
diff --git a/numeric.c b/numeric.c
index e0d6358932..590bec72e1 100644
--- a/numeric.c
+++ b/numeric.c
@@ -4390,7 +4390,7 @@ fix_lshift(long val, unsigned long width)
return LONG2NUM(val);
}
-static VALUE
+VALUE
rb_int_lshift(VALUE x, VALUE y)
{
if (FIXNUM_P(x)) {
diff --git a/rational.c b/rational.c
index 67752ff961..c7f66c4767 100644
--- a/rational.c
+++ b/rational.c
@@ -2071,14 +2071,17 @@ float_to_r(VALUE self)
long ln = FIX2LONG(n);
if (ln == 0)
- return f_to_r(f);
+ return rb_rational_new1(f);
if (ln > 0)
- return f_to_r(f_lshift(f, n));
+ return rb_rational_new1(rb_int_lshift(f, n));
ln = -ln;
- return rb_rational_new2(f, f_lshift(ONE, INT2FIX(ln)));
+ return rb_rational_new2(f, rb_int_lshift(ONE, INT2FIX(ln)));
}
#else
- return f_to_r(f_mul(f, f_expt(INT2FIX(FLT_RADIX), n)));
+ f = rb_int_mul(f, rb_int_pow(INT2FIX(FLT_RADIX), n));
+ if (RB_TYPE_P(f, T_RATIONAL))
+ return f;
+ return rb_rational_new1(f);
#endif
}