diff options
Diffstat (limited to 'iseq.c')
-rw-r--r-- | iseq.c | 25 |
1 files changed, 6 insertions, 19 deletions
@@ -2509,33 +2509,20 @@ rb_iseq_disasm(const rb_iseq_t *iseq) attr_index_t rb_estimate_iv_count(VALUE klass, const rb_iseq_t * initialize_iseq) { - bool calls_super = false; - struct rb_id_table * iv_names = rb_id_table_create(0); - VALUE * code = ISEQ_BODY(initialize_iseq)->iseq_encoded; - - for (unsigned int i = 0; i < ISEQ_BODY(initialize_iseq)->iseq_size; ) { - VALUE insn = code[i]; - int original_insn = rb_vm_insn_addr2insn((const void *)insn); + for (unsigned int i = 0; i < ISEQ_BODY(initialize_iseq)->ivc_size; i++) { + IVC cache = (IVC)&ISEQ_BODY(initialize_iseq)->is_entries[i]; - if (BIN(setinstancevariable) == original_insn) { - ID name = (ID)code[i + 1]; - rb_id_table_insert(iv_names, name, Qtrue); + if (cache->iv_set_name) { + rb_id_table_insert(iv_names, cache->iv_set_name, Qtrue); } - else if (BIN(invokesuper) == original_insn) { - calls_super = true; - } - - i += insn_len(original_insn); } attr_index_t count = (attr_index_t)rb_id_table_size(iv_names); - if (calls_super) { - VALUE superclass = rb_class_superclass(klass); - count += RCLASS_EXT(superclass)->max_iv_count; - } + VALUE superclass = rb_class_superclass(klass); + count += RCLASS_EXT(superclass)->max_iv_count; rb_id_table_free(iv_names); |