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;h=4e1987be755d85a5e84ad57f9fc61565f99e39af;hp=8d13a0c9462dccaf375df369fb627ccf57c8441c;hb=983dbabe92639b1ebe21e1af6a43daa2f365f847;hpb=28c066f86c2cd268b8c9b9959161e3d07c6146c6 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 8d13a0c..4e1987b 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 @@ -86,7 +86,7 @@ public class JPF_java_lang_reflect_Method extends NativePeer { MethodInfo mi = getMethodInfo(env, objRef); return mi.getModifiers(); } - + static int getParameterTypes( MJIEnv env, MethodInfo mi) { ThreadInfo ti = env.getThreadInfo(); String[] argTypeNames = mi.getArgumentTypeNames(); @@ -108,12 +108,62 @@ public class JPF_java_lang_reflect_Method extends NativePeer { return aRef; } - + @MJI public int getParameterTypes_____3Ljava_lang_Class_2 (MJIEnv env, int objRef){ return getParameterTypes(env, getMethodInfo(env, objRef)); } - + + // TODO: Fix for Groovy's model-checking + // TODO: We have been able to only register the generic class and not yet 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)); + } + + @MJI + public int getGenericReturnType____Ljava_lang_reflect_Type_2 (MJIEnv env, int 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 have been able to only register the generic class and not yet the parameterized types + int getExceptionTypes(MJIEnv env, MethodInfo mi) { ThreadInfo ti = env.getThreadInfo(); String[] exceptionNames = mi.getThrownExceptionClassNames();