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 --- struct.c | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) (limited to 'struct.c') 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