From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS6315 166.70.0.0/16 X-Spam-Status: No, score=-1.7 required=3.0 tests=AWL,BAYES_00,RCVD_IN_XBL, RDNS_NONE shortcircuit=no autolearn=no version=3.3.2 X-Original-To: spew@80x24.org Received: from 80x24.org (unknown [166.70.207.2]) by dcvr.yhbt.net (Postfix) with ESMTP id 8A927633811 for ; Thu, 21 May 2015 02:51:59 +0000 (UTC) From: Eric Wong To: spew@80x24.org Subject: [PATCH 1/2] variable.c: extract common functions for generic ivar indices Date: Thu, 21 May 2015 02:51:41 +0000 Message-Id: <1432176702-9094-1-git-send-email-e@80x24.org> List-Id: * variable.c (iv_index_tbl_make): extract from rb_ivar_set (iv_index_tbl_extend): ditto (iv_index_tbl_newsize): ditto (rb_ivar_set): use extracted functions --- variable.c | 63 ++++++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 43 insertions(+), 20 deletions(-) diff --git a/variable.c b/variable.c index a593437..edb30f4 100644 --- a/variable.c +++ b/variable.c @@ -1163,6 +1163,45 @@ rb_attr_get(VALUE obj, ID id) return rb_ivar_lookup(obj, id, Qnil); } +static st_table * +iv_index_tbl_make(VALUE obj) +{ + VALUE klass = rb_obj_class(obj); + st_table *iv_index_tbl = RCLASS_IV_INDEX_TBL(klass); + + if (!iv_index_tbl) { + iv_index_tbl = RCLASS_IV_INDEX_TBL(klass) = st_init_numtable(); + } + + return iv_index_tbl; +} + +static int +iv_index_tbl_extend(st_table *iv_index_tbl, ID id, st_data_t *index) +{ + if (st_lookup(iv_index_tbl, (st_data_t)id, index)) { + return 0; + } + *index = iv_index_tbl->num_entries; + if (*index >= INT_MAX) { + rb_raise(rb_eArgError, "too many instance variables"); + } + st_add_direct(iv_index_tbl, (st_data_t)id, *index); + return 1; +} + +static long +iv_index_tbl_newsize(st_table *iv_index_tbl, st_data_t index, int ivar_extended) +{ + long newsize = (index+1) + (index+1)/4; /* (index+1)*1.25 */ + + if (!ivar_extended && + iv_index_tbl->num_entries < (st_index_t)newsize) { + newsize = iv_index_tbl->num_entries; + } + return newsize; +} + VALUE rb_ivar_set(VALUE obj, ID id, VALUE val) { @@ -1175,21 +1214,8 @@ rb_ivar_set(VALUE obj, ID id, VALUE val) if (SPECIAL_CONST_P(obj)) goto generic; switch (BUILTIN_TYPE(obj)) { case T_OBJECT: - iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj); - if (!iv_index_tbl) { - VALUE klass = rb_obj_class(obj); - iv_index_tbl = RCLASS_IV_INDEX_TBL(klass); - if (!iv_index_tbl) { - iv_index_tbl = RCLASS_IV_INDEX_TBL(klass) = st_init_numtable(); - } - } - ivar_extended = 0; - if (!st_lookup(iv_index_tbl, (st_data_t)id, &index)) { - index = iv_index_tbl->num_entries; - if (index >= INT_MAX) rb_raise(rb_eArgError, "too many instance variables"); - st_add_direct(iv_index_tbl, (st_data_t)id, index); - ivar_extended = 1; - } + iv_index_tbl = iv_index_tbl_make(obj); + ivar_extended = iv_index_tbl_extend(iv_index_tbl, id, &index); len = ROBJECT_NUMIV(obj); if (len <= (long)index) { VALUE *ptr = ROBJECT_IVPTR(obj); @@ -1202,11 +1228,8 @@ rb_ivar_set(VALUE obj, ID id, VALUE val) } else { VALUE *newptr; - long newsize = (index+1) + (index+1)/4; /* (index+1)*1.25 */ - if (!ivar_extended && - iv_index_tbl->num_entries < (st_index_t)newsize) { - newsize = iv_index_tbl->num_entries; - } + long newsize = iv_index_tbl_newsize(iv_index_tbl, index, + ivar_extended); if (RBASIC(obj)->flags & ROBJECT_EMBED) { newptr = ALLOC_N(VALUE, newsize); -- EW