summaryrefslogtreecommitdiff
path: root/numeric.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-05-07 08:24:09 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-05-07 08:24:09 +0000
commita352b0a20744a19c2fcb2ea5af576805c0706aea (patch)
tree21ab713b028bfa5e27eb997bb395b8e432a776d1 /numeric.c
parentf8661f7ffb42bb831f62f06f43b6a0fc706c23a0 (diff)
numeric.c: check keyword arguments
* numeric.c (num_step_scan_args): check keyword arguments and fail if they conflict with positional arguments. [ruby-dev:48177] [Bug #9811] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45861 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'numeric.c')
-rw-r--r--numeric.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/numeric.c b/numeric.c
index dfa7052467..60c8ab6f1d 100644
--- a/numeric.c
+++ b/numeric.c
@@ -1867,8 +1867,19 @@ num_step_scan_args(int argc, const VALUE *argv, VALUE *to, VALUE *step)
argc = rb_scan_args(argc, argv, "02:", to, step, &hash);
if (!NIL_P(hash)) {
- *step = rb_hash_aref(hash, sym_by);
- *to = rb_hash_aref(hash, sym_to);
+ ID keys[2];
+ VALUE values[2];
+ keys[0] = sym_to;
+ keys[1] = sym_by;
+ rb_get_kwargs(hash, keys, 0, 2, values);
+ if (values[0] != Qundef) {
+ if (argc > 0) rb_raise(rb_eArgError, "to is given twice");
+ *to = values[0];
+ }
+ if (values[1] != Qundef) {
+ if (argc > 1) rb_raise(rb_eArgError, "step is given twice");
+ *step = values[1];
+ }
}
else {
/* compatibility */