public void visitProgramClass(ProgramClass programClass) { programClass.subclassesAccept(new ClassMerger(programClass, allowAccessModification, mergeInterfacesAggressively, extraClassVisitor)); } }
/** * Sets the global return value to true if the given class is retargeted. */ private void checkTarget(Clazz clazz) { if (clazz != null && ClassMerger.getTargetClass(clazz) != null) { retargeted = true; } } }
/** * Returns whether the given class would introduce any unwanted fields * in the target class. */ private boolean introducesUnwantedFields(ProgramClass programClass, ProgramClass targetClass) { // The class must not have any fields, or it must not be instantiated, // without any other subclasses. return programClass.u2fieldsCount != 0 && (InstantiationClassMarker.isInstantiated(targetClass) || (targetClass.subClasses != null && !isOnlySubClass(programClass, targetClass))); }
getTargetClass(programClass) == null && getTargetClass(targetClass) == null && (ClassConstants.ACC_INTERFACE | ClassConstants.ACC_ABSTRACT)) || (isOnlySubClass(programClass, targetClass) && programClass.getSuperClass() != null && (programClass.getSuperClass().equals(targetClass) || !indirectlyImplementedInterfaces(programClass).contains(targetClass) && !targetClass.extendsOrImplements(programClass) && subInterfaces(programClass, targetClass).equals(subInterfaces(targetClass, programClass))) && sideEffectSuperClasses(programClass).equals(sideEffectSuperClasses(targetClass)) && instanceofedSuperClasses(programClass).equals(instanceofedSuperClasses(targetClass)) && caughtSuperClasses(programClass).equals(caughtSuperClasses(targetClass)) && !haveAnyIdenticalFields(programClass, targetClass)) && !introducesUnwantedFields(programClass, targetClass) && !introducesUnwantedFields(targetClass, programClass)) && !shadowsAnyFields(programClass, targetClass) && !shadowsAnyFields(targetClass, programClass)) && !haveAnyIdenticalMethods(programClass, targetClass) &&
getTargetClass(programClass) == null && getTargetClass(targetClass) == null && !indirectlyImplementedInterfaces(programClass).contains(targetClass) && !targetClass.extendsOrImplements(programClass) && initializedSuperClasses(programClass).equals(initializedSuperClasses(targetClass)) && instanceofedSuperClasses(programClass).equals(instanceofedSuperClasses(targetClass)) && caughtSuperClasses(programClass).equals(caughtSuperClasses(targetClass)) && !introducesUnwantedFields(programClass, targetClass) && !introducesUnwantedFields(targetClass, programClass) && !haveAnyIdenticalInitializers(programClass, targetClass) && (!introducesUnwantedAbstractMethods(programClass, targetClass) && !introducesUnwantedAbstractMethods(targetClass, programClass))) && !overridesAnyMethods(programClass, targetClass) && !overridesAnyMethods(targetClass, programClass) && !shadowsAnyMethods(programClass, targetClass) && !shadowsAnyMethods(targetClass, programClass)) setTargetClass(programClass, targetClass);
public void visitProgramClass(ProgramClass programClass) { // Only merge wrapper classes that extend java.lang.Object. if (ClassConstants.NAME_JAVA_LANG_OBJECT.equals(programClass.getSuperName())) { // Do we have a wrapped program class? Clazz wrappedClass = WrapperClassMarker.getWrappedClass(programClass); if (wrappedClass instanceof ProgramClass) { // Try inlining the wrapper class into the wrapped class. new ClassMerger((ProgramClass)wrappedClass, allowAccessModification, false, true, extraClassVisitor).visitProgramClass(programClass); } } } }
getTargetClass(programClass) == null && getTargetClass(targetClass) == null && (ClassConstants.ACC_INTERFACE | ClassConstants.ACC_ABSTRACT)) || (isOnlySubClass(programClass, targetClass) && programClass.getSuperClass() != null && (programClass.getSuperClass().equals(targetClass) || !indirectlyImplementedInterfaces(programClass).contains(targetClass) && !targetClass.extendsOrImplements(programClass) && subInterfaces(programClass, targetClass).equals(subInterfaces(targetClass, programClass))) && sideEffectSuperClasses(programClass).equals(sideEffectSuperClasses(targetClass)) && instanceofedSuperClasses(programClass).equals(instanceofedSuperClasses(targetClass)) && caughtSuperClasses(programClass).equals(caughtSuperClasses(targetClass)) && !haveAnyIdenticalFields(programClass, targetClass)) && !introducesUnwantedFields(programClass, targetClass) && !introducesUnwantedFields(targetClass, programClass)) && !shadowsAnyFields(programClass, targetClass) && !shadowsAnyFields(targetClass, programClass)) && !haveAnyIdenticalMethods(programClass, targetClass) &&
public void visitProgramClass(ProgramClass programClass) { // Only merge wrapper classes that extend java.lang.Object. if (ClassConstants.NAME_JAVA_LANG_OBJECT.equals(programClass.getSuperName())) { // Do we have a wrapped program class? Clazz wrappedClass = WrapperClassMarker.getWrappedClass(programClass); if (wrappedClass instanceof ProgramClass) { // Try inlining the wrapper class into the wrapped class. new ClassMerger((ProgramClass)wrappedClass, allowAccessModification, false, true, extraClassVisitor).visitProgramClass(programClass); } } } }
getTargetClass(programClass) == null && getTargetClass(targetClass) == null && (ClassConstants.ACC_INTERFACE | ClassConstants.ACC_ABSTRACT)) || (isOnlySubClass(programClass, targetClass) && programClass.getSuperClass() != null && (programClass.getSuperClass().equals(targetClass) || !indirectlyImplementedInterfaces(programClass).contains(targetClass) && !targetClass.extendsOrImplements(programClass) && subInterfaces(programClass, targetClass).equals(subInterfaces(targetClass, programClass))) && sideEffectSuperClasses(programClass).equals(sideEffectSuperClasses(targetClass)) && instanceofedSuperClasses(programClass).equals(instanceofedSuperClasses(targetClass)) && caughtSuperClasses(programClass).equals(caughtSuperClasses(targetClass)) && !haveAnyIdenticalFields(programClass, targetClass)) && !introducesUnwantedFields(programClass, targetClass) && !introducesUnwantedFields(targetClass, programClass)) && !shadowsAnyFields(programClass, targetClass) && !shadowsAnyFields(targetClass, programClass)) && !haveAnyIdenticalMethods(programClass, targetClass) &&
/** * Sets the global return value to true if the given class is retargeted. */ private void checkTarget(Clazz clazz) { if (clazz != null && ClassMerger.getTargetClass(clazz) != null) { retargeted = true; } } }
/** * Returns whether the given class would introduce any unwanted fields * in the target class. */ private boolean introducesUnwantedFields(Clazz programClass, ProgramClass targetClass) { // It's ok if the target class is never instantiated and does not // have any subclasses except for maybe the source class. if (!InstantiationClassMarker.isInstantiated(targetClass) && (targetClass.subClasses == null || isOnlySubClass(programClass, targetClass))) { return false; } MemberCounter counter = new MemberCounter(); // Count all non-static fields in the the source class. programClass.fieldsAccept(new MemberAccessFilter(0, ClassConstants.ACC_STATIC, counter)); return counter.getCount() > 0; }
public void visitProgramClass(ProgramClass programClass) { // Only merge wrapper classes that extend java.lang.Object. if (ClassConstants.NAME_JAVA_LANG_OBJECT.equals(programClass.getSuperName())) { // Do we have a wrapped program class? Clazz wrappedClass = WrapperClassMarker.getWrappedClass(programClass); if (wrappedClass instanceof ProgramClass) { // Try inlining the wrapper class into the wrapped class. new ClassMerger((ProgramClass)wrappedClass, allowAccessModification, false, true, extraClassVisitor).visitProgramClass(programClass); } } } }
public void visitProgramClass(ProgramClass programClass) { // Try inlining all immediate subclasses into this class. programClass.subclassesAccept(new ClassMerger(programClass, allowAccessModification, mergeInterfacesAggressively, false, extraClassVisitor)); } }
/** * Sets the global return value to true if the given class is retargeted. */ private void checkTarget(Clazz clazz) { if (clazz != null && ClassMerger.getTargetClass(clazz) != null) { retargeted = true; } } }
/** * Returns whether the given class would introduce any unwanted fields * in the target class. */ private boolean introducesUnwantedFields(Clazz programClass, ProgramClass targetClass) { // It's ok if the target class is never instantiated and does not // have any subclasses except for maybe the source class. if (!InstantiationClassMarker.isInstantiated(targetClass) && (targetClass.subClasses == null || isOnlySubClass(programClass, targetClass))) { return false; } MemberCounter counter = new MemberCounter(); // Count all non-static fields in the the source class. programClass.fieldsAccept(new MemberAccessFilter(0, ClassConstants.ACC_STATIC, counter)); return counter.getCount() > 0; }
public void visitProgramClass(ProgramClass programClass) { // Try inlining all immediate subclasses into this class. programClass.subclassesAccept(new ClassMerger(programClass, allowAccessModification, mergeInterfacesAggressively, false, extraClassVisitor)); } }
/** * Sets the global return value to true if the given class is retargeted. */ private void checkTarget(Clazz clazz) { if (clazz != null && ClassMerger.getTargetClass(clazz) != null) { retargeted = true; } } }
/** * Returns whether the given class would introduce any unwanted fields * in the target class. */ private boolean introducesUnwantedFields(Clazz programClass, ProgramClass targetClass) { // It's ok if the target class is never instantiated and does not // have any subclasses except for maybe the source class. if (!InstantiationClassMarker.isInstantiated(targetClass) && (targetClass.subClasses == null || isOnlySubClass(programClass, targetClass))) { return false; } MemberCounter counter = new MemberCounter(); // Count all non-static fields in the the source class. programClass.fieldsAccept(new MemberAccessFilter(0, ClassConstants.ACC_STATIC, counter)); return counter.getCount() > 0; }
public void visitProgramClass(ProgramClass programClass) { // Try inlining all immediate subclasses into this class. programClass.subclassesAccept(new ClassMerger(programClass, allowAccessModification, mergeInterfacesAggressively, false, extraClassVisitor)); } }
public void visitProgramClass(ProgramClass programClass) { wrappedClass = ClassMerger.getTargetClass(programClass); }