From c9acde01b456c40967ce0b466af8e6847564de7a Mon Sep 17 00:00:00 2001 From: Rahmadi Trimananda Date: Tue, 18 Jun 2019 20:24:15 -0700 Subject: [PATCH] A proper implementation of getGenericReturnType using the class ParameterizedTypeImpl. --- examples/Reflection.java | 8 ++++---- src/main/gov/nasa/jpf/vm/MethodInfo.java | 5 ++--- .../nasa/jpf/vm/JPF_java_lang_reflect_Method.java | 15 +++++++++++---- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/examples/Reflection.java b/examples/Reflection.java index fe2927c..0ce09bb 100644 --- a/examples/Reflection.java +++ b/examples/Reflection.java @@ -43,12 +43,12 @@ public class Reflection { public static void main(String[] args) { Method[] methods = SampleClass.class.getMethods(); - Type[] parameters = methods[0].getGenericParameterTypes(); + /*Type[] parameters = methods[0].getGenericParameterTypes(); //Type[] parameters = methods[0].getGenericParameterTypes(); for (int i = 0; i < parameters.length; i++) { System.out.println(parameters[i]); } - System.out.println(); + System.out.println();*/ /*Class[] parameterTypes = methods[0].getParameterTypes(); for(Class parameterType: parameterTypes){ System.out.println(parameterType.getName()); @@ -62,9 +62,9 @@ public class Reflection { }*/ System.out.println(); - /* + Type returnType = methods[0].getGenericReturnType(); - System.out.println(returnType);*/ + System.out.println(returnType); } } diff --git a/src/main/gov/nasa/jpf/vm/MethodInfo.java b/src/main/gov/nasa/jpf/vm/MethodInfo.java index 1a51c47..ce78281 100644 --- a/src/main/gov/nasa/jpf/vm/MethodInfo.java +++ b/src/main/gov/nasa/jpf/vm/MethodInfo.java @@ -588,11 +588,10 @@ public class MethodInfo extends InfoObject implements GenericSignatureHolder { return Types.getReturnTypeName(signature); } - // TODO: Fix for Groovy's model-checking public String getGenericReturnTypeName () { - return Types.getGenericReturnTypeName(signature); + return Types.getGenericReturnTypeName(genericSignature); } - + public String getSourceFileName () { if (ci != null) { return ci.getSourceFileName(); 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 efb46e8..0fcc830 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 @@ -199,12 +199,19 @@ public class JPF_java_lang_reflect_Method extends NativePeer { MethodInfo mi = getMethodInfo(env, objRef); ThreadInfo ti = env.getThreadInfo(); - ClassInfo ci = ClassLoaderInfo.getCurrentResolvedClassInfo(mi.getReturnTypeName()); - if (!ci.isRegistered()) { - ci.registerClass(ti); + String returnTypeName = mi.getGenericReturnTypeName(); + int retRef; + if (Types.isGenericSignature(returnTypeName)) { + retRef = getParameterizedTypeImplObj(returnTypeName, env); + } else { + ClassInfo ci = ClassLoaderInfo.getCurrentResolvedClassInfo(returnTypeName); + if (!ci.isRegistered()) { + ci.registerClass(ti); + } + retRef = ci.getClassObjectRef(); } - return ci.getClassObjectRef(); + return retRef; } // TODO: Fix for Groovy's model-checking // TODO: We have been able to only register the generic class and not yet the parameterized types -- 2.34.1