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=ef0d782b998fb735dfa40828b1ed1c98600ace24;hp=ccc98155190d4016c3e1ed2574b4ae958e61d597;hb=8407476b0dce3b2c1d1a5093d55df109aa7f9789;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..ef0d782 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,74 @@ public class JPF_java_lang_Class extends NativePeer { } // TODO: Fix for Groovy's model-checking + private static int getParameterizedTypeImplObj(String[] parameterizedTypes, String ownerType, + MJIEnv env, int actObjRef, int rawObjRef) { + + 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", rawObjRef); + + // actualTypeArguments + int[] types = new int[parameterizedTypes.length]; + for(int j = 0; j < parameterizedTypes.length; j++) { + types[j] = getTypeVariableImplObject(env, actObjRef, 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(typeVars, ownerType, env, ci.getClassObjectRef(), sci.getClassObjectRef()); + + return gRef; } else { return MJIEnv.NULL; } @@ -122,20 +183,28 @@ public class JPF_java_lang_Class extends NativePeer { @MJI public int getGenericInterfaces_____3Ljava_lang_reflect_Type_2 (MJIEnv env, int robj) { - // TODO: Need to add ParameterizedTypeImpl ClassInfo ci = env.getReferredClassInfo(robj); int aref = MJIEnv.NULL; ThreadInfo ti = env.getThreadInfo(); - // contrary to the API doc, this only returns the interfaces directly // implemented by this class, not it's bases // <2do> this is not exactly correct, since the interfaces should be ordered Set interfaces = ci.getInterfaceClassInfos(); + aref = env.newObjectArray("Ljava/lang/Class;", interfaces.size()); int i=0; for (ClassInfo ifc: interfaces){ - env.setReferenceArrayElement(aref, i++, ifc.getClassObjectRef()); + if (Types.isGenericSignature(ifc.getGenericSignature())) { + String className = ifc.getName(); + String ownerType = Types.getOwnerClassName(className); + String[] typeVars = ifc.getGenericTypeVariableNames(); + int paramTypeObj = getParameterizedTypeImplObj(typeVars, ownerType, env, ci.getClassObjectRef(), + ifc.getClassObjectRef()); + env.setReferenceArrayElement(aref, i++, paramTypeObj); + } else { + env.setReferenceArrayElement(aref, i++, ifc.getClassObjectRef()); + } } return aref; @@ -173,6 +242,34 @@ public class JPF_java_lang_Class extends NativePeer { return aRef; } + + @MJI + public int getProtectionDomain____Ljava_security_ProtectionDomain_2 (MJIEnv env, int robj) { + // Now create a ProtectionDomain object + ClassLoaderInfo cli = env.getSystemClassLoaderInfo(); + ClassInfo pdci = cli.getResolvedClassInfo("java.security.ProtectionDomain"); + + int proDomRef = MJIEnv.NULL; + /* + TODO: Defer the following to future implementations + TODO: Currently Groovy runs well without actually instantiating a ProtectionDomain object properly + int proDomRef = env.newObject(pdci); + ElementInfo ei = env.getModifiableElementInfo(proDomRef); + ei.setReferenceField("codesource", MJIEnv.NULL); + ei.setReferenceField("classloader", MJIEnv.NULL); + ei.setBooleanField("hasAllPerm", true); + ei.setBooleanField("staticPermissions", true); + + // Load the Permission (AllPermission class) + ClassInfo pci = cli.getResolvedClassInfo("java.security.AllPermission"); + int permRef = env.newObject(pci); + ElementInfo pei = env.getModifiableElementInfo(permRef); + pei.setReferenceField("name", env.newString("")); + ei.setReferenceField("permissions", permRef);*/ + + return proDomRef; + } + // TODO: Fix for Groovy's model-checking @MJI public int getAnnotation__Ljava_lang_Class_2__Ljava_lang_annotation_Annotation_2 (MJIEnv env, int robj,