From af70e60350d4959e783bd2177dffe0ea087c446c Mon Sep 17 00:00:00 2001 From: rtrimana Date: Thu, 13 Jun 2019 12:53:11 -0700 Subject: [PATCH] Cleaning up for the real fixes. --- .gitignore | 1 + examples/Generic.java | 22 +++++++ examples/Reflection.java | 60 +++++++++++++++++ src/classes/java/lang/Class.java | 66 +------------------ src/classes/java/lang/reflect/Method.java | 2 +- .../nasa/jpf/vm/SystemClassLoaderInfo.java | 1 - .../gov/nasa/jpf/vm/JPF_java_lang_Class.java | 51 +------------- .../jpf/vm/JPF_java_lang_reflect_Method.java | 4 +- 8 files changed, 90 insertions(+), 117 deletions(-) create mode 100644 examples/Generic.java create mode 100644 examples/Reflection.java diff --git a/.gitignore b/.gitignore index 50639fd..1950eb1 100644 --- a/.gitignore +++ b/.gitignore @@ -71,3 +71,4 @@ out/ # JIRA plugin atlassian-ide-plugin.xml +/build-default/ diff --git a/examples/Generic.java b/examples/Generic.java new file mode 100644 index 0000000..8f4f1a6 --- /dev/null +++ b/examples/Generic.java @@ -0,0 +1,22 @@ +import java.util.List; +import java.util.ArrayList; + +public class Generic { + + private T t; + + public T returnT(List test) { + return this.t; + } + + public List returnL(List test) { + return test; + } + + public static void main(String[] args) { + + Generic gen = new Generic(); + List list = new ArrayList<>(); + List ret = gen.returnL(list); + } +} diff --git a/examples/Reflection.java b/examples/Reflection.java new file mode 100644 index 0000000..ac04e04 --- /dev/null +++ b/examples/Reflection.java @@ -0,0 +1,60 @@ +import java.lang.reflect.Method; +import java.lang.reflect.Type; +import java.lang.reflect.TypeVariable; + +import java.util.List; +import java.util.ArrayList; + +public class Reflection { + + class Generic { + + } + + class SampleClass { + private String sampleField; + + public String getSampleField() { + return sampleField; + } + + /*public List setSampleField(List listString, + String sampleField, int one, short two, double three, Object obj) { + this.sampleField = sampleField; + return listString; + } + + public void setSampleField(String sampleField) { + this.sampleField = sampleField; + }*/ + + public List setSampleField(List listString) { + return listString; + } + } + + public static void main(String[] args) { + + Method[] methods = SampleClass.class.getMethods(); + /*Type[] parameters = methods[1].getGenericParameterTypes(); + for (int i = 0; i < parameters.length; i++) { + System.out.println(parameters[i]); + } + System.out.println();*/ + Class[] parameterTypes = methods[6].getParameterTypes(); + for(Class parameterType: parameterTypes){ + System.out.println(parameterType.getName()); + + } + System.out.println(); + TypeVariable[] typeParameters = Generic.class.getTypeParameters(); + for(TypeVariable typeVar: typeParameters){ + System.out.println(typeVar); + + } + /*System.out.println(); + Type returnType = methods[1].getGenericReturnType(); + System.out.println(returnType);*/ + } +} + diff --git a/src/classes/java/lang/Class.java b/src/classes/java/lang/Class.java index 6149ba6..0231de7 100644 --- a/src/classes/java/lang/Class.java +++ b/src/classes/java/lang/Class.java @@ -28,11 +28,6 @@ import java.util.Map; import sun.reflect.ConstantPool; import sun.reflect.annotation.AnnotationType; -// TODO: DIRTY HACKS! -import sun.reflect.generics.factory.CoreReflectionFactory; -import sun.reflect.generics.factory.GenericsFactory; -import sun.reflect.generics.repository.ClassRepository; -import sun.reflect.generics.scope.ClassScope; /** * MJI model class for java.lang.Class library abstraction @@ -276,64 +271,9 @@ public final class Class implements Serializable, GenericDeclaration, Type, A native AnnotationType getAnnotationType(); - // TODO: DIRTY HACKS! - //public native TypeVariable>[] getTypeParameters(); - /* - @Override - public TypeVariable>[] getTypeParameters() { - throw new UnsupportedOperationException(); - } - - // Generic info repository; lazily initialized - private volatile transient ClassRepository genericInfo; - - // Generic signature handling - //private native String getGenericSignature0(); - - // accessor for factory - private GenericsFactory getFactory() { - // create scope and factory - return CoreReflectionFactory.make(this, ClassScope.make(this)); - } - - // accessor for generic info repository; - // generic info is lazily initialized - private ClassRepository getGenericInfo() { - ClassRepository genericInfo = this.genericInfo; - if (genericInfo == null) { - //String signature = getGenericSignature0(); - //String signature = "Ljava/lang/Object;"; - String signature = null; - if (signature == null) { - genericInfo = ClassRepository.NONE; - } else { - genericInfo = ClassRepository.make(signature, getFactory()); - } - this.genericInfo = genericInfo; - } - return (genericInfo != ClassRepository.NONE) ? genericInfo : null; - } - - @Override - public TypeVariable>[] getTypeParameters() { - //throw new UnsupportedOperationException(); - ClassRepository info = getGenericInfo(); - if (info != null) - return (TypeVariable>[])info.getTypeParameters(); - else - return (TypeVariable>[])new TypeVariable[0]; - }*/ - @Override - public TypeVariable>[] getTypeParameters() { - //throw new UnsupportedOperationException(); - System.out.println("Calling getTypeParameters for: " + this.name); - TypeVariable[] typeVariables = (TypeVariable>[])new TypeVariable[1]; - //Object obj = new Object(); - //typeVariables[0] = (TypeVariable>) obj; - return typeVariables; - } - // TODO: DIRTY HACKS! - + // TODO: Fix for Groovy's model-checking + public native TypeVariable>[] getTypeParameters(); + public Type getGenericSuperclass() { throw new UnsupportedOperationException(); } diff --git a/src/classes/java/lang/reflect/Method.java b/src/classes/java/lang/reflect/Method.java index 073d874..cc6f57b 100644 --- a/src/classes/java/lang/reflect/Method.java +++ b/src/classes/java/lang/reflect/Method.java @@ -43,7 +43,7 @@ public final class Method extends AccessibleObject implements Member { public native Class[] getParameterTypes(); public native Type[] getGenericParameterTypes(); public native Class[] getExceptionTypes(); - // TODO: DIRTY HACKS + // TODO: Fix for Groovy's model-checking public native Type getGenericReturnType(); @Override diff --git a/src/main/gov/nasa/jpf/vm/SystemClassLoaderInfo.java b/src/main/gov/nasa/jpf/vm/SystemClassLoaderInfo.java index 3076681..ce2866a 100644 --- a/src/main/gov/nasa/jpf/vm/SystemClassLoaderInfo.java +++ b/src/main/gov/nasa/jpf/vm/SystemClassLoaderInfo.java @@ -184,7 +184,6 @@ public abstract class SystemClassLoaderInfo extends ClassLoaderInfo { @Override protected ClassInfo loadSystemClass (String typeName){ - System.out.println("Loading class: " + typeName); return new ClassInfo( typeName, this); } diff --git a/src/peers/gov/nasa/jpf/vm/JPF_java_lang_Class.java b/src/peers/gov/nasa/jpf/vm/JPF_java_lang_Class.java index 651e48b..56496a8 100644 --- a/src/peers/gov/nasa/jpf/vm/JPF_java_lang_Class.java +++ b/src/peers/gov/nasa/jpf/vm/JPF_java_lang_Class.java @@ -26,13 +26,6 @@ import java.util.Set; import gov.nasa.jpf.Config; import gov.nasa.jpf.annotation.MJI; -// TODO: DIRTY HACKS! -import java.lang.reflect.TypeVariable; -import sun.reflect.generics.factory.CoreReflectionFactory; -import sun.reflect.generics.factory.GenericsFactory; -import sun.reflect.generics.repository.ClassRepository; -import sun.reflect.generics.scope.ClassScope; - /** * MJI NativePeer class for java.lang.Class library abstraction */ @@ -41,7 +34,7 @@ public class JPF_java_lang_Class extends NativePeer { static final String FIELD_CLASSNAME = "java.lang.reflect.Field"; static final String METHOD_CLASSNAME = "java.lang.reflect.Method"; static final String CONSTRUCTOR_CLASSNAME = "java.lang.reflect.Constructor"; - // TODO: DIRTY HACKS! + // TODO: Fix for Groovy's model-checking static final String TYPEVARIABLE_CLASSNAME = "java.lang.reflect.TypeVariable"; public static boolean init (Config conf){ @@ -154,48 +147,6 @@ public class JPF_java_lang_Class extends NativePeer { return ci.getClassObjectRef(); } - // TODO: DIRTY HACKS! - /*int createTypeVariableObject (MJIEnv env, ClassInfo objectCi, MethodInfo mi) { - // NOTE - we rely on Constructor and Method peers being initialized - if (mi.isCtor()){ - return JPF_java_lang_reflect_Constructor.createConstructorObject(env, objectCi, mi); - } else { - return JPF_java_lang_reflect_Method.createMethodObject(env, objectCi, mi); - } - } - - // accessor for factory - private GenericsFactory getFactory() { - // create scope and factory - return CoreReflectionFactory.make(this, ClassScope.make(this)); - } - - @MJI - public int getTypeParameters_____3Ljava_lang_reflect_TypeVariable_2 (MJIEnv env, int objRef){ - ClassInfo tci = getInitializedClassInfo(env, TYPEVARIABLE_CLASSNAME); - if (tci == null) { - env.repeatInvocation(); - return MJIEnv.NULL; - } - // Get the object and the type parameters - ClassInfo ci = env.getReferredClassInfo(objRef); - String signature = ci.getType(); - ClassRepository genericInfo = ClassRepository.make(signature, getFactory()); - TypeVariable[] typeVariables = (TypeVariable[]) genericInfo.getTypeParameters(); - - int aref = env.newObjectArray("Ljava/lang/reflect/TypeVariable;", typeVariables.length); - - for(int i=0, j=0; i