From d9457edbede8c87b8f0af4f5eeb5be61d46f2501 Mon Sep 17 00:00:00 2001 From: Rahmadi Trimananda Date: Sat, 22 Jun 2019 16:27:54 -0700 Subject: [PATCH] Adding upperBounds and lowerBounds extraction for 'super' and 'extends'. --- examples/Reflection.java | 3 ++- src/main/gov/nasa/jpf/vm/Types.java | 9 ++++---- .../jpf/vm/JPF_java_lang_reflect_Method.java | 21 +++++++++++++------ 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/examples/Reflection.java b/examples/Reflection.java index 5687436..f446b4b 100644 --- a/examples/Reflection.java +++ b/examples/Reflection.java @@ -24,7 +24,8 @@ public class Reflection { class SampleClass { private String sampleField; - public Class setSampleField(Class clazz, + public Class setSampleField(Class clazz, + Class list, Class map, List listString, Map mapString, Generic test, String sampleField, int one, short two, double three, Object obj) { diff --git a/src/main/gov/nasa/jpf/vm/Types.java b/src/main/gov/nasa/jpf/vm/Types.java index 61a17a8..c29cb1d 100644 --- a/src/main/gov/nasa/jpf/vm/Types.java +++ b/src/main/gov/nasa/jpf/vm/Types.java @@ -1109,9 +1109,10 @@ public class Types { int semicolon = signature.indexOf(';', idx); // TODO: Fix for Groovy's model-checking // Check if this is a generic! - int genericStart = signature.substring(idx,semicolon).indexOf('<'); + String currParam = signature.substring(idx,semicolon); + int genericStart = currParam.indexOf('<'); if (genericStart != -1) { - if (signature.charAt(genericStart + 2) == '*') { + if (currParam.charAt(genericStart + 1) == '*') { semicolon = genericStart + 4; } else { int generic = signature.indexOf('>', semicolon); @@ -1267,14 +1268,14 @@ public class Types { } public static boolean isWildcardType(String signature) { - return (signature.startsWith("+L") || signature.equals("*")); + return (signature.startsWith("+L") || signature.startsWith("-L") || signature.equals("*")); } public static String getWildcardType(String signature) { if (signature.equals("*")) { return "java.lang.Object"; } - return signature.replace("+L", ""); + return signature.replaceAll("\\+L|-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 026e54f..4aa670d 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 @@ -143,8 +143,7 @@ public class JPF_java_lang_reflect_Method extends NativePeer { 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); + types[j] = getWildcardTypeImplObject(env, objRef, parameterizedTypes[j]); } else { ClassInfo pci = cli.getResolvedClassInfo(parameterizedTypes[j]); if (!pci.isRegistered()) { @@ -182,14 +181,24 @@ public class JPF_java_lang_reflect_Method extends NativePeer { int wildcardRef = env.newObject(ci); ElementInfo ei = env.getModifiableElementInfo(wildcardRef); - int uRef = env.newObjectArray("Ljava/lang/reflect/Type;", 1); - ClassInfo uci = cli.getResolvedClassInfo(wildcardType); + String actualType = Types.getWildcardType(wildcardType); + ClassInfo uci = cli.getResolvedClassInfo(actualType); if (!uci.isRegistered()) { uci.registerClass(ti); } - env.setReferenceArrayElement(uRef, 0, uci.getClassObjectRef()); + int uRef = MJIEnv.NULL; + int lRef = MJIEnv.NULL; + if (wildcardType.startsWith("+L") || wildcardType.equals("*")) { + // Set upperBounds + uRef = env.newObjectArray("Ljava/lang/reflect/Type;", 1); + env.setReferenceArrayElement(uRef, 0, uci.getClassObjectRef()); + lRef = env.newObjectArray("Ljava/lang/reflect/Type;", 0); + } else { // wildcardType.startsWith("-L") + // Set lowerBounds + lRef = env.newObjectArray("Ljava/lang/reflect/Type;", 1); + env.setReferenceArrayElement(lRef, 0, uci.getClassObjectRef()); + } ei.setReferenceField("upperBounds", uRef); - int lRef = env.newObjectArray("Ljava/lang/reflect/Type;", 0); ei.setReferenceField("lowerBounds", lRef); return wildcardRef; -- 2.34.1