Fixing JPF for methodMissing() method in Groovy: 1) Bug in detecting the array type...
authorrtrimana <rtrimana@uci.edu>
Mon, 8 Jul 2019 20:42:33 +0000 (13:42 -0700)
committerrtrimana <rtrimana@uci.edu>
Mon, 8 Jul 2019 20:42:33 +0000 (13:42 -0700)
examples/Reflection.java
examples/SunClassLoader.java
src/main/gov/nasa/jpf/vm/ClassInfo.java
src/main/gov/nasa/jpf/vm/Types.java
src/peers/gov/nasa/jpf/vm/JPF_java_lang_ClassLoader.java

index e486890..801940e 100644 (file)
@@ -12,6 +12,8 @@ import java.util.Collection;
 import java.math.BigInteger;
 import java.security.ProtectionDomain;
 
+import java.beans.Introspector;
+
 public class Reflection {
 
     interface GenericSuperShort<XYZ> {
@@ -52,14 +54,22 @@ public class Reflection {
           }*/
        }
 
-   public static void main(String[] args) {
+   public static void main(String[] args) throws Exception {
           
          //BigInteger bi = new BigInteger("-1");
          //System.out.println(bi);
-         StringBuilder sb = new StringBuilder(0);
+         /*StringBuilder sb = new StringBuilder(0);
          sb.append('[');
          sb.append(']');
-         System.out.println(sb.toString());
+         System.out.println(sb.toString());*/
+         
+         //Class cls = Class.forName("groovy.runtime.metaclass.Logger.LoggerMetaClass");
+         //Class cls2 = Class.forName("groovy.runtime.metaclass.[Ljava.lang.Object;MetaClass");
+         //Class cls2 = Class.forName("[Ljava.lang.Object;BeanInfo");
+         Class cls = Object[].class;
+         System.out.println("Bean introspection do not ignore bean info: " + cls.getSimpleName());
+         System.out.println("Bean introspection do not ignore bean info: " + cls.getName());
+      Object obj = Introspector.getBeanInfo(cls);
           
          /* TODO: Enumerate all methods in Class.class
       Method[] methods = Collection.class.getMethods();
index 195c3a6..7d022c6 100644 (file)
@@ -9,6 +9,7 @@ import java.util.HashMap;
  * Special class loader, which when running on Sun VM allows to generate accessor classes for any method
  */
 public class SunClassLoader extends ClassLoader implements Opcodes {
+
     private void loadMagic() {
         ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
         cw.visit(Opcodes.V1_4, Opcodes.ACC_PUBLIC, "sun/reflect/GroovyMagic", null, "sun/reflect/MagicAccessorImpl", null);
@@ -34,5 +35,7 @@ public class SunClassLoader extends ClassLoader implements Opcodes {
     public static void main(String[] args) {
         SunClassLoader sun = new SunClassLoader();
         sun.loadMagic();
+        
+        Class cls = sun.loadClass("java/lang/Object");
     }
 }
index abc9499..3ff7ca6 100644 (file)
@@ -1813,6 +1813,12 @@ public class ClassInfo extends InfoObject implements Iterable<MethodInfo>, Gener
   public static boolean isBuiltinClass (String cname) {
     char c = cname.charAt(0);
 
+    // TODO: Fix for Groovy's model-checking
+    // TODO: Handling impossible names in Groovy, e.g., [Ljava.lang.Object;BeanInfo
+    if (cname.indexOf(';') != -1 && cname.indexOf(';') != cname.length() - 1) {
+      return false;
+    }
+
     // array class
     if ((c == '[') || cname.endsWith("[]")) {
       return true;
index 981ac10..2f1cc99 100644 (file)
@@ -769,7 +769,8 @@ public class Types {
       return typeName;
     }
     
-    int i=typeName.indexOf('[');
+       // TODO: Fix for Groovy's model-checking
+    int i=typeName.indexOf("[]");
     if (i>0){ // the sort of "<type>[]"
       StringBuilder sb = new StringBuilder();
       sb.append('[');
index 25a1dcf..f6eb53d 100644 (file)
@@ -112,13 +112,18 @@ public class JPF_java_lang_ClassLoader extends NativePeer {
   public int findSystemClass__Ljava_lang_String_2__Ljava_lang_Class_2 (MJIEnv env, int objRef, int nameRef) {
     String cname = env.getStringObject(nameRef);
 
-    checkForIllegalName(env, cname);
-    if(env.hasException()) {
-      return MJIEnv.NULL;
-    }
-
     ClassLoaderInfo cl = ClassLoaderInfo.getCurrentSystemClassLoader();
 
+    // TODO: Fix for Groovy's model-checking
+    // Get a clean class name and try to resolve
+    ClassInfo cir = cl.getAlreadyResolvedClassInfo(Types.getClassNameFromTypeName(cname));
+    if (cir != null) {
+      checkForIllegalName(env, cname);
+      if(env.hasException()) {
+        return MJIEnv.NULL;
+      }
+    }
+
     ClassInfo ci = cl.getResolvedClassInfo(cname);
 
     if(!ci.isRegistered()) {
@@ -210,6 +215,7 @@ public class JPF_java_lang_ClassLoader extends NativePeer {
     }
 
     if((name.indexOf('/') != -1) || (name.charAt(0) == '[')) {
+      //env.throwException("java.lang.ClassNotFoundException", "IllegalName: " + name);
       env.throwException("java.lang.NoClassDefFoundError", "IllegalName: " + name);
     }
   }