Fixing a new bug: Considering parameters with Type and Type array, e.g., T and T[].
[jpf-core.git] / src / peers / gov / nasa / jpf / vm / JPF_java_lang_reflect_Method.java
index 3baa165..05c049f 100644 (file)
@@ -128,7 +128,12 @@ public class JPF_java_lang_reflect_Method extends NativePeer {
 
     // Get field information and fill out the fields
     String clsSig = Types.getArrayClassName(signature);
-    int paramTypeRef = getParameterizedTypeImplObj(clsSig, env, objRef, mi);
+    int paramTypeRef;
+    if (Types.isParameterWithType(clsSig)) {
+      paramTypeRef = getTypeVariableImplObject(env, objRef, clsSig);
+    } else {
+      paramTypeRef = getParameterizedTypeImplObj(clsSig, env, objRef, mi);
+    }
     ei.setReferenceField("genericComponentType", paramTypeRef);
 
     return genArrRef;
@@ -266,6 +271,8 @@ public class JPF_java_lang_reflect_Method extends NativePeer {
     String[] argTypeNames = mi.getArgumentGenericTypeNames();
     int[] ar = new int[argTypeNames.length];
 
+    String classGenericSig = mi.getClassInfo().getGenericSignature();
+    String methodGenericSig = mi.getGenericSignature();
     for (int i = 0; i < argTypeNames.length; i++) {
       // Change this into just the generic class type if it is a generic class
       if (Types.isGenericSignature(argTypeNames[i])) {
@@ -275,6 +282,14 @@ public class JPF_java_lang_reflect_Method extends NativePeer {
         } else {
           ar[i] = getParameterizedTypeImplObj(argTypeNames[i], env, objRef, mi);
         }
+      } else if (Types.isTypeParameter(argTypeNames[i], methodGenericSig) ||
+                 Types.isTypeParameter(argTypeNames[i], classGenericSig)) {
+        if (Types.isArraySignature(argTypeNames[i])) {
+          // Generic array
+          ar[i] = getGenericArrayTypeImplObj(argTypeNames[i], env, objRef, mi);
+        } else {
+          ar[i] = getTypeVariableImplObject(env, objRef, argTypeNames[i]);
+        }
       } else {
         ClassInfo ci = ClassLoaderInfo.getCurrentResolvedClassInfo(argTypeNames[i]);
         if (!ci.isRegistered()) {
@@ -300,13 +315,25 @@ public class JPF_java_lang_reflect_Method extends NativePeer {
     MethodInfo mi = getMethodInfo(env, objRef);
     ThreadInfo ti = env.getThreadInfo();
 
+    String genRetType = mi.getGenericReturnTypeName();
+    String classGenericSig = mi.getClassInfo().getGenericSignature();
+    String methodGenericSig = mi.getGenericSignature();
     int retRef;
-    if (Types.isGenericSignature(mi.getGenericReturnTypeName())) {
-      if (Types.isArraySignature(mi.getGenericReturnTypeName())) {
+
+    if (Types.isGenericSignature(genRetType)) {
+      if (Types.isArraySignature(genRetType)) {
+        // Generic array
+        retRef = getGenericArrayTypeImplObj(genRetType, env, objRef, mi);
+      } else {
+        retRef = getParameterizedTypeImplObj(genRetType, env, objRef, mi);
+      }
+    } else if (Types.isTypeParameter(genRetType, methodGenericSig) ||
+               Types.isTypeParameter(genRetType, classGenericSig)) {
+      if (Types.isArraySignature(genRetType)) {
         // Generic array
-        retRef = getGenericArrayTypeImplObj(mi.getGenericReturnTypeName(), env, objRef, mi);
+        retRef = getGenericArrayTypeImplObj(genRetType, env, objRef, mi);
       } else {
-        retRef = getParameterizedTypeImplObj(mi.getGenericReturnTypeName(), env, objRef, mi);
+        retRef = getTypeVariableImplObject(env, objRef, genRetType);
       }
     } else {
       ClassInfo ci = ClassLoaderInfo.getCurrentResolvedClassInfo(mi.getReturnTypeName());