summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-struct
diff options
context:
space:
mode:
authortake_cheeze <[email protected]>2014-05-28 23:14:28 +0900
committertake_cheeze <[email protected]>2014-05-28 23:14:28 +0900
commit7bc4d08f71950f673d788653c50703263edb61df (patch)
treeb4a9e082a47d7c99fb097d3532131e3ae3454917 /mrbgems/mruby-struct
parent0f432e90284e441c89faae9b5f183932750f469f (diff)
downloadmruby-7bc4d08f71950f673d788653c50703263edb61df.tar.gz
mruby-7bc4d08f71950f673d788653c50703263edb61df.zip
Support string key in `Struct#[]=`.
Diffstat (limited to 'mrbgems/mruby-struct')
-rw-r--r--mrbgems/mruby-struct/src/struct.c8
-rw-r--r--mrbgems/mruby-struct/test/struct.rb2
2 files changed, 10 insertions, 0 deletions
diff --git a/mrbgems/mruby-struct/src/struct.c b/mrbgems/mruby-struct/src/struct.c
index a15655dbb..adac60202 100644
--- a/mrbgems/mruby-struct/src/struct.c
+++ b/mrbgems/mruby-struct/src/struct.c
@@ -660,6 +660,14 @@ mrb_struct_aset(mrb_state *mrb, mrb_value s)
mrb_get_args(mrb, "oo", &idx, &val);
+ if (mrb_string_p(idx)) {
+ mrb_value sym = mrb_check_intern_str(mrb, idx);
+
+ if (mrb_nil_p(sym)) {
+ mrb_raisef(mrb, E_INDEX_ERROR, "no member '%S' in struct", idx);
+ }
+ idx = sym;
+ }
if (mrb_symbol_p(idx)) {
return mrb_struct_aset_sym(mrb, s, mrb_symbol(idx), val);
}
diff --git a/mrbgems/mruby-struct/test/struct.rb b/mrbgems/mruby-struct/test/struct.rb
index b3b9ce33f..1e83ec6b3 100644
--- a/mrbgems/mruby-struct/test/struct.rb
+++ b/mrbgems/mruby-struct/test/struct.rb
@@ -39,6 +39,8 @@ assert('Struct#[]=', '15.2.18.4.3') do
cc = c.new(1,2)
cc[:m1] = 3
cc[:m1] == 3
+ cc["m2"] = 3
+ assert_equal 3, cc["m2"]
end
assert('Struct#each', '15.2.18.4.4') do