diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-09-01 22:30:57 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-10-12 18:20:10 +0900 |
| commit | 87c7064bad4fb9403ebf4b72be33f2dc51fa46db (patch) | |
| tree | 83ac769e553a9270ec3983336dfadf2cd2b3eaab | |
| parent | 4cf1da9542d6554ec23de6324c5f2d5eebe138c9 (diff) | |
| download | mruby-87c7064bad4fb9403ebf4b72be33f2dc51fa46db.tar.gz mruby-87c7064bad4fb9403ebf4b72be33f2dc51fa46db.zip | |
Update `mrb_get_args()` keyword argument support [incompatible]
* `mrb_kwargs` structure reordered (`values` and `rest` come last)
* take symbols instead of C `char*`
| -rw-r--r-- | include/mruby.h | 16 | ||||
| -rw-r--r-- | src/class.c | 8 |
2 files changed, 12 insertions, 12 deletions
diff --git a/include/mruby.h b/include/mruby.h index e417dc840..72720496e 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -929,7 +929,7 @@ typedef const char *mrb_args_format; * const char *kw_names[kw_num] = { "a", "b" }; * uint32_t kw_required = 0; * mrb_value kw_values[kw_num]; - * const mrb_kwargs kwargs = { kw_num, kw_values, kw_names, kw_required, NULL }; + * const mrb_kwargs kwargs = { kw_num, kw_required, kw_names, kw_values, NULL }; * * mrb_get_args(mrb, ":", &kwargs); * if (mrb_undef_p(kw_values[0])) { kw_values[0] = mrb_fixnum_value(1); } @@ -940,10 +940,10 @@ typedef const char *mrb_args_format; * * mrb_value str, kw_rest; * uint32_t kw_num = 3; - * const char *kw_names[kw_num] = { "x", "y", "z" }; + * const mrb_sym kw_names[kw_num] = { MRB_SYM(x), MRB_SYM(y), MRB_SYM(z) }; * uint32_t kw_required = 1; * mrb_value kw_values[kw_num]; - * const mrb_kwargs kwargs = { kw_num, kw_values, kw_names, kw_required, &kw_rest }; + * const mrb_kwargs kwargs = { kw_num, kw_required, kw_names, kw_values, &kw_rest }; * * mrb_get_args(mrb, "S:", &str, &kwargs); * // or: mrb_get_args(mrb, ":S", &kwargs, &str); @@ -954,11 +954,11 @@ typedef struct mrb_kwargs mrb_kwargs; struct mrb_kwargs { - uint32_t num; - mrb_value *values; - const char *const *table; - uint32_t required; - mrb_value *rest; + uint32_t num; /* number of keyword arguments */ + uint32_t required; /* number of required keyword arguments */ + mrb_sym *table; /* C array of symbols for keyword names */ + mrb_value *values; /* keyword argument values */ + mrb_value *rest; /* keyword rest (dict) */ }; /** diff --git a/src/class.c b/src/class.c index 668f9a6ce..e8f9b7638 100644 --- a/src/class.c +++ b/src/class.c @@ -1254,7 +1254,7 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) else { uint32_t kwnum = kwargs->num; uint32_t required = kwargs->required; - const char *const *kname = kwargs->table; + const mrb_sym *kname = kwargs->table; mrb_value *values = kwargs->values; uint32_t j; const uint32_t keyword_max = 40; @@ -1264,16 +1264,16 @@ mrb_get_args(mrb_state *mrb, const char *format, ...) } for (j = required; j > 0; j --, kname ++, values ++) { - mrb_value k = mrb_symbol_value(mrb_intern_cstr(mrb, *kname)); + mrb_value k = mrb_symbol_value(*kname); if (!mrb_hash_key_p(mrb, ksrc, k)) { - mrb_raisef(mrb, E_ARGUMENT_ERROR, "missing keyword: %s", *kname); + mrb_raisef(mrb, E_ARGUMENT_ERROR, "missing keyword: %n", *kname); } *values = mrb_hash_delete_key(mrb, ksrc, k); mrb_gc_protect(mrb, *values); } for (j = kwnum - required; j > 0; j --, kname ++, values ++) { - mrb_value k = mrb_symbol_value(mrb_intern_cstr(mrb, *kname)); + mrb_value k = mrb_symbol_value(*kname); if (mrb_hash_key_p(mrb, ksrc, k)) { *values = mrb_hash_delete_key(mrb, ksrc, k); mrb_gc_protect(mrb, *values); |
