Feature #10118 ยป 0001-vm.c-allow-to-splat-non-symbol-keys.patch
| test/ruby/test_syntax.rb | ||
|---|---|---|
|
h = {k3: 31}
|
||
|
assert_raise(ArgumentError) {o.kw(**h)}
|
||
|
h = {"k1"=>11, k2: 12}
|
||
|
assert_raise(TypeError) {o.kw(**h)}
|
||
|
assert_raise(ArgumentError) {o.kw(**h)}
|
||
|
assert_equal({"k1"=>11, :"k2"=>12, :"k3"=>31}, {k3: 31, **h})
|
||
|
assert_equal({"k1"=>11, :"k2"=>12}, {**h})
|
||
|
end
|
||
|
def test_keyword_self_reference
|
||
| vm.c | ||
|---|---|---|
|
static int
|
||
|
kwmerge_i(VALUE key, VALUE value, VALUE hash)
|
||
|
{
|
||
|
if (!SYMBOL_P(key)) Check_Type(key, T_SYMBOL);
|
||
|
if (st_update(RHASH_TBL_RAW(hash), key, kwmerge_ii, (st_data_t)value) == 0) { /* !existing */
|
||
|
RB_OBJ_WRITTEN(hash, Qundef, value);
|
||
|
}
|
||
|
return ST_CONTINUE;
|
||
|
}
|
||
|
static int
|
||
|
kwcheck_i(VALUE key, VALUE value, VALUE hash)
|
||
|
{
|
||
|
if (!SYMBOL_P(key)) Check_Type(key, T_SYMBOL);
|
||
|
return ST_CONTINUE;
|
||
|
}
|
||
|
static VALUE
|
||
|
m_core_hash_merge_kwd(int argc, VALUE *argv, VALUE recv)
|
||
|
{
|
||
| ... | ... | |
|
kw = argv[argc-1];
|
||
|
kw = rb_convert_type(kw, T_HASH, "Hash", "to_hash");
|
||
|
if (argc < 2) hash = kw;
|
||
|
rb_hash_foreach(kw, argc < 2 ? kwcheck_i : kwmerge_i, hash);
|
||
|
else rb_hash_foreach(kw, kwmerge_i, hash);
|
||
|
return hash;
|
||
|
}
|
||