First attempt to add getGenericParameterTypes() and getGenericReturnType(); So far...
[jpf-core.git] / src / peers / gov / nasa / jpf / vm / JPF_java_lang_reflect_Method.java
index 964968d2b32d92519fb29b5925ac26435986250b..2f485e1973b57490c6a32b4685ebbc140013364c 100644 (file)
@@ -115,17 +115,54 @@ public class JPF_java_lang_reflect_Method extends NativePeer {
   }
 
   // TODO: Fix for Groovy's model-checking
   }
 
   // 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){
   @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){
   }
 
   @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: 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();
   
   int getExceptionTypes(MJIEnv env, MethodInfo mi) {
     ThreadInfo ti = env.getThreadInfo();