changeset 14963:0c2e34446bd7

Check for correct classloader before returning cached resolved type.
author Roland Schatz <roland.schatz@oracle.com>
date Thu, 03 Apr 2014 17:52:10 +0200
parents e4a5b8904695
children e1ce6c66f56e
files graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotSignature.java
diffstat 1 files changed, 19 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotSignature.java	Thu Apr 03 19:25:11 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotSignature.java	Thu Apr 03 17:52:10 2014 +0200
@@ -127,13 +127,30 @@
         return argSlots + (withReceiver ? 1 : 0);
     }
 
+    private static boolean checkValidCache(JavaType type, ResolvedJavaType accessingClass) {
+        if (!(type instanceof ResolvedJavaType)) {
+            return false;
+        }
+
+        if (type instanceof HotSpotResolvedObjectType) {
+            HotSpotResolvedObjectType resolved = (HotSpotResolvedObjectType) type;
+            if (accessingClass == null) {
+                return resolved.mirror().getClassLoader() == null;
+            } else {
+                return resolved.mirror().getClassLoader() == ((HotSpotResolvedObjectType) accessingClass).mirror().getClassLoader();
+            }
+        }
+
+        return true;
+    }
+
     @Override
     public JavaType getParameterType(int index, ResolvedJavaType accessingClass) {
         if (parameterTypes == null) {
             parameterTypes = new JavaType[parameters.size()];
         }
         JavaType type = parameterTypes[index];
-        if (type == null || !(type instanceof ResolvedJavaType)) {
+        if (!checkValidCache(type, accessingClass)) {
             type = runtime().lookupType(parameters.get(index), (HotSpotResolvedObjectType) accessingClass, false);
             parameterTypes[index] = type;
         }
@@ -152,7 +169,7 @@
 
     @Override
     public JavaType getReturnType(ResolvedJavaType accessingClass) {
-        if (returnTypeCache == null || !(returnTypeCache instanceof ResolvedJavaType)) {
+        if (!checkValidCache(returnTypeCache, accessingClass)) {
             returnTypeCache = runtime().lookupType(returnType, (HotSpotResolvedObjectType) accessingClass, false);
         }
         return returnTypeCache;