From 4f125a3f19f66cb3739bf93302be92acb33a4d64 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 11 Apr 2023 14:26:35 +0900 Subject: [PATCH] mruby-struct/struct.c: allow struct size differ from `members` The situation may be caused by `Struct.new(...).alloc` etc. --- mrbgems/mruby-struct/src/struct.c | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) 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