summaryrefslogtreecommitdiff
path: root/time.c
diff options
context:
space:
mode:
author卜部昌平 <shyouhei@ruby-lang.org>2020-06-19 11:58:50 +0900
committer卜部昌平 <shyouhei@ruby-lang.org>2020-06-29 11:05:41 +0900
commit0fc569361bfef9a48a6ad54b075047f02b51b4e2 (patch)
tree6c74fb6f796d3dd5b27014c47017e9347e903df6 /time.c
parentf402dc35572ae6167737e82585f92d3cc861d1da (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.c48
1 files changed, 19 insertions, 29 deletions
diff --git a/time.c b/time.c
index ddd011ed79..b45715a24b 100644
--- a/time.c
+++ b/time.c
@@ -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 */