[前][次][番号順一覧][スレッド一覧]

ruby-changes:63558

From: Aaron <ko1@a...>
Date: Tue, 10 Nov 2020 02:44:40 +0900 (JST)
Subject: [ruby-changes:63558] 5582c5a232 (master): Remove iv table size check

https://git.ruby-lang.org/ruby.git/commit/?id=5582c5a232

From 5582c5a2327d824e872f7f5bd22330094f189d66 Mon Sep 17 00:00:00 2001
From: Aaron Patterson <tenderlove@r...>
Date: Fri, 6 Nov 2020 11:33:43 -0800
Subject: Remove iv table size check

iv tables cannot shrink.  If the inline cache was ever set, then there
must be an entry for the instance variable in the iv table.  Just set
the iv list on the object to be equal to the iv index table size, then
set the iv.

diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index f8b2f70..d54a7e3 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -1213,21 +1213,14 @@ vm_setivar(VALUE obj, ID id, VALUE val, const rb_iseq_t *iseq, IVC ic, const str https://github.com/ruby/ruby/blob/trunk/vm_insnhelper.c#L1213
 	    VALUE *ptr = ROBJECT_IVPTR(obj);
 	    index = !is_attr ? ic->entry->index : vm_cc_attr_index(cc)-1;
 
-	    if (index < ROBJECT_NUMIV(obj)) {
-		RB_OBJ_WRITE(obj, &ptr[index], val);
-		RB_DEBUG_COUNTER_INC(ivar_set_ic_hit);
-		return val; /* inline cache hit */
-	    } else {
-                st_table * iv_idx_tbl = RCLASS_IV_INDEX_TBL(rb_class_real(klass));
-                if (index < iv_idx_tbl->num_entries) {
-                    rb_init_iv_list(obj, ROBJECT_NUMIV(obj), iv_idx_tbl->num_entries, iv_idx_tbl);
-                    ptr = ROBJECT_IVPTR(obj);
-                    RB_OBJ_WRITE(obj, &ptr[index], val);
-                    RB_DEBUG_COUNTER_INC(ivar_set_ic_hit);
-                    return val; /* inline cache hit */
-                }
+	    if (index >= ROBJECT_NUMIV(obj)) {
+                st_table * iv_idx_tbl = ROBJECT_IV_INDEX_TBL(obj);
+                rb_init_iv_list(obj, ROBJECT_NUMIV(obj), (uint32_t)iv_idx_tbl->num_entries, iv_idx_tbl);
+                ptr = ROBJECT_IVPTR(obj);
             }
-            RB_DEBUG_COUNTER_INC(ivar_set_ic_miss_oorange);
+            RB_OBJ_WRITE(obj, &ptr[index], val);
+            RB_DEBUG_COUNTER_INC(ivar_set_ic_hit);
+            return val; /* inline cache hit */
 	}
 	else {
 	    struct st_table *iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);
-- 
cgit v0.10.2


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]