From 0f3c1ef29fde189572dbc4f7c6484e65fb54dd4b Mon Sep 17 00:00:00 2001 From: rtrimana Date: Mon, 24 Jun 2019 15:56:15 -0700 Subject: [PATCH] Fixing getGenericReturnType to recognize the GenericArrayTypeImpl and ParameterizedTypeImpl recursively. --- examples/Reflection.java | 3 ++- src/main/gov/nasa/jpf/vm/Types.java | 6 +++++- .../gov/nasa/jpf/vm/JPF_java_lang_reflect_Method.java | 10 +++++++++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/examples/Reflection.java b/examples/Reflection.java index e1ea00c..b327158 100644 --- a/examples/Reflection.java +++ b/examples/Reflection.java @@ -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; } } diff --git a/src/main/gov/nasa/jpf/vm/Types.java b/src/main/gov/nasa/jpf/vm/Types.java index 64aec5c..f9723a6 100644 --- a/src/main/gov/nasa/jpf/vm/Types.java +++ b/src/main/gov/nasa/jpf/vm/Types.java @@ -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; 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 299fb61..4fcf1d9 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 @@ -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()) { -- 2.34.1