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_Class.java;h=8ace89649bd8d992b6594377dbaf47bec18e4f13;hp=9e8fc2b3d1f7cca3cd3b2a4866ed500159e8fa98;hb=7e89326d6efbc622ba28d368dc9a073c98ba1b73;hpb=d9b2879dbf40f9fc9837bebf1d9ff6ec27a2cc05 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 9e8fc2b..8ace896 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 @@ -110,23 +110,34 @@ public class JPF_java_lang_Class extends NativePeer { } // TODO: Fix for Groovy's model-checking - // TODO: THIS NEEDS TO BE SUBSTITUTED BY THE PROPER METHODS! VERY DIRTY RIGHT NOW! @MJI public int getTypeParameters_____3Ljava_lang_reflect_TypeVariable_2 (MJIEnv env, int robj){ + // Get the ClassInfo for this class + ClassInfo tci = env.getReferredClassInfo(robj); + String[] typeVars = tci.getGenericTypeVariableNames(); + + // Return with null if this is not a generic class + if (typeVars.length == 0) { + int aRef = env.newObjectArray("Ljava/lang/reflect/TypeVariable;", 0); + return aRef; + } + // Now create a TypeVariableImpl object for every type variable name; get the ClassInfo for TypeVariableImpl ClassLoaderInfo cli = env.getSystemClassLoaderInfo(); 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 - int tvRef = env.newObject(ci); - ElementInfo ei = env.getModifiableElementInfo(tvRef); - - ClassInfo tci = env.getReferredClassInfo( robj); - //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); + int[] var = new int[typeVars.length]; + + for(int i = 0; i < typeVars.length; i++) { + int typeVarRef = env.newObject(ci); + ElementInfo ei = env.getModifiableElementInfo(typeVarRef); + ei.setReferenceField("genericDeclaration", tci.getClassObjectRef()); + ei.setReferenceField("name", env.newString(typeVars[i])); + var[i] = typeVarRef; + } + int aRef = env.newObjectArray("Ljava/lang/reflect/TypeVariable;", typeVars.length); + + // Set references for every array element + for (int i = 0; i < typeVars.length; i++) { + env.setReferenceArrayElement(aRef, i, var[i]); } return aRef;