summaryrefslogtreecommitdiff
path: root/iseq.c
diff options
context:
space:
mode:
Diffstat (limited to 'iseq.c')
-rw-r--r--iseq.c25
1 files changed, 6 insertions, 19 deletions
diff --git a/iseq.c b/iseq.c
index 381bf6ed20..869ed4da6a 100644
--- a/iseq.c
+++ b/iseq.c
@@ -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);