From b3a4367ce40912344310eded05e3d6fa5657330f Mon Sep 17 00:00:00 2001 From: normal Date: Wed, 10 Sep 2014 06:32:44 +0000 Subject: rb_call_info_t: shrink to 96 bytes from 104 bytes on 64-bit This keeps ci->flag and ci->aux.index consistent across 32-bit and 64-bit platforms. ci->flag: VM_CALL_* flags only use 9 bits, currently ci->aux.index: 2 billion ivars per class should be enough for anybody This saves around 50K allocations on "valgrind ruby -e exit" on x86-64 before: total heap usage: 48,122 allocs, 19,253 frees, 8,099,197 bytes allocated after: total heap usage: 48,069 allocs, 19,214 frees, 8,047,266 bytes allocated * vm_core.h (rb_call_info_t): ci->flag becomes 32-bit unsigned int ci->index becomes a 32-bit signed int (from signed long). Reorder for better packing on 64-bit, giving an 8 byte reduction from 104 to 96 bytes for each ci. * compile.c (new_callinfo, setup_args, iseq_compile_each, iseq_build_from_ary_body): adjust for type changes * vm_insnhelper.c (vm_getivar): ditto git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47509 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- variable.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'variable.c') diff --git a/variable.c b/variable.c index f219acd..0f6fba0 100644 --- a/variable.c +++ b/variable.c @@ -1173,6 +1173,10 @@ rb_ivar_set(VALUE obj, ID id, VALUE val) iv_index_tbl->num_entries < (st_index_t)newsize) { newsize = iv_index_tbl->num_entries; } + + /* never happens in practice: */ + if (newsize > INT_MAX) rb_memerror(); + if (RBASIC(obj)->flags & ROBJECT_EMBED) { newptr = ALLOC_N(VALUE, newsize); MEMCPY(newptr, ptr, VALUE, len); -- cgit v1.1