summaryrefslogtreecommitdiff
path: root/rational.c
diff options
context:
space:
mode:
author卜部昌平 <shyouhei@ruby-lang.org>2020-06-16 15:18:55 +0900
committer卜部昌平 <shyouhei@ruby-lang.org>2020-06-29 11:05:41 +0900
commit689dd3aecbf6177caad793c18c1c6ab4a7cc2150 (patch)
tree5e7249ec7f394b93c6f16042bfa6d3a4ae20a3bd /rational.c
parentd7eec15f8e7e8667cdca144a1e288a3f72015d30 (diff)
downloadruby-689dd3aecbf6177caad793c18c1c6ab4a7cc2150.tar.gz
parse_rat: do not goto into a branch
I'm not necessarily against every goto in general, but jumping into a branch is definitely a bad idea. Better refactor.
Diffstat (limited to 'rational.c')
-rw-r--r--rational.c27
1 files changed, 15 insertions, 12 deletions
diff --git a/rational.c b/rational.c
index f50f20d5a3..36e4296c9e 100644
--- a/rational.c
+++ b/rational.c
@@ -2440,24 +2440,27 @@ parse_rat(const char *s, const char *const e, int strict, int raise)
if (nexp != ZERO) {
if (INT_NEGATIVE_P(nexp)) {
VALUE mul;
- if (!FIXNUM_P(nexp)) {
- overflow:
- return sign == '-' ? DBL2NUM(-HUGE_VAL) : DBL2NUM(HUGE_VAL);
+ if (FIXNUM_P(nexp)) {
+ mul = f_expt10(LONG2NUM(-FIX2LONG(nexp)));
+ if (! RB_FLOAT_TYPE_P(mul)) {
+ num = rb_int_mul(num, mul);
+ goto reduce;
+ }
}
- mul = f_expt10(LONG2NUM(-FIX2LONG(nexp)));
- if (RB_FLOAT_TYPE_P(mul)) goto overflow;
- num = rb_int_mul(num, mul);
+ return sign == '-' ? DBL2NUM(-HUGE_VAL) : DBL2NUM(HUGE_VAL);
}
else {
VALUE div;
- if (!FIXNUM_P(nexp)) {
- underflow:
- return sign == '-' ? DBL2NUM(-0.0) : DBL2NUM(+0.0);
+ if (FIXNUM_P(nexp)) {
+ div = f_expt10(nexp);
+ if (! RB_FLOAT_TYPE_P(div)) {
+ den = rb_int_mul(den, div);
+ goto reduce;
+ }
}
- div = f_expt10(nexp);
- if (RB_FLOAT_TYPE_P(div)) goto underflow;
- den = rb_int_mul(den, div);
+ return sign == '-' ? DBL2NUM(-0.0) : DBL2NUM(+0.0);
}
+ reduce:
nurat_reduce(&num, &den);
}