From a2ac0982cd5fc48ba3cafe3c9bdc48836eaa0bce Mon Sep 17 00:00:00 2001 From: nobu Date: Thu, 16 Mar 2017 03:35:29 +0000 Subject: rational.c: float denom * rational.c (parse_rat): allow float as a denominator as well as a numerator. [ruby-core:79104] [Bug #13134] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57990 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- rational.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) (limited to 'rational.c') diff --git a/rational.c b/rational.c index 53e136ff13..43c49350f6 100644 --- a/rational.c +++ b/rational.c @@ -2356,7 +2356,7 @@ static VALUE parse_rat(const char *s, const char *const e, int strict) { int sign; - VALUE num, den, ndiv; + VALUE num, den, ndiv, ddiv; s = skip_ws(s, e); sign = read_sign(&s, e); @@ -2368,12 +2368,8 @@ parse_rat(const char *s, const char *const e, int strict) nurat_reduce(&num, &ndiv); den = ndiv; if (s < e && *s == '/') { - char *t; s++; - den = rb_int_parse_cstr(s, e-s, &t, NULL, - 10, RB_INT_PARSE_UNDERSCORE); - s = t; - if (NIL_P(den)) { + if (!read_num(&s, e, &den, &ddiv)) { if (strict) return Qnil; den = ndiv; } @@ -2384,8 +2380,11 @@ parse_rat(const char *s, const char *const e, int strict) return Qnil; } else { + nurat_reduce(&den, &ddiv); nurat_reduce(&num, &den); - den = rb_int_mul(den, ndiv); + nurat_reduce(&ndiv, &ddiv); + if (ndiv != ONE) den = rb_int_mul(den, ndiv); + if (ddiv != ONE) num = rb_int_mul(num, ddiv); } } else if (strict && skip_ws(s, e) != e) { -- cgit v1.2.3