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=cdc5dd709359a91bf10779a84a2ec15e84d7343b;hp=ccc98155190d4016c3e1ed2574b4ae958e61d597;hb=9530ffc869c8b7768131e093593200126918ee28;hpb=48c7130ad03404a653a8e6298fb42592efc8dd67 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 ccc9815..cdc5dd7 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 @@ -108,13 +108,75 @@ public class JPF_java_lang_Class extends NativePeer { } // TODO: Fix for Groovy's model-checking + private static int getParameterizedTypeImplObj(String className, String[] parameterizedTypes, String ownerType, + MJIEnv env, int objRef, int superObjRef) { + + ThreadInfo ti = env.getThreadInfo(); + ClassLoaderInfo cli = env.getSystemClassLoaderInfo(); + ClassInfo ci = cli.getResolvedClassInfo("sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl"); + // Create a new object of type ParameterizedTypeImpl + int paramTypeRef = env.newObject(ci); + ElementInfo ei = env.getModifiableElementInfo(paramTypeRef); + // Get field information and fill out the fields + // rawType field + ei.setReferenceField("rawType", superObjRef); + + // actualTypeArguments + int[] types = new int[parameterizedTypes.length]; + for(int j = 0; j < parameterizedTypes.length; j++) { + types[j] = getTypeVariableImplObject(env, objRef, parameterizedTypes[j]); + } + int aRef = env.newObjectArray("Ljava/lang/reflect/Type;", parameterizedTypes.length); + // Set references for every array element + for (int j = 0; j < parameterizedTypes.length; j++) { + env.setReferenceArrayElement(aRef, j, types[j]); + } + ei.setReferenceField("actualTypeArguments", aRef); + + // ownerType + if (ownerType != null) { + ClassInfo oci = ClassLoaderInfo.getCurrentResolvedClassInfo(ownerType); + if (!oci.isRegistered()) { + oci.registerClass(ti); + } + ei.setReferenceField("ownerType", oci.getClassObjectRef()); + } else { + ei.setReferenceField("ownerType", MJIEnv.NULL); + } + + return paramTypeRef; + } + + private static int getTypeVariableImplObject(MJIEnv env, int objRef, String parameterizedType) { + + ClassLoaderInfo cli = env.getSystemClassLoaderInfo(); + ClassInfo ci = cli.getResolvedClassInfo("sun.reflect.generics.reflectiveObjects.TypeVariableImpl"); + + int typeVarRef = env.newObject(ci); + ElementInfo ei = env.getModifiableElementInfo(typeVarRef); + // genericDeclaration contains this java.lang.reflect.Method object + ei.setReferenceField("genericDeclaration", objRef); + ei.setReferenceField("name", env.newString(parameterizedType)); + + return typeVarRef; + } + @MJI public int getGenericSuperclass____Ljava_lang_reflect_Type_2 (MJIEnv env, int robj){ - // TODO: Need to add ParameterizedTypeImpl ClassInfo ci = env.getReferredClassInfo( robj); ClassInfo sci = ci.getSuperClass(); if (sci != null) { - return sci.getClassObjectRef(); + String[] typeVars = sci.getGenericTypeVariableNames(); + // Not a generic class + if (typeVars.length == 0) { + return sci.getClassObjectRef(); + } + String className = sci.getName(); + String ownerType = Types.getOwnerClassName(className); + int gRef = getParameterizedTypeImplObj(className, typeVars, ownerType, env, ci.getClassObjectRef(), + sci.getClassObjectRef()); + + return gRef; } else { return MJIEnv.NULL; }