mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Update mrb_get_args() keyword argument support [incompatible]
* `mrb_kwargs` structure reordered (`values` and `rest` come last) * take symbols instead of C `char*`
This commit is contained in:
+8
-8
@@ -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) */
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
+4
-4
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user