From 7bc4d08f71950f673d788653c50703263edb61df Mon Sep 17 00:00:00 2001 From: take_cheeze Date: Wed, 28 May 2014 23:14:28 +0900 Subject: Support string key in `Struct#[]=`. --- mrbgems/mruby-struct/src/struct.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'mrbgems/mruby-struct/src/struct.c') 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); } -- cgit v1.2.3 From 32bfa1f15c008628f93c017c7e6e07eb4b3cdeed Mon Sep 17 00:00:00 2001 From: take_cheeze Date: Wed, 28 May 2014 23:21:13 +0900 Subject: Add invalid key type check in `Struct#[]=`. --- mrbgems/mruby-struct/src/struct.c | 2 +- mrbgems/mruby-struct/test/struct.rb | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) (limited to 'mrbgems/mruby-struct/src/struct.c') diff --git a/mrbgems/mruby-struct/src/struct.c b/mrbgems/mruby-struct/src/struct.c index adac60202..6894ffec9 100644 --- a/mrbgems/mruby-struct/src/struct.c +++ b/mrbgems/mruby-struct/src/struct.c @@ -672,7 +672,7 @@ mrb_struct_aset(mrb_state *mrb, mrb_value s) return mrb_struct_aset_sym(mrb, s, mrb_symbol(idx), val); } - i = mrb_fixnum(idx); + i = mrb_int(mrb, idx); if (i < 0) i = RSTRUCT_LEN(s) + i; if (i < 0) { mrb_raisef(mrb, E_INDEX_ERROR, diff --git a/mrbgems/mruby-struct/test/struct.rb b/mrbgems/mruby-struct/test/struct.rb index 1e83ec6b3..f4151c493 100644 --- a/mrbgems/mruby-struct/test/struct.rb +++ b/mrbgems/mruby-struct/test/struct.rb @@ -41,6 +41,7 @@ assert('Struct#[]=', '15.2.18.4.3') do cc[:m1] == 3 cc["m2"] = 3 assert_equal 3, cc["m2"] + assert_raise(TypeError) { cc[[]] = 3 } end assert('Struct#each', '15.2.18.4.4') do -- cgit v1.2.3