Adding upperBounds and lowerBounds extraction for 'super' and 'extends'.
authorRahmadi Trimananda <rtrimana@uci.edu>
Sat, 22 Jun 2019 23:27:54 +0000 (16:27 -0700)
committerRahmadi Trimananda <rtrimana@uci.edu>
Sat, 22 Jun 2019 23:27:54 +0000 (16:27 -0700)
examples/Reflection.java
src/main/gov/nasa/jpf/vm/Types.java
src/peers/gov/nasa/jpf/vm/JPF_java_lang_reflect_Method.java

index 568743683d21f3a328d748972ebcaacaa1fbc603..f446b4bf4644f9e8d27c36b618a11d6504ff28eb 100644 (file)
@@ -24,7 +24,8 @@ public class Reflection {
     class SampleClass<VWXZ> {
         private String sampleField;
 
-        public Class<?> setSampleField(Class<?> clazz, 
+        public Class<?> setSampleField(Class<?> clazz,
+                       Class<? extends List> list, Class<? super Map> map,
                        List<String> listString, Map<Integer,String> mapString, 
                        Generic<Integer,String,Double,Short,Float> test, 
                        String sampleField, int one, short two, double three, Object obj) {
index 61a17a88d6053e592cb327dd9e026f0ebecdf731..c29cb1da08e4b9aef044a550418c850e4048db33 100644 (file)
@@ -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
 }
index 026e54fc843a1621328053ce813947dcfe994f5d..4aa670d5d37a8f25f8b680ea7df29bc2aeffdfc7 100644 (file)
@@ -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;