diff options
author | 卜部昌平 <[email protected]> | 2020-06-19 11:58:50 +0900 |
---|---|---|
committer | 卜部昌平 <[email protected]> | 2020-06-29 11:05:41 +0900 |
commit | 0fc569361bfef9a48a6ad54b075047f02b51b4e2 (patch) | |
tree | 6c74fb6f796d3dd5b27014c47017e9347e903df6 /time.c | |
parent | f402dc35572ae6167737e82585f92d3cc861d1da (diff) |
num_exact: 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.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/3247
Diffstat (limited to 'time.c')
-rw-r--r-- | time.c | 48 |
1 files changed, 19 insertions, 29 deletions
@@ -512,47 +512,37 @@ num_exact(VALUE v) { VALUE tmp; - if (NIL_P(v)) { - rb_raise(rb_eTypeError, "can't convert nil into an exact number"); - } - else if (RB_INTEGER_TYPE_P(v)) { + switch (TYPE(v)) { + case T_FIXNUM: + case T_BIGNUM: return v; - } - else if (RB_TYPE_P(v, T_RATIONAL)) { - goto rational; - } - else if (RB_TYPE_P(v, T_STRING)) { - goto typeerror; - } - else { + + case T_RATIONAL: + return rb_rational_canonicalize(v); + + default: if ((tmp = rb_check_funcall(v, idTo_r, 0, NULL)) != Qundef) { /* test to_int method availability to reject non-Numeric * objects such as String, Time, etc which have to_r method. */ - if (!rb_respond_to(v, idTo_int)) goto typeerror; + if (!rb_respond_to(v, idTo_int)) { + /* FALLTHROUGH */ + } + else if (RB_INTEGER_TYPE_P(tmp)) { + return tmp; + } + else if (RB_TYPE_P(tmp, T_RATIONAL)) { + return rb_rational_canonicalize(tmp); + } } else if (!NIL_P(tmp = rb_check_to_int(v))) { return tmp; } - else { - goto typeerror; - } - } - if (RB_INTEGER_TYPE_P(tmp)) { - v = tmp; - } - else if (RB_TYPE_P(tmp, T_RATIONAL)) { - v = tmp; - rational: - if (RRATIONAL(v)->den == INT2FIX(1)) - v = RRATIONAL(v)->num; - } - else { - typeerror: + case T_NIL: + case T_STRING: rb_raise(rb_eTypeError, "can't convert %"PRIsVALUE" into an exact number", rb_obj_class(v)); } - return v; } /* time_t */ |