Fixing getGenericReturnType to recognize the GenericArrayTypeImpl and ParameterizedTy...
authorrtrimana <rtrimana@uci.edu>
Mon, 24 Jun 2019 22:56:15 +0000 (15:56 -0700)
committerrtrimana <rtrimana@uci.edu>
Mon, 24 Jun 2019 22:56:15 +0000 (15:56 -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 e1ea00c96605b21f2fb228f0d2767d9c594511cd..b32715832912b6b30b60dc1e25510a89f5c6cb26 100644 (file)
@@ -77,7 +77,8 @@ public class Reflection {
          Method method = null;
       for(Method mth : methods) {
         //if (mth.getName().equals("getConstructor")) {
-        if (mth.getName().equals("isAssignableFrom")) {
+        //if (mth.getName().equals("isAssignableFrom")) {
+        if (mth.getName().equals("getTypeParameters")) {
            method = mth;
         }
       }
index 64aec5c886a94f994534b3f94812e3246e1bf165..f9723a6689c36f5c95e27d7c6f5b2ab9586bef8b 100644 (file)
@@ -1222,7 +1222,7 @@ public class Types {
       String typeVarName = "";
       int comma = signature.indexOf(',', pos);
       if (comma == -1) {
-        int closing = signature.indexOf('>', pos);
+        int closing = signature.lastIndexOf('>', signature.length());
         typeVarName = signature.substring(pos + 1, closing);
         pos = signature.length();
       } else {
@@ -1269,6 +1269,10 @@ public class Types {
     return (opening != -1);
   }
 
+  public static boolean isParameterizedType(String signature) {
+    return Types.isGenericSignature(signature);
+  }
+
   public static boolean isArraySignature(String signature) {
     if (signature == null || signature.equals(""))
       return false;
index 299fb619fe13f7e8286ff9bc6e89ce2d86b0136e..4fcf1d93487eb201c3ebcb903415787616f279c4 100644 (file)
@@ -162,6 +162,9 @@ public class JPF_java_lang_reflect_Method extends NativePeer {
         types[j] = getTypeVariableImplObject(env, objRef, parameterizedTypes[j]);
       } else if (Types.isWildcardType(parameterizedTypes[j])) {
         types[j] = getWildcardTypeImplObject(env, objRef, parameterizedTypes[j]);
+      } else if (Types.isParameterizedType(parameterizedTypes[j])) {
+        // Recursion!
+        types[j] = getParameterizedTypeImplObj(parameterizedTypes[j], env, objRef, mi);
       } else {
         ClassInfo pci = cli.getResolvedClassInfo(parameterizedTypes[j]);
         if (!pci.isRegistered()) {
@@ -278,7 +281,12 @@ public class JPF_java_lang_reflect_Method extends NativePeer {
 
     int retRef;
     if (Types.isGenericSignature(mi.getGenericReturnTypeName())) {
-      retRef = getParameterizedTypeImplObj(mi.getGenericReturnTypeName(), env, objRef, mi);
+      if (Types.isArraySignature(mi.getGenericReturnTypeName())) {
+        // Generic array
+        retRef = getGenericArrayTypeImplObj(mi.getGenericReturnTypeName(), env, objRef, mi);
+      } else {
+        retRef = getParameterizedTypeImplObj(mi.getGenericReturnTypeName(), env, objRef, mi);
+      }
     } else {
       ClassInfo ci = ClassLoaderInfo.getCurrentResolvedClassInfo(mi.getReturnTypeName());
       if (!ci.isRegistered()) {