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

ruby-changes:20299

From: ko1 <ko1@a...>
Date: Fri, 1 Jul 2011 08:23:39 +0900 (JST)
Subject: [ruby-changes:20299] ko1:r32347 (trunk): * vm_insnhelper.c (vm_getivar): check vm state version

ko1	2011-07-01 08:23:32 +0900 (Fri, 01 Jul 2011)

  New Revision: 32347

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=32347

  Log:
    * vm_insnhelper.c (vm_getivar): check vm state version
      to invalidate inline chache (ivar index).
      fixes Bug #4926.
    * vm_insnhelper.c (vm_setivar): ditto.

  Modified files:
    trunk/ChangeLog
    trunk/vm_insnhelper.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 32346)
+++ ChangeLog	(revision 32347)
@@ -1,3 +1,11 @@
+Fri Jul  1 08:21:28 2011  Koichi Sasada  <ko1@a...>
+
+	* vm_insnhelper.c (vm_getivar): check vm state version
+	  to invalidate inline chache (ivar index).
+	  fixes Bug #4926.
+
+	* vm_insnhelper.c (vm_setivar): ditto.
+
 Fri Jul  1 08:03:15 2011  Nobuyoshi Nakada  <nobu@r...>
 
 	* error.c, thread_pthread.c (WRITE_CONST): suppress warnings
Index: vm_insnhelper.c
===================================================================
--- vm_insnhelper.c	(revision 32346)
+++ vm_insnhelper.c	(revision 32347)
@@ -1265,7 +1265,8 @@
 	VALUE val = Qundef;
 	VALUE klass = RBASIC(obj)->klass;
 
-	if (ic->ic_class == klass) {
+	if (LIKELY(ic->ic_class == klass &&
+		   ic->ic_vmstat == GET_VM_STATE_VERSION())) {
 	    long index = ic->ic_value.index;
 	    long len = ROBJECT_NUMIV(obj);
 	    VALUE *ptr = ROBJECT_IVPTR(obj);
@@ -1287,6 +1288,7 @@
 		    }
 		    ic->ic_class = klass;
 		    ic->ic_value.index = index;
+		    ic->ic_vmstat = GET_VM_STATE_VERSION();
 		}
 	    }
 	}
@@ -1318,7 +1320,8 @@
 	VALUE klass = RBASIC(obj)->klass;
 	st_data_t index;
 
-	if (ic->ic_class == klass) {
+	if (LIKELY(ic->ic_class == klass &&
+		   ic->ic_vmstat == GET_VM_STATE_VERSION())) {
 	    long index = ic->ic_value.index;
 	    long len = ROBJECT_NUMIV(obj);
 	    VALUE *ptr = ROBJECT_IVPTR(obj);
@@ -1334,6 +1337,7 @@
 	    if (iv_index_tbl && st_lookup(iv_index_tbl, (st_data_t)id, &index)) {
 		ic->ic_class = klass;
 		ic->ic_value.index = index;
+		ic->ic_vmstat = GET_VM_STATE_VERSION();
 	    }
 	    /* fall through */
 	}

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

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