From ff4b73601b95da29ce4ef179da144aad085a80c5 Mon Sep 17 00:00:00 2001 From: normal Date: Fri, 29 May 2015 23:22:40 +0000 Subject: variable.c: extract common functions for generic ivar indices * 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 [ruby-core:69323] (Part 1) git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50676 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 8 ++++++++ variable.c | 63 ++++++++++++++++++++++++++++++++++++++++++-------------------- 2 files changed, 51 insertions(+), 20 deletions(-) diff --git a/ChangeLog b/ChangeLog index b17a9de31a..d9101c8eb7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Sat May 30 08:10:46 2015 Eric Wong + + * 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 + [ruby-core:69323] (Part 1) + Fri May 29 17:39:14 2015 Koichi Sasada * tool/make_hgraph.rb: added. diff --git a/variable.c b/variable.c index a593437540..edb30f45ed 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); -- cgit v1.2.3