aboutsummaryrefslogtreecommitdiffstats
path: root/object.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-07-22 16:03:58 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-07-22 16:03:58 +0000
commitad5e4c8cd8aae9c7f4c0e983a2089a932919d667 (patch)
treec85bdf317ef68273bc02659beffa470a7b740f14 /object.c
parent69a671b6dd0abebf16356b170bcb23cf0f4788d7 (diff)
downloadruby-ad5e4c8cd8aae9c7f4c0e983a2089a932919d667.tar.gz
object.c: prefer base optarg
* object.c (rb_f_integer): prefer `base` optional argument over keyword arguments. this issue should be resolved more generally by separating keyword arguments from hashes in the future. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64015 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'object.c')
-rw-r--r--object.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/object.c b/object.c
index 9492abfac9..7d6e47932c 100644
--- a/object.c
+++ b/object.c
@@ -3214,15 +3214,23 @@ rb_f_integer(int argc, VALUE *argv, VALUE obj)
VALUE arg = Qnil, opts = Qnil;
int base = 0;
- switch (rb_scan_args(argc, argv, "11:", NULL, NULL, &opts)) {
- case 2:
- base = NUM2INT(argv[1]);
- case 1:
- arg = argv[0];
- break;
- default:
- UNREACHABLE;
+ if (argc > 1) {
+ int narg = 1;
+ VALUE vbase = rb_check_to_int(argv[1]);
+ if (!NIL_P(vbase)) {
+ base = NUM2INT(vbase);
+ narg = 2;
+ }
+ if (argc > narg) {
+ VALUE hash = rb_check_hash_type(argv[argc-1]);
+ if (!NIL_P(hash)) {
+ opts = rb_extract_keywords(&hash);
+ if (!hash) --argc;
+ }
+ }
}
+ rb_check_arity(argc, 1, 2);
+ arg = argv[0];
return rb_convert_to_integer(arg, base, opts_exception_p(opts));
}