From b1bb65a429163a38c3927155b3d7825aeb584be3 Mon Sep 17 00:00:00 2001 From: rtrimana Date: Fri, 21 Jun 2019 17:05:46 -0700 Subject: [PATCH] Added WildcardTypeImpl implementation (minimal support). --- .../reflectiveObjects/WildcardTypeImpl.java | 15 ++++++----- src/main/gov/nasa/jpf/vm/Types.java | 11 ++++++++ .../jpf/vm/JPF_java_lang_reflect_Method.java | 26 +++++++++++++++++-- ...cs_reflectiveObjects_WildcardTypeImpl.java | 9 +++---- 4 files changed, 48 insertions(+), 13 deletions(-) diff --git a/src/classes/sun/reflect/generics/reflectiveObjects/WildcardTypeImpl.java b/src/classes/sun/reflect/generics/reflectiveObjects/WildcardTypeImpl.java index 1feb20d..865c202 100644 --- a/src/classes/sun/reflect/generics/reflectiveObjects/WildcardTypeImpl.java +++ b/src/classes/sun/reflect/generics/reflectiveObjects/WildcardTypeImpl.java @@ -37,9 +37,6 @@ public class WildcardTypeImpl extends LazyReflectiveObjectGenerator lowerBoundASTs = lbs; } - /** - * Static factory. - */ public static WildcardTypeImpl make(FieldTypeSignature[] ubs, FieldTypeSignature[] lbs, GenericsFactory f) { @@ -55,9 +52,13 @@ public class WildcardTypeImpl extends LazyReflectiveObjectGenerator throw new UnsupportedOperationException(); } - public native Type[] getUpperBounds(); + public Type[] getUpperBounds() { + return upperBounds; + } - public native Type[] getLowerBounds(); + public Type[] getLowerBounds() { + return lowerBounds; + } public String toString() { Type[] lowerBounds = getLowerBounds(); @@ -75,7 +76,9 @@ public class WildcardTypeImpl extends LazyReflectiveObjectGenerator return "?"; } - assert bounds.length > 0; + // TODO: Commented out since it's producing that blocks us from getting a new object without + // TODO: initializing it through the constructor. + //assert bounds.length > 0; boolean first = true; for(Type bound: bounds) { diff --git a/src/main/gov/nasa/jpf/vm/Types.java b/src/main/gov/nasa/jpf/vm/Types.java index 90e7f54..948b42e 100644 --- a/src/main/gov/nasa/jpf/vm/Types.java +++ b/src/main/gov/nasa/jpf/vm/Types.java @@ -1260,5 +1260,16 @@ public class Types { String typeParamSig = parameterizedType.concat(":"); return signature.contains(typeParamSig); } + + public static boolean isWildcardType(String signature) { + return (signature.startsWith("+L") || signature.equals("*")); + } + + public static String getWildcardType(String signature) { + if (signature.equals("*")) { + return "java.lang.Object"; + } + return signature.replace("+L", ""); + } // TODO: Fix for Groovy's model-checking } diff --git a/src/peers/gov/nasa/jpf/vm/JPF_java_lang_reflect_Method.java b/src/peers/gov/nasa/jpf/vm/JPF_java_lang_reflect_Method.java index bf25945..026e54f 100644 --- a/src/peers/gov/nasa/jpf/vm/JPF_java_lang_reflect_Method.java +++ b/src/peers/gov/nasa/jpf/vm/JPF_java_lang_reflect_Method.java @@ -140,8 +140,11 @@ public class JPF_java_lang_reflect_Method extends NativePeer { String methodGenericSig = mi.getGenericSignature(); for(int j = 0; j < parameterizedTypes.length; j++) { if (Types.isTypeParameter(parameterizedTypes[j], methodGenericSig) || - Types.isTypeParameter(parameterizedTypes[j], classGenericSig)) { + Types.isTypeParameter(parameterizedTypes[j], classGenericSig)) { types[j] = getTypeVariableImplObject(env, objRef, parameterizedTypes[j]); + } else if (Types.isWildcardType(parameterizedTypes[j])) { + String wildcardType = Types.getWildcardType(parameterizedTypes[j]); + types[j] = getWildcardTypeImplObject(env, objRef, wildcardType); } else { ClassInfo pci = cli.getResolvedClassInfo(parameterizedTypes[j]); if (!pci.isRegistered()) { @@ -172,6 +175,26 @@ public class JPF_java_lang_reflect_Method extends NativePeer { return paramTypeRef; } + private static int getWildcardTypeImplObject(MJIEnv env, int objRef, String wildcardType) { + ThreadInfo ti = env.getThreadInfo(); + ClassLoaderInfo cli = env.getSystemClassLoaderInfo(); + ClassInfo ci = cli.getResolvedClassInfo("sun.reflect.generics.reflectiveObjects.WildcardTypeImpl"); + + int wildcardRef = env.newObject(ci); + ElementInfo ei = env.getModifiableElementInfo(wildcardRef); + int uRef = env.newObjectArray("Ljava/lang/reflect/Type;", 1); + ClassInfo uci = cli.getResolvedClassInfo(wildcardType); + if (!uci.isRegistered()) { + uci.registerClass(ti); + } + env.setReferenceArrayElement(uRef, 0, uci.getClassObjectRef()); + ei.setReferenceField("upperBounds", uRef); + int lRef = env.newObjectArray("Ljava/lang/reflect/Type;", 0); + ei.setReferenceField("lowerBounds", lRef); + + return wildcardRef; + } + private static int getTypeVariableImplObject(MJIEnv env, int objRef, String parameterizedType) { ClassLoaderInfo cli = env.getSystemClassLoaderInfo(); @@ -188,7 +211,6 @@ public class JPF_java_lang_reflect_Method extends NativePeer { static int getGenericParameterTypes( MJIEnv env, int objRef, MethodInfo mi) { ThreadInfo ti = env.getThreadInfo(); - String name = mi.getName(); String[] argTypeNames = mi.getArgumentGenericTypeNames(); int[] ar = new int[argTypeNames.length]; diff --git a/src/peers/gov/nasa/jpf/vm/JPF_sun_reflect_generics_reflectiveObjects_WildcardTypeImpl.java b/src/peers/gov/nasa/jpf/vm/JPF_sun_reflect_generics_reflectiveObjects_WildcardTypeImpl.java index 89bab39..b5ec06e 100644 --- a/src/peers/gov/nasa/jpf/vm/JPF_sun_reflect_generics_reflectiveObjects_WildcardTypeImpl.java +++ b/src/peers/gov/nasa/jpf/vm/JPF_sun_reflect_generics_reflectiveObjects_WildcardTypeImpl.java @@ -20,11 +20,10 @@ package gov.nasa.jpf.vm; import gov.nasa.jpf.annotation.MJI; -public class JPF_sun_reflect_generics_reflectiveObjects_WildcardTypeImpl { +public class JPF_sun_reflect_generics_reflectiveObjects_WildcardTypeImpl extends NativePeer { - // TODO: Need to fix the following 2 methods!!! - - @MJI + // TODO: Need to fix the following 2 methods if needed!!! + /*@MJI public int getUpperBounds_____3Ljava_lang_reflect_Type_2 (MJIEnv env, int objRef){ ThreadInfo ti = env.getThreadInfo(); ClassInfo ci = ClassLoaderInfo.getCurrentResolvedClassInfo("java.lang.Object"); @@ -48,5 +47,5 @@ public class JPF_sun_reflect_generics_reflectiveObjects_WildcardTypeImpl { env.setReferenceArrayElement(aRef, 0, MJIEnv.NULL); return aRef; - } + }*/ } -- 2.34.1