JML

org.multijava.relaxed.runtime
Class RMJClassLoader

java.lang.Object
  extended byjava.lang.ClassLoader
      extended byorg.multijava.relaxed.runtime.RMJClassLoader
All Implemented Interfaces:
Constants, Constants
Direct Known Subclasses:
RMJPreloader

public class RMJClassLoader
extends ClassLoader
implements Constants


Nested Class Summary
protected static class RMJClassLoader.EmptyTupleSet
           
 
Nested classes inherited from class java.lang.ClassLoader
 
Field Summary
protected  Map glueAnchorClassAnnotationsMap
           
protected  Map interfaceSpecializedSignaturesMap
           
protected  Map loadedBaseAnchorSigsMap
           
protected  Map loadedClassesAndInterfaces
           
protected  Map loadedGlueSigsMap
           
protected  Map loadedSubAnchorSigsMap
           
protected  List newlyLoadedAbstractSignatures
           
protected  List newlyReachableSigs
           
protected  List opsWithInterfaceSpecializers
           
private static DirectedAcyclicGraph.EdgeCalculator OVERRIDES_RELATION
           
protected  Map sigImplementationsMap
           
protected  Map signaturesMap
           
protected  List sigsRequiringAmbiguityChecking
           
protected  Map sigsRequiringCompletenessCheckingMap
           
protected  Map topConcreteSubclassesMap
           
protected  Map unreachableSigsMap
           
 
Fields inherited from class java.lang.ClassLoader
 
Fields inherited from interface org.multijava.mjc.Constants
ACC_MODIFIER_FLAGS_MASK, ACC_NON_NULL, ACC_NON_NULL_BY_DEFAULT, ACC_NULLABLE, ACC_NULLABLE_BY_DEFAULT, ACC_PURE, ACCESS_FLAG_ARRAY, ACCESS_FLAG_NAMES, AMID_JAVA_MATH, AMID_MAX, AMID_SAFE_MATH, CMP_VERSION, IMPLICITLY_NON_NULL, JAV_ASSERTION_ERROR, JAV_CLASS, JAV_CLASSLOADER, JAV_CLASSNOTFOUND_EXCEPTION, JAV_CLONE, JAV_CLONEABLE, JAV_CONSTRUCTOR, JAV_ERROR, JAV_EXCEPTION, JAV_INIT, JAV_LENGTH, JAV_NAME_SEPARATOR, JAV_NOCLASSDEFFOUND_ERROR, JAV_OBJECT, JAV_OUTER_THIS, JAV_RMJ_RUNTIME_EXCEPTION, JAV_RUNTIME, JAV_RUNTIME_EXCEPTION, JAV_SERIALIZABLE, JAV_STATIC_INIT, JAV_STRING, JAV_STRINGBUFFER, JAV_SUPER, JAV_THIS, JAV_THROWABLE, MJ_ANCHOR, NULLITY_MODS, OPE_BAND, OPE_BNOT, OPE_BOR, OPE_BSR, OPE_BXOR, OPE_EQ, OPE_GE, OPE_GT, OPE_LAND, OPE_LE, OPE_LNOT, OPE_LOR, OPE_LT, OPE_MINUS, OPE_NE, OPE_PERCENT, OPE_PLUS, OPE_POSTDEC, OPE_POSTINC, OPE_PREDEC, OPE_PREINC, OPE_SIMPLE, OPE_SL, OPE_SLASH, OPE_SR, OPE_STAR, TID_ARRAY, TID_BOOLEAN, TID_BYTE, TID_CHAR, TID_CLASS, TID_DOUBLE, TID_FLOAT, TID_INT, TID_LONG, TID_MAX, TID_SHORT, TID_VOID, UNIV_ARRAY_TMP, UNIV_TMP
 
Fields inherited from interface org.multijava.util.classfile.Constants
ACC_ABSTRACT, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_VOLATILE, ATT_ANCHOR, ATT_BRIDGE, ATT_CODE, ATT_CONSTANTVALUE, ATT_DEPRECATED, ATT_DISPATCHER, ATT_EXCEPTIONS, ATT_GENERIC, ATT_GENERIC_FUNCTIONS, ATT_INNERCLASSES, ATT_LINENUMBERTABLE, ATT_LOCALVARIABLETABLE, ATT_MM_BODY, ATT_REDIRECTOR, ATT_RMJ_GLUE, ATT_RMJ_SIGNATURE, ATT_RUNTIME_VISIBLE_ANNOTATIONS, ATT_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS, ATT_SIGNATURE, ATT_SOURCEFILE, ATT_SYNTHETIC, ATT_UNIVERSE_FIELD, ATT_UNIVERSE_METHOD, ATT_UNIVERSE_VERSION, CST_CLASS, CST_DOUBLE, CST_FIELD, CST_FLOAT, CST_INTEGER, CST_INTERFACEMETHOD, CST_LONG, CST_METHOD, CST_NAMEANDTYPE, CST_STRING, CST_UTF8, ENV_DEBUG_MODE, ENV_USE_CACHE, JAVA_MAGIC, JAVA_MAJOR, JAVA_MINOR, MAX_CODE_PER_METHOD, opc_aaload, opc_aastore, opc_aconst_null, opc_aload, opc_aload_0, opc_aload_1, opc_aload_2, opc_aload_3, opc_anewarray, opc_areturn, opc_arraylength, opc_astore, opc_astore_0, opc_astore_1, opc_astore_2, opc_astore_3, opc_athrow, opc_baload, opc_bastore, opc_bipush, opc_caload, opc_castore, opc_checkcast, opc_d2f, opc_d2i, opc_d2l, opc_dadd, opc_daload, opc_dastore, opc_dcmpg, opc_dcmpl, opc_dconst_0, opc_dconst_1, opc_ddiv, opc_dload, opc_dload_0, opc_dload_1, opc_dload_2, opc_dload_3, opc_dmul, opc_dneg, opc_drem, opc_dreturn, opc_dstore, opc_dstore_0, opc_dstore_1, opc_dstore_2, opc_dstore_3, opc_dsub, opc_dup, opc_dup2, opc_dup2_x1, opc_dup2_x2, opc_dup_x1, opc_dup_x2, opc_f2d, opc_f2i, opc_f2l, opc_fadd, opc_faload, opc_fastore, opc_fcmpg, opc_fcmpl, opc_fconst_0, opc_fconst_1, opc_fconst_2, opc_fdiv, opc_fload, opc_fload_0, opc_fload_1, opc_fload_2, opc_fload_3, opc_fmul, opc_fneg, opc_frem, opc_freturn, opc_fstore, opc_fstore_0, opc_fstore_1, opc_fstore_2, opc_fstore_3, opc_fsub, opc_getfield, opc_getstatic, opc_goto, opc_goto_w, opc_i2b, opc_i2c, opc_i2d, opc_i2f, opc_i2l, opc_i2s, opc_iadd, opc_iaload, opc_iand, opc_iastore, opc_iconst_0, opc_iconst_1, opc_iconst_2, opc_iconst_3, opc_iconst_4, opc_iconst_5, opc_iconst_m1, opc_idiv, opc_if_acmpeq, opc_if_acmpne, opc_if_icmpeq, opc_if_icmpge, opc_if_icmpgt, opc_if_icmple, opc_if_icmplt, opc_if_icmpne, opc_ifeq, opc_ifge, opc_ifgt, opc_ifle, opc_iflt, opc_ifne, opc_ifnonnull, opc_ifnull, opc_iinc, opc_iload, opc_iload_0, opc_iload_1, opc_iload_2, opc_iload_3, opc_imul, opc_ineg, opc_instanceof, opc_invokeinterface, opc_invokespecial, opc_invokestatic, opc_invokevirtual, opc_ior, opc_irem, opc_ireturn, opc_ishl, opc_ishr, opc_istore, opc_istore_0, opc_istore_1, opc_istore_2, opc_istore_3, opc_isub, opc_iushr, opc_ixor, opc_jsr, opc_jsr_w, opc_l2d, opc_l2f, opc_l2i, opc_ladd, opc_laload, opc_land, opc_lastore, opc_lcmp, opc_lconst_0, opc_lconst_1, opc_ldc, opc_ldc2_w, opc_ldc_w, opc_ldiv, opc_lload, opc_lload_0, opc_lload_1, opc_lload_2, opc_lload_3, opc_lmul, opc_lneg, opc_lookupswitch, opc_lor, opc_lrem, opc_lreturn, opc_lshl, opc_lshr, opc_lstore, opc_lstore_0, opc_lstore_1, opc_lstore_2, opc_lstore_3, opc_lsub, opc_lushr, opc_lxor, opc_monitorenter, opc_monitorexit, opc_multianewarray, opc_new, opc_newarray, opc_nop, opc_pop, opc_pop2, opc_putfield, opc_putstatic, opc_ret, opc_return, opc_saload, opc_sastore, opc_sipush, opc_swap, opc_tableswitch, opc_wide, opc_xxxunusedxxx, POO_ASCII_CONSTANT, POO_CLASS_CONSTANT, POO_DOUBLE_CONSTANT, POO_FLOAT_CONSTANT, POO_INTEGER_CONSTANT, POO_LONG_CONSTANT, POO_NAT_CONSTANT, POO_REF_CONSTANT, POO_STRING_CONSTANT, TYP_ADDRESS, TYP_DOUBLE, TYP_FLOAT, TYP_INT, TYP_LONG, TYP_REFERENCE, TYP_VOID
 
Constructor Summary
RMJClassLoader()
           
RMJClassLoader(ClassLoader parent)
           
 
Method Summary
protected  boolean checkCollectionForResolvingSig(Collection sigs, RMJOperation op, Object[] intersection, RMJSignature nsig, RMJSignature osig)
           
protected  boolean checkForResolvingSig(Object[] intersection, boolean isOld, RMJSignature nsig, RMJSignature osig)
           
protected  void collectAbstractSignaturesAbove(Class cls, HashSet asigs)
           
protected  void collectAbstractSignaturesOf(Class cls, HashSet asigs)
           
(package private)  Collection computeIntersection(Class cls1, Class cls2)
           
protected  List generateCrossProduct(List[] tupleOfSets)
           
protected  List generateCrossProductTo(List[] tupleOfSets, int pos)
           
protected  List generateTopConcreteSetsBelow(Object specializer)
           
protected  List generateTopConcreteTuplesBelow(RMJSignature asig)
           
protected  List[] generateTupleOfTopConcreteSetsBelow(RMJSignature asig)
           
protected  boolean isAbstractClass(Class cls)
           
protected  boolean isAbstractClassOrInterface(Class cls)
           
protected  boolean isConcreteClass(Class cls)
           
protected  boolean isInterface(Class cls)
           
(package private)  boolean isLoaded(String className)
           
protected  boolean isTopConcreteClass(Class cls)
           
 Class loadClass(String name)
           
protected  void loadDispatcherClass(RMJSignature sig)
           
 void loaderMain(String[] args)
           
protected  void loadErrorSig(RMJErrorSignature esig)
           
protected  Class loadSystemClass(String name)
           
protected  Class loadUserClass(String name)
           
(package private)  Class lookupClass(String className)
           
static void main(String[] args)
           
protected  String prettyString(Object[] tuple)
           
 String prettyString(RMJSignature sig)
           
 String prettyString(RMJAnnotation.Method sig)
           
 void printClassReport(PrintStream strm)
           
protected  void processLoadedClass(Class cls, RMJAnnotation anno)
           
protected  byte[] readAll(InputStream strm)
           
 byte[] readClassByteCode(String name)
           
protected  RMJAnnotation readGlueAnchorAnnotations(String glueAnchorClassName)
           
protected  void registerAbstractSignature(RMJSignature asig)
           
protected  void registerAllGlue()
           
protected  void registerClass(Class cls, RMJAnnotation anno)
           
protected  void registerConcreteSig(RMJSignature csig, RMJSignature asig)
           
protected  void registerGlueAnchor(String glueAnchorClassName)
           
protected  void registerGlueSignature(RMJAnnotation.Method anno)
           
protected  void registerNonAmbiguousSig(RMJSignature sig, Map loadedSigsMap)
           
protected  void registerReachableSignature(RMJAnnotation.Method anno)
           
protected  void registerSignature(RMJAnnotation.Method anno)
           
protected  void registerSystemLoad(Class cls)
           
protected  void registerSystemLoadAncestors(Class cls)
           
protected  void registerUnreachableSignature(RMJAnnotation.Method anno, Set unloadedClassNames)
           
protected  void registerWithAbstractAncestors(Class cls)
           
protected  void registerWithAbstractAncestorsOf(Class cls, Class of, List alreadyVisited)
           
protected  void registerWithAbstractClassOrInterface(Class cls, Class abs)
           
protected  void runProgram(Class cls, String[] args)
           
protected  String tupleToString(Object[] tuple)
           
protected  String usage()
           
protected  void verifyCompleteness(Class cls, RMJAnnotation anno)
           
protected  void verifyCompletenessOfAbstractSignature(RMJSignature asig)
           
protected  void verifyCompletenessOfAbstractSignature(RMJSignature asig, Class cls)
           
protected  void verifyCompletenessOfTopConcreteClass(Class cls)
           
protected  void verifyCompletenessOfTopConcreteTuples(List tuples, RMJSignature asig, Class cls)
           
protected  void verifyNonAmbiguity(RMJSignature sig, boolean isOld, List toBeLoaded)
           
protected  void verifyNonAmbiguityAgainstAll(RMJSignature sig, Map loadedSigsMap, boolean isOld, List toBeLoaded, boolean onlyCheckIfHasIntSpec)
           
protected  void verifyNonAmbiguityAndLoadExternalMethods()
           
protected  void verifyNonAmbiguityOfNewSig(RMJSignature sig, List toBeLoaded)
           
protected  void verifyNonAmbiguityOfOldSig(RMJSignature sig, List toBeLoaded)
           
protected  void verifyNonAmbiguityOfSigs(RMJSignature nsig, RMJSignature osig, boolean isOld, List toBeLoaded)
           
protected  void warn(String msg)
           
 
Methods inherited from class java.lang.ClassLoader
clearAssertionStatus, defineClass, defineClass, defineClass, defineClass, definePackage, findClass, findLibrary, findLoadedClass, findResource, findResources, findSystemClass, getPackage, getPackages, getParent, getResource, getResourceAsStream, getResources, getSystemClassLoader, getSystemResource, getSystemResourceAsStream, getSystemResources, loadClass, resolveClass, setClassAssertionStatus, setDefaultAssertionStatus, setPackageAssertionStatus, setSigners
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

OVERRIDES_RELATION

private static final DirectedAcyclicGraph.EdgeCalculator OVERRIDES_RELATION

loadedClassesAndInterfaces

protected Map loadedClassesAndInterfaces

topConcreteSubclassesMap

protected Map topConcreteSubclassesMap

sigsRequiringCompletenessCheckingMap

protected Map sigsRequiringCompletenessCheckingMap

signaturesMap

protected Map signaturesMap

sigImplementationsMap

protected Map sigImplementationsMap

newlyLoadedAbstractSignatures

protected List newlyLoadedAbstractSignatures

glueAnchorClassAnnotationsMap

protected Map glueAnchorClassAnnotationsMap

unreachableSigsMap

protected Map unreachableSigsMap

newlyReachableSigs

protected List newlyReachableSigs

loadedBaseAnchorSigsMap

protected Map loadedBaseAnchorSigsMap

loadedSubAnchorSigsMap

protected Map loadedSubAnchorSigsMap

loadedGlueSigsMap

protected Map loadedGlueSigsMap

interfaceSpecializedSignaturesMap

protected Map interfaceSpecializedSignaturesMap

sigsRequiringAmbiguityChecking

protected List sigsRequiringAmbiguityChecking

opsWithInterfaceSpecializers

protected List opsWithInterfaceSpecializers
Constructor Detail

RMJClassLoader

public RMJClassLoader()

RMJClassLoader

public RMJClassLoader(ClassLoader parent)
Method Detail

main

public static void main(String[] args)
                 throws ClassNotFoundException,
                        NoSuchMethodException,
                        IllegalAccessException,
                        InvocationTargetException
Throws:
ClassNotFoundException
NoSuchMethodException
IllegalAccessException
InvocationTargetException

loaderMain

public void loaderMain(String[] args)
                throws ClassNotFoundException,
                       NoSuchMethodException,
                       IllegalAccessException,
                       InvocationTargetException
Throws:
ClassNotFoundException
NoSuchMethodException
IllegalAccessException
InvocationTargetException

usage

protected String usage()

registerAllGlue

protected void registerAllGlue()
                        throws ClassNotFoundException
Throws:
ClassNotFoundException

runProgram

protected void runProgram(Class cls,
                          String[] args)
                   throws ClassNotFoundException,
                          NoSuchMethodException,
                          IllegalAccessException,
                          InvocationTargetException
Throws:
ClassNotFoundException
NoSuchMethodException
IllegalAccessException
InvocationTargetException

loadClass

public Class loadClass(String name)
                throws ClassNotFoundException
Overrides:
loadClass in class ClassLoader
Throws:
ClassNotFoundException

loadUserClass

protected Class loadUserClass(String name)
                       throws ClassNotFoundException
Throws:
ClassNotFoundException

readClassByteCode

public byte[] readClassByteCode(String name)
                         throws ClassNotFoundException
Throws:
ClassNotFoundException

readAll

protected byte[] readAll(InputStream strm)
                  throws IOException
Throws:
IOException

loadSystemClass

protected Class loadSystemClass(String name)
                         throws ClassNotFoundException
Throws:
ClassNotFoundException

registerSystemLoadAncestors

protected void registerSystemLoadAncestors(Class cls)
                                    throws ClassNotFoundException
Throws:
ClassNotFoundException

registerSystemLoad

protected void registerSystemLoad(Class cls)
                           throws ClassNotFoundException
Throws:
ClassNotFoundException

processLoadedClass

protected void processLoadedClass(Class cls,
                                  RMJAnnotation anno)
                           throws ClassNotFoundException
Throws:
ClassNotFoundException

registerGlueAnchor

protected void registerGlueAnchor(String glueAnchorClassName)
                           throws ClassNotFoundException
Throws:
ClassNotFoundException

readGlueAnchorAnnotations

protected RMJAnnotation readGlueAnchorAnnotations(String glueAnchorClassName)
                                           throws ClassNotFoundException
Throws:
ClassNotFoundException

registerGlueSignature

protected void registerGlueSignature(RMJAnnotation.Method anno)

registerUnreachableSignature

protected void registerUnreachableSignature(RMJAnnotation.Method anno,
                                            Set unloadedClassNames)

registerClass

protected void registerClass(Class cls,
                             RMJAnnotation anno)

registerWithAbstractAncestors

protected void registerWithAbstractAncestors(Class cls)

registerWithAbstractAncestorsOf

protected void registerWithAbstractAncestorsOf(Class cls,
                                               Class of,
                                               List alreadyVisited)

registerWithAbstractClassOrInterface

protected void registerWithAbstractClassOrInterface(Class cls,
                                                    Class abs)

registerSignature

protected void registerSignature(RMJAnnotation.Method anno)

registerReachableSignature

protected void registerReachableSignature(RMJAnnotation.Method anno)

registerAbstractSignature

protected void registerAbstractSignature(RMJSignature asig)

registerConcreteSig

protected void registerConcreteSig(RMJSignature csig,
                                   RMJSignature asig)

verifyNonAmbiguityAndLoadExternalMethods

protected void verifyNonAmbiguityAndLoadExternalMethods()
                                                 throws ClassNotFoundException
Throws:
ClassNotFoundException

loadDispatcherClass

protected void loadDispatcherClass(RMJSignature sig)
                            throws ClassNotFoundException
Throws:
ClassNotFoundException

loadErrorSig

protected void loadErrorSig(RMJErrorSignature esig)
                     throws ClassNotFoundException
Throws:
ClassNotFoundException

verifyNonAmbiguityOfNewSig

protected void verifyNonAmbiguityOfNewSig(RMJSignature sig,
                                          List toBeLoaded)

verifyNonAmbiguityOfOldSig

protected void verifyNonAmbiguityOfOldSig(RMJSignature sig,
                                          List toBeLoaded)

verifyNonAmbiguity

protected void verifyNonAmbiguity(RMJSignature sig,
                                  boolean isOld,
                                  List toBeLoaded)

verifyNonAmbiguityAgainstAll

protected void verifyNonAmbiguityAgainstAll(RMJSignature sig,
                                            Map loadedSigsMap,
                                            boolean isOld,
                                            List toBeLoaded,
                                            boolean onlyCheckIfHasIntSpec)

verifyNonAmbiguityOfSigs

protected void verifyNonAmbiguityOfSigs(RMJSignature nsig,
                                        RMJSignature osig,
                                        boolean isOld,
                                        List toBeLoaded)

checkForResolvingSig

protected boolean checkForResolvingSig(Object[] intersection,
                                       boolean isOld,
                                       RMJSignature nsig,
                                       RMJSignature osig)

checkCollectionForResolvingSig

protected boolean checkCollectionForResolvingSig(Collection sigs,
                                                 RMJOperation op,
                                                 Object[] intersection,
                                                 RMJSignature nsig,
                                                 RMJSignature osig)

registerNonAmbiguousSig

protected void registerNonAmbiguousSig(RMJSignature sig,
                                       Map loadedSigsMap)

verifyCompleteness

protected void verifyCompleteness(Class cls,
                                  RMJAnnotation anno)

verifyCompletenessOfTopConcreteClass

protected void verifyCompletenessOfTopConcreteClass(Class cls)

collectAbstractSignaturesAbove

protected void collectAbstractSignaturesAbove(Class cls,
                                              HashSet asigs)

collectAbstractSignaturesOf

protected void collectAbstractSignaturesOf(Class cls,
                                           HashSet asigs)

verifyCompletenessOfAbstractSignature

protected void verifyCompletenessOfAbstractSignature(RMJSignature asig)

verifyCompletenessOfAbstractSignature

protected void verifyCompletenessOfAbstractSignature(RMJSignature asig,
                                                     Class cls)

generateTopConcreteTuplesBelow

protected List generateTopConcreteTuplesBelow(RMJSignature asig)
                                       throws RMJClassLoader.EmptyTupleSet
Throws:
RMJClassLoader.EmptyTupleSet

generateTupleOfTopConcreteSetsBelow

protected List[] generateTupleOfTopConcreteSetsBelow(RMJSignature asig)
                                              throws RMJClassLoader.EmptyTupleSet
Throws:
RMJClassLoader.EmptyTupleSet

generateTopConcreteSetsBelow

protected List generateTopConcreteSetsBelow(Object specializer)
                                     throws RMJClassLoader.EmptyTupleSet
Throws:
RMJClassLoader.EmptyTupleSet

generateCrossProduct

protected List generateCrossProduct(List[] tupleOfSets)

generateCrossProductTo

protected List generateCrossProductTo(List[] tupleOfSets,
                                      int pos)

verifyCompletenessOfTopConcreteTuples

protected void verifyCompletenessOfTopConcreteTuples(List tuples,
                                                     RMJSignature asig,
                                                     Class cls)

computeIntersection

Collection computeIntersection(Class cls1,
                               Class cls2)

prettyString

public String prettyString(RMJSignature sig)

prettyString

public String prettyString(RMJAnnotation.Method sig)

prettyString

protected String prettyString(Object[] tuple)

tupleToString

protected String tupleToString(Object[] tuple)

warn

protected void warn(String msg)

lookupClass

Class lookupClass(String className)
            throws ClassNotFoundException
Throws:
ClassNotFoundException

isLoaded

boolean isLoaded(String className)

isInterface

protected boolean isInterface(Class cls)

isAbstractClassOrInterface

protected boolean isAbstractClassOrInterface(Class cls)

isAbstractClass

protected boolean isAbstractClass(Class cls)

isConcreteClass

protected boolean isConcreteClass(Class cls)

isTopConcreteClass

protected boolean isTopConcreteClass(Class cls)

printClassReport

public void printClassReport(PrintStream strm)

JML

JML is Copyright (C) 1998-2002 by Iowa State University and is distributed under the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This release depends on code from the MultiJava project and is based in part on the Kopi project Copyright (C) 1990-99 DMS Decision Management Systems Ges.m.b.H.