summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-struct/src/struct.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-05-29 11:57:39 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-05-29 11:57:39 +0900
commitf38e53eccacbd413bf567a97e6e0ec2941e2e85c (patch)
tree9000f8a1bfc9c4bc7fecdb423853ce15f5de7575 /mrbgems/mruby-struct/src/struct.c
parent415b8fc6b0cafee662232fa080e576f0b2395eba (diff)
parent32bfa1f15c008628f93c017c7e6e07eb4b3cdeed (diff)
downloadmruby-f38e53eccacbd413bf567a97e6e0ec2941e2e85c.tar.gz
mruby-f38e53eccacbd413bf567a97e6e0ec2941e2e85c.zip
Merge pull request #2330 from take-cheeze/struct_set_str
Improve `Struct#[]=`.
Diffstat (limited to 'mrbgems/mruby-struct/src/struct.c')
-rw-r--r--mrbgems/mruby-struct/src/struct.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/mrbgems/mruby-struct/src/struct.c b/mrbgems/mruby-struct/src/struct.c
index a15655dbb..6894ffec9 100644
--- a/mrbgems/mruby-struct/src/struct.c
+++ b/mrbgems/mruby-struct/src/struct.c
@@ -660,11 +660,19 @@ 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);
}
- 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,