Adding upperBounds and lowerBounds extraction for 'super' and 'extends'.
[jpf-core.git] / src / peers / gov / nasa / jpf / vm / JPF_java_lang_reflect_Method.java
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;