diff --git a/mrbgems/mruby-struct/src/struct.c b/mrbgems/mruby-struct/src/struct.c index 94b3dd159..43d3890a8 100644 --- a/mrbgems/mruby-struct/src/struct.c +++ b/mrbgems/mruby-struct/src/struct.c @@ -58,14 +58,16 @@ struct_s_members(mrb_state *mrb, struct RClass *c) static mrb_value struct_members(mrb_state *mrb, mrb_value s) { - if (!mrb_struct_p(s) || RSTRUCT_LEN(s) == 0) { + if (!mrb_struct_p(s)) { struct_corrupted(mrb); } mrb_value members = struct_s_members(mrb, mrb_obj_class(mrb, s)); - if (RSTRUCT_LEN(s) != RARRAY_LEN(members)) { + mrb_int len = RSTRUCT_LEN(s); + mrb_int mlen = RARRAY_LEN(members); + if (len > 0 && len != mlen) { mrb_raisef(mrb, E_TYPE_ERROR, "struct size differs (%i required %i given)", - RARRAY_LEN(members), RSTRUCT_LEN(s)); + mlen, len); } return members; } @@ -350,18 +352,20 @@ struct_aref_sym(mrb_state *mrb, mrb_value obj, mrb_sym id) { mrb_value members, *ptr; const mrb_value *ptr_members; - mrb_int i, len; + mrb_int i, len, plen; members = struct_members(mrb, obj); ptr_members = RARRAY_PTR(members); len = RARRAY_LEN(members); ptr = RSTRUCT_PTR(obj); - for (i=0; i