From a672fd8be32ea7837e814a2e755241ef805afb81 Mon Sep 17 00:00:00 2001 From: nobu Date: Wed, 1 Jul 2015 00:30:38 +0000 Subject: struct.c: hide internal objects * struct.c (struct_set_members): hide internal back_members object, and members object does not need to be duped as it should be frozen and hidden. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51082 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ struct.c | 30 ++++++++++++++++-------------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/ChangeLog b/ChangeLog index cc0634f792..62f4ad52c6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Wed Jul 1 09:30:36 2015 Nobuyoshi Nakada + + * struct.c (struct_set_members): hide internal back_members + object, and members object does not need to be duped as it + should be frozen and hidden. + Wed Jul 1 09:28:47 2015 Nobuyoshi Nakada * struct.c (struct_member_pos): revert r51080 to fix other diff --git a/struct.c b/struct.c index c7ae830337..2e24e963f9 100644 --- a/struct.c +++ b/struct.c @@ -85,26 +85,25 @@ struct_member_pos_probe(long prev, long mask) } static VALUE -struct_set_members(VALUE klass, VALUE members) +struct_set_members(VALUE klass, VALUE /* frozen hidden array */ members) { VALUE back; + const long members_length = RARRAY_LEN(members); - members = rb_ary_dup(members); - rb_obj_freeze(members); - - if (RARRAY_LEN(members) <= AREF_HASH_THRESHOLD) { + if (members_length <= AREF_HASH_THRESHOLD) { back = members; - } else { + } + else { long i, j, mask = 64; VALUE name; - while (mask < RARRAY_LEN(members) * 5) mask *= 2; + while (mask < members_length * 5) mask *= 2; - back = rb_ary_new2(mask + 1); - rb_ary_store(back, mask, INT2FIX(RARRAY_LEN(members))); + back = rb_ary_tmp_new(mask + 1); + rb_ary_store(back, mask, INT2FIX(members_length)); mask -= 2; /* mask = (2**k-1)*2 */ - for (i=0; i