From d9b2879dbf40f9fc9837bebf1d9ff6ec27a2cc05 Mon Sep 17 00:00:00 2001 From: Rahmadi Trimananda Date: Mon, 17 Jun 2019 23:55:10 -0700 Subject: [PATCH] Instantiating TypeVariableImpl.java --- examples/Reflection.java | 1 - .../reflectiveObjects/TypeVariableImpl.java | 5 +++-- src/main/gov/nasa/jpf/jvm/ClassFile.java | 9 +++++++++ .../gov/nasa/jpf/vm/JPF_java_lang_Class.java | 16 ++++++++++++---- 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/examples/Reflection.java b/examples/Reflection.java index a5451ea..0a021b2 100644 --- a/examples/Reflection.java +++ b/examples/Reflection.java @@ -53,7 +53,6 @@ public class Reflection { } System.out.println();*/ TypeVariable[] typeParameters = Generic.class.getTypeParameters(); - System.out.println("Members: " + typeParameters.length); //TypeVariable[] typeParameters = SampleClass.class.getTypeParameters(); for(TypeVariable typeVar: typeParameters){ System.out.println(typeVar); diff --git a/src/classes/sun/reflect/generics/reflectiveObjects/TypeVariableImpl.java b/src/classes/sun/reflect/generics/reflectiveObjects/TypeVariableImpl.java index bb1a3d3..f845539 100644 --- a/src/classes/sun/reflect/generics/reflectiveObjects/TypeVariableImpl.java +++ b/src/classes/sun/reflect/generics/reflectiveObjects/TypeVariableImpl.java @@ -25,11 +25,12 @@ import sun.reflect.generics.tree.FieldTypeSignature; */ public class TypeVariableImpl extends LazyReflectiveObjectGenerator implements TypeVariable { +//public class TypeVariableImpl { D genericDeclaration; private String name; private Type[] bounds; private FieldTypeSignature[] boundASTs; - private static final Annotation[] EMPTY_ANNOTATION_ARRAY = new Annotation[0]; + //private static final Annotation[] EMPTY_ANNOTATION_ARRAY = new Annotation[0]; // constructor is private to enforce access through static factory private TypeVariableImpl(D decl, String n, FieldTypeSignature[] bs, @@ -63,7 +64,7 @@ public class TypeVariableImpl GenericsFactory f) { if (!((decl instanceof Class) || - (decl instanceof Method) || + //(decl instanceof Method) || (decl instanceof Constructor))) { throw new AssertionError("Unexpected kind of GenericDeclaration" + decl.getClass().toString()); diff --git a/src/main/gov/nasa/jpf/jvm/ClassFile.java b/src/main/gov/nasa/jpf/jvm/ClassFile.java index 4bac2b2..fd879f1 100644 --- a/src/main/gov/nasa/jpf/jvm/ClassFile.java +++ b/src/main/gov/nasa/jpf/jvm/ClassFile.java @@ -422,6 +422,15 @@ public class ClassFile extends BinaryClassSource { return ((data[idx++]&0xff) << 8) | (data[idx]&0xff); } + // TODO: DIRTY HACKS!!! + public final int readU4(){ + int idx = pos; + pos += 4; + byte[] data = this.data; + + return ((data[idx++]&0xff) <<24) | ((data[idx++]&0xff) << 16) | ((data[idx++]&0xff) << 8) | (data[idx]&0xff); + } + public final int readI2() { int idx = pos; pos += 2; 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 0d817c2..9e8fc2b 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 @@ -114,14 +114,22 @@ public class JPF_java_lang_Class extends NativePeer { @MJI public int getTypeParameters_____3Ljava_lang_reflect_TypeVariable_2 (MJIEnv env, int robj){ ClassLoaderInfo cli = env.getSystemClassLoaderInfo(); - ClassInfo rci = cli.getResolvedClassInfo("sun.reflect.generics.reflectiveObjects.TypeVariableImpl"); + ClassInfo ci = cli.getResolvedClassInfo("sun.reflect.generics.reflectiveObjects.TypeVariableImpl"); + //ClassInfo rci = cli.getResolvedClassInfo("sun.reflect.generics.reflectiveObjects.Test"); // TODO: Need to 1) Just create the object of TypeVariableImpl, 2) Declare class type and name only, 3) Return the // object reference back to the caller - ClassInfo test = cli.getResolvedClassInfo("java.lang.Class"); + int tvRef = env.newObject(ci); + ElementInfo ei = env.getModifiableElementInfo(tvRef); + ClassInfo tci = env.getReferredClassInfo( robj); - int ei = env.newObject(test); + //ei.setReferenceField("genericDeclaration", env.newObject(tci.getName() + ".class")); + ei.setReferenceField("name", env.newString("TUVW")); + int aRef = env.newObjectArray("Ljava/lang/reflect/TypeVariable;", 1); + for (int i = 0; i < 1; i++) { + env.setReferenceArrayElement(aRef, i, tvRef); + } - return MJIEnv.NULL; + return aRef; } @MJI -- 2.34.1