# HG changeset patch # User Roland Schatz # Date 1396540330 -7200 # Node ID 0c2e34446bd7efaa8d849f6fbe30ed28bd48aa49 # Parent e4a5b8904695e3a9db3c0b538aec52846bc93a89 Check for correct classloader before returning cached resolved type. diff -r e4a5b8904695 -r 0c2e34446bd7 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotSignature.java --- 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;