summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
author卜部昌平 <shyouhei@ruby-lang.org>2020-05-20 15:44:37 +0900
committer卜部昌平 <shyouhei@ruby-lang.org>2020-05-21 09:58:54 +0900
commit43725c60915753a88224583fafc87c0bac7c5422 (patch)
treef8a5d8511071d52f2e9629012e3ef481155dea16 /include
parent140d4e4a5fb4480feeb59565464f197e6a09587d (diff)
rb_scan_args_set: make it slightly readable
This is a pure refactoring that improves understanding of what is going on. Not a big win though.
Diffstat (limited to 'include')
-rw-r--r--include/ruby/internal/scan_args.h20
1 files changed, 13 insertions, 7 deletions
diff --git a/include/ruby/internal/scan_args.h b/include/ruby/internal/scan_args.h
index 3ad4e9531d..dae9d65573 100644
--- a/include/ruby/internal/scan_args.h
+++ b/include/ruby/internal/scan_args.h
@@ -269,6 +269,7 @@ rb_scan_args_set(int kw_flag, int argc, const VALUE *argv,
#define rb_scan_args_next_param() vars[vari++]
const int n_mand = n_lead + n_trail;
+ /* capture an option hash - phase 1: pop from the argv */
if (f_hash && argc > 0) {
VALUE last = argv[argc - 1];
if (rb_scan_args_keyword_p(kw_flag, last)) {
@@ -282,13 +283,14 @@ rb_scan_args_set(int kw_flag, int argc, const VALUE *argv,
}
/* capture leading mandatory arguments */
- for (i = n_lead; i-- > 0; ) {
+ for (i = 0; i < n_lead; i++) {
var = rb_scan_args_next_param();
if (var) *var = argv[argi];
argi++;
}
+
/* capture optional arguments */
- for (i = n_opt; i-- > 0; ) {
+ for (i = 0; i < n_opt; i++) {
var = rb_scan_args_next_param();
if (argi < argc - n_trail) {
if (var) *var = argv[argi];
@@ -298,6 +300,7 @@ rb_scan_args_set(int kw_flag, int argc, const VALUE *argv,
if (var) *var = Qnil;
}
}
+
/* capture variable length arguments */
if (f_var) {
int n_var = argc - argi - n_trail;
@@ -311,17 +314,20 @@ rb_scan_args_set(int kw_flag, int argc, const VALUE *argv,
if (var) *var = rb_ary_new();
}
}
+
/* capture trailing mandatory arguments */
- for (i = n_trail; i-- > 0; ) {
+ for (i = 0; i < n_trail; i++) {
var = rb_scan_args_next_param();
if (var) *var = argv[argi];
argi++;
}
+
/* capture an option hash - phase 2: assignment */
if (f_hash) {
var = rb_scan_args_next_param();
if (var) *var = hash;
}
+
/* capture iterator block */
if (f_block) {
var = rb_scan_args_next_param();
@@ -333,12 +339,12 @@ rb_scan_args_set(int kw_flag, int argc, const VALUE *argv,
}
}
- if (argi < argc) {
- argc_error:
- rb_error_arity(argc, n_mand, f_var ? UNLIMITED_ARGUMENTS : n_mand + n_opt);
+ if (argi == argc) {
+ return argc;
}
- return argc;
+ argc_error:
+ rb_error_arity(argc, n_mand, f_var ? UNLIMITED_ARGUMENTS : n_mand + n_opt);
#undef rb_scan_args_next_param
}