private void fixAccessFlags(LambdaExpression lambdaExpression) { // If the invoked method is private, we can make it package-private // to be able to access it from the lambda class. Otherwise we would // need to add an additional accessor method. if (lambdaExpression.referencedInvokedMethod instanceof ProgramMethod) { ProgramMethod invokedProgramMethod = (ProgramMethod) lambdaExpression.referencedInvokedMethod; int currentAccessFlags = invokedProgramMethod.getAccessFlags(); if ((currentAccessFlags & ClassConstants.ACC_PRIVATE) != 0) { invokedProgramMethod.u2accessFlags = AccessUtil.replaceAccessFlags(currentAccessFlags, AccessUtil.accessFlags(AccessUtil.PACKAGE_VISIBLE)); // In case of instance-capturing lambdas or method references to private // methods the reference kind is invokeSpecial. After fixing the // access flags we need to update the reference kind as well. if (lambdaExpression.invokedReferenceKind == ClassConstants.REF_invokeSpecial) { lambdaExpression.invokedReferenceKind = ClassConstants.REF_invokeVirtual; } } } }
private void fixAccessFlags(LambdaExpression lambdaExpression) { // If the invoked method is private, we can make it package-private // to be able to access it from the lambda class. Otherwise we would // need to add an additional accessor method. if (lambdaExpression.referencedInvokedMethod instanceof ProgramMethod) { ProgramMethod invokedProgramMethod = (ProgramMethod) lambdaExpression.referencedInvokedMethod; int currentAccessFlags = invokedProgramMethod.getAccessFlags(); if ((currentAccessFlags & ClassConstants.ACC_PRIVATE) != 0) { invokedProgramMethod.u2accessFlags = AccessUtil.replaceAccessFlags(currentAccessFlags, AccessUtil.accessFlags(AccessUtil.PACKAGE_VISIBLE)); // In case of instance-capturing lambdas or method references to private // methods the reference kind is invokeSpecial. After fixing the // access flags we need to update the reference kind as well. if (lambdaExpression.invokedReferenceKind == ClassConstants.REF_invokeSpecial) { lambdaExpression.invokedReferenceKind = ClassConstants.REF_invokeVirtual; } } } }
private void fixAccessFlags(LambdaExpression lambdaExpression) { // If the invoked method is private, we can make it package-private // to be able to access it from the lambda class. Otherwise we would // need to add an additional accessor method. if (lambdaExpression.referencedInvokedMethod instanceof ProgramMethod) { ProgramMethod invokedProgramMethod = (ProgramMethod) lambdaExpression.referencedInvokedMethod; int currentAccessFlags = invokedProgramMethod.getAccessFlags(); if ((currentAccessFlags & ClassConstants.ACC_PRIVATE) != 0) { invokedProgramMethod.u2accessFlags = AccessUtil.replaceAccessFlags(currentAccessFlags, AccessUtil.accessFlags(AccessUtil.PACKAGE_VISIBLE)); // In case of instance-capturing lambdas or method references to private // methods the reference kind is invokeSpecial. After fixing the // access flags we need to update the reference kind as well. if (lambdaExpression.invokedReferenceKind == ClassConstants.REF_invokeSpecial) { lambdaExpression.invokedReferenceKind = ClassConstants.REF_invokeVirtual; } } } }
public void visitProgramClass(ProgramClass programClass) { int currentAccessFlags = programClass.getAccessFlags(); int currentAccessLevel = AccessUtil.accessLevel(currentAccessFlags); // Compute the required access level. Clazz referencingClass = this.referencingClass; int requiredAccessLevel = inSamePackage(programClass, referencingClass) ? AccessUtil.PACKAGE_VISIBLE : AccessUtil.PUBLIC; // Fix the class access flags if necessary. if (currentAccessLevel < requiredAccessLevel) { programClass.u2accessFlags = AccessUtil.replaceAccessFlags(currentAccessFlags, AccessUtil.accessFlags(requiredAccessLevel)); } }
AccessUtil.accessFlags(requiredAccessLevel));
AccessUtil.accessFlags(requiredAccessLevel));
AccessUtil.accessFlags(requiredAccessLevel));
public void visitProgramClass(ProgramClass programClass) { // Do we need to update the access flags? int currentAccessFlags = programClass.getAccessFlags(); int currentAccessLevel = AccessUtil.accessLevel(currentAccessFlags); if (currentAccessLevel < AccessUtil.PUBLIC) { // Compute the required access level. int requiredAccessLevel = inSamePackage(programClass, referencingClass) ? AccessUtil.PACKAGE_VISIBLE : AccessUtil.PUBLIC; // Fix the class access flags if necessary. if (currentAccessLevel < requiredAccessLevel) { programClass.u2accessFlags = AccessUtil.replaceAccessFlags(currentAccessFlags, AccessUtil.accessFlags(requiredAccessLevel)); } } // Also check the InnerClasses attribute, if any. programClass.attributesAccept(this); }
public void visitProgramMember(ProgramClass programClass, ProgramMember programMember) { int currentAccessFlags = programMember.getAccessFlags(); int currentAccessLevel = AccessUtil.accessLevel(currentAccessFlags); // Compute the required access level. int requiredAccessLevel = programClass.equals(referencingClass) ? AccessUtil.PRIVATE : inSamePackage(programClass, referencingClass) ? AccessUtil.PACKAGE_VISIBLE : referencedClass.extends_(referencingClass) && referencingClass.extends_(programClass) ? AccessUtil.PROTECTED : AccessUtil.PUBLIC; // Fix the class member access flags if necessary. if (currentAccessLevel < requiredAccessLevel) { programMember.u2accessFlags = AccessUtil.replaceAccessFlags(currentAccessFlags, AccessUtil.accessFlags(requiredAccessLevel)); } }
public void visitProgramMember(ProgramClass programClass, ProgramMember programMember) { // Do we need to update the access flags? int currentAccessFlags = programMember.getAccessFlags(); int currentAccessLevel = AccessUtil.accessLevel(currentAccessFlags); if (currentAccessLevel < AccessUtil.PUBLIC) { // Compute the required access level. // For protected access, the referencing method may not be // static. We're also taking into account the class in the // invocation and the class that actually contains the member. int requiredAccessLevel = programClass.equals(referencingClass) ? AccessUtil.PRIVATE : inSamePackage(programClass, referencingClass) ? AccessUtil.PACKAGE_VISIBLE : (referencingMethodAccessFlags & ClassConstants.ACC_STATIC) == 0 && (referencedClass == null || referencingClass.extends_(referencedClass)) && referencingClass.extends_(programClass) ? AccessUtil.PROTECTED : AccessUtil.PUBLIC; // Fix the class member access flags if necessary. if (currentAccessLevel < requiredAccessLevel) { programMember.u2accessFlags = AccessUtil.replaceAccessFlags(currentAccessFlags, AccessUtil.accessFlags(requiredAccessLevel)); } } } }
public void visitProgramClass(ProgramClass programClass) { // Do we need to update the access flags? int currentAccessFlags = programClass.getAccessFlags(); int currentAccessLevel = AccessUtil.accessLevel(currentAccessFlags); if (currentAccessLevel < AccessUtil.PUBLIC) { // Compute the required access level. int requiredAccessLevel = inSamePackage(programClass, referencingClass) ? AccessUtil.PACKAGE_VISIBLE : AccessUtil.PUBLIC; // Fix the class access flags if necessary. if (currentAccessLevel < requiredAccessLevel) { programClass.u2accessFlags = AccessUtil.replaceAccessFlags(currentAccessFlags, AccessUtil.accessFlags(requiredAccessLevel)); } } // Also check the InnerClasses attribute, if any. programClass.attributesAccept(this); }
public void visitProgramClass(ProgramClass programClass) { // Do we need to update the access flags? int currentAccessFlags = programClass.getAccessFlags(); int currentAccessLevel = AccessUtil.accessLevel(currentAccessFlags); if (currentAccessLevel < AccessUtil.PUBLIC) { // Compute the required access level. int requiredAccessLevel = inSamePackage(programClass, referencingClass) ? AccessUtil.PACKAGE_VISIBLE : AccessUtil.PUBLIC; // Fix the class access flags if necessary. if (currentAccessLevel < requiredAccessLevel) { programClass.u2accessFlags = AccessUtil.replaceAccessFlags(currentAccessFlags, AccessUtil.accessFlags(requiredAccessLevel)); } } // Also check the InnerClasses attribute, if any. programClass.attributesAccept(this); }
public void visitProgramMember(ProgramClass programClass, ProgramMember programMember) { // Do we need to update the access flags? int currentAccessFlags = programMember.getAccessFlags(); int currentAccessLevel = AccessUtil.accessLevel(currentAccessFlags); if (currentAccessLevel < AccessUtil.PUBLIC) { // Compute the required access level. // For protected access, the referencing method may not be // static. We're also taking into account the class in the // invocation and the class that actually contains the member. int requiredAccessLevel = programClass.equals(referencingClass) ? AccessUtil.PRIVATE : inSamePackage(programClass, referencingClass) ? AccessUtil.PACKAGE_VISIBLE : (referencingMethodAccessFlags & ClassConstants.ACC_STATIC) == 0 && (referencedClass == null || referencingClass.extends_(referencedClass)) && referencingClass.extends_(programClass) ? AccessUtil.PROTECTED : AccessUtil.PUBLIC; // Fix the class member access flags if necessary. if (currentAccessLevel < requiredAccessLevel) { programMember.u2accessFlags = AccessUtil.replaceAccessFlags(currentAccessFlags, AccessUtil.accessFlags(requiredAccessLevel)); } } } }
public void visitProgramMember(ProgramClass programClass, ProgramMember programMember) { // Do we need to update the access flags? int currentAccessFlags = programMember.getAccessFlags(); int currentAccessLevel = AccessUtil.accessLevel(currentAccessFlags); if (currentAccessLevel < AccessUtil.PUBLIC) { // Compute the required access level. // For protected access, the referencing method may not be // static. We're also taking into account the class in the // invocation and the class that actually contains the member. int requiredAccessLevel = programClass.equals(referencingClass) ? AccessUtil.PRIVATE : inSamePackage(programClass, referencingClass) ? AccessUtil.PACKAGE_VISIBLE : (referencingMethodAccessFlags & ClassConstants.ACC_STATIC) == 0 && (referencedClass == null || referencingClass.extends_(referencedClass)) && referencingClass.extends_(programClass) ? AccessUtil.PROTECTED : AccessUtil.PUBLIC; // Fix the class member access flags if necessary. if (currentAccessLevel < requiredAccessLevel) { programMember.u2accessFlags = AccessUtil.replaceAccessFlags(currentAccessFlags, AccessUtil.accessFlags(requiredAccessLevel)); } } } }