diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-08-19 10:49:00 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-10-12 16:21:50 +0900 |
| commit | 20ffc2206ae68545e09cd96b7027055d020a5eb5 (patch) | |
| tree | af6b19435d231f553271b4670794d689ef830544 /mrbgems/mruby-sprintf | |
| parent | caee1f68a200d9df1831c4cf0e1954482c317474 (diff) | |
| download | mruby-20ffc2206ae68545e09cd96b7027055d020a5eb5.tar.gz mruby-20ffc2206ae68545e09cd96b7027055d020a5eb5.zip | |
"backport" CRuby r46756; ref #3500
Based on cremno/mruby@6bd0119
Diffstat (limited to 'mrbgems/mruby-sprintf')
| -rw-r--r-- | mrbgems/mruby-sprintf/src/sprintf.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/mrbgems/mruby-sprintf/src/sprintf.c b/mrbgems/mruby-sprintf/src/sprintf.c index ebb310c89..4df3e3a17 100644 --- a/mrbgems/mruby-sprintf/src/sprintf.c +++ b/mrbgems/mruby-sprintf/src/sprintf.c @@ -192,9 +192,9 @@ check_name_arg(mrb_state *mrb, int posarg, const char *name, size_t len) #define GETNTHARG(nth) \ ((nth >= argc) ? (mrb_raise(mrb, E_ARGUMENT_ERROR, "too few arguments"), mrb_undef_value()) : argv[nth]) -#define GETNAMEARG(id, name, len) (\ +#define CHECKNAMEARG(name, len) (\ check_name_arg(mrb, posarg, name, len),\ - (posarg = -2, mrb_hash_fetch(mrb, get_hash(mrb, &hash, argc, argv), id, mrb_undef_value()))) + posarg = -2) #define GETNUM(n, val) do { \ if (!(p = get_num(mrb, p, end, &(n)))) \ @@ -236,12 +236,12 @@ get_num(mrb_state *mrb, const char *p, const char *end, mrb_int *valp) return p; } -static mrb_value +static void get_hash(mrb_state *mrb, mrb_value *hash, mrb_int argc, const mrb_value *argv) { mrb_value tmp; - if (!mrb_undef_p(*hash)) return *hash; + if (!mrb_undef_p(*hash)) return; if (argc != 2) { mrb_raise(mrb, E_ARGUMENT_ERROR, "one hash required"); } @@ -249,7 +249,7 @@ get_hash(mrb_state *mrb, mrb_value *hash, mrb_int argc, const mrb_value *argv) if (mrb_nil_p(tmp)) { mrb_raise(mrb, E_ARGUMENT_ERROR, "one hash required"); } - return (*hash = tmp); + *hash = tmp; } /* @@ -690,7 +690,6 @@ retry: case '{': { const char *start = p; char term = (*p == '<') ? '>' : '}'; - mrb_value symname; for (; p < end && *p != term; ) p++; @@ -698,10 +697,13 @@ retry: mrb_raisef(mrb, E_ARGUMENT_ERROR, "name%l after <%n>", start, p - start + 1, id); } - symname = mrb_str_new(mrb, start + 1, p - start - 1); - id = mrb_intern_str(mrb, symname); - nextvalue = GETNAMEARG(mrb_symbol_value(id), start, p - start + 1); - if (mrb_undef_p(nextvalue)) { + CHECKNAMEARG(start, p - start + 1); + get_hash(mrb, &hash, argc, argv); + id = mrb_check_intern(mrb, start + 1, p - start - 1); + if (id) { + nextvalue = mrb_hash_fetch(mrb, hash, mrb_symbol_value(id), mrb_undef_value()); + } + if (!id || mrb_undef_p(nextvalue)) { mrb_raisef(mrb, E_KEY_ERROR, "key%l not found", start, p - start + 1); } if (term == '}') goto format_s; |
