X-Git-Url: http://plrg.eecs.uci.edu/git/?p=jpf-core.git;a=blobdiff_plain;f=src%2Fpeers%2Fgov%2Fnasa%2Fjpf%2Fvm%2FJPF_java_lang_reflect_Method.java;fp=src%2Fpeers%2Fgov%2Fnasa%2Fjpf%2Fvm%2FJPF_java_lang_reflect_Method.java;h=2f485e1973b57490c6a32b4685ebbc140013364c;hp=964968d2b32d92519fb29b5925ac26435986250b;hb=3f0d5734e04323c9734cbb0942f6285cc6afcb68;hpb=af70e60350d4959e783bd2177dffe0ea087c446c 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 964968d..2f485e1 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 @@ -115,17 +115,54 @@ public class JPF_java_lang_reflect_Method extends NativePeer { } // TODO: Fix for Groovy's model-checking + // TODO: We haven't been able to show the parameterized types + static int getGenericParameterTypes( MJIEnv env, MethodInfo mi) { + ThreadInfo ti = env.getThreadInfo(); + String[] argTypeNames = mi.getArgumentGenericTypeNames(); + int[] ar = new int[argTypeNames.length]; + + for (int i = 0; i < argTypeNames.length; i++) { + // Change this into just the generic class type if it is a generic class + String genericTypeName = argTypeNames[i]; + int startOfGenericParameter = argTypeNames[i].indexOf('<'); + if (startOfGenericParameter != -1) { + genericTypeName = argTypeNames[i].substring(0, startOfGenericParameter); + } + ClassInfo ci = ClassLoaderInfo.getCurrentResolvedClassInfo(genericTypeName); + if (!ci.isRegistered()) { + ci.registerClass(ti); + } + + ar[i] = ci.getClassObjectRef(); + } + + int aRef = env.newObjectArray("Ljava/lang/reflect/Type;", argTypeNames.length); + for (int i = 0; i < argTypeNames.length; i++) { + env.setReferenceArrayElement(aRef, i, ar[i]); + } + + return aRef; + } + @MJI public int getGenericParameterTypes_____3Ljava_lang_reflect_Type_2 (MJIEnv env, int objRef){ - //return getGenericParameterTypes(env, getMethodInfo(env, objRef)); - return getParameterTypes_____3Ljava_lang_Class_2 (env, objRef); + return getGenericParameterTypes(env, getMethodInfo(env, objRef)); } @MJI public int getGenericReturnType____Ljava_lang_reflect_Type_2 (MJIEnv env, int objRef){ - return getReturnType____Ljava_lang_Class_2(env, objRef); + MethodInfo mi = getMethodInfo(env, objRef); + ThreadInfo ti = env.getThreadInfo(); + + ClassInfo ci = ClassLoaderInfo.getCurrentResolvedClassInfo(mi.getReturnTypeName()); + if (!ci.isRegistered()) { + ci.registerClass(ti); + } + + return ci.getClassObjectRef(); } // TODO: Fix for Groovy's model-checking + // TODO: We haven't been able to show the parameterized types int getExceptionTypes(MJIEnv env, MethodInfo mi) { ThreadInfo ti = env.getThreadInfo();