diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-03-16 03:35:29 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-03-16 03:35:29 +0000 |
commit | a2ac0982cd5fc48ba3cafe3c9bdc48836eaa0bce (patch) | |
tree | eb1c81ee29375e93bb9cbb58029d160347f91e21 /rational.c | |
parent | 62fb6147cde44c2c697ea8c160b724d029e1cd87 (diff) |
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
Diffstat (limited to 'rational.c')
-rw-r--r-- | rational.c | 13 |
1 files changed, 6 insertions, 7 deletions
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) { |