diff options
author | 卜部昌平 <shyouhei@ruby-lang.org> | 2020-05-20 15:44:37 +0900 |
---|---|---|
committer | 卜部昌平 <shyouhei@ruby-lang.org> | 2020-05-21 09:58:54 +0900 |
commit | 43725c60915753a88224583fafc87c0bac7c5422 (patch) | |
tree | f8a5d8511071d52f2e9629012e3ef481155dea16 /include | |
parent | 140d4e4a5fb4480feeb59565464f197e6a09587d (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.h | 20 |
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 } |