diff options
Diffstat (limited to 'src/tools/android/java/com/google/devtools/build/android/desugar/InterfaceDesugaring.java')
-rw-r--r-- | src/tools/android/java/com/google/devtools/build/android/desugar/InterfaceDesugaring.java | 79 |
1 files changed, 4 insertions, 75 deletions
diff --git a/src/tools/android/java/com/google/devtools/build/android/desugar/InterfaceDesugaring.java b/src/tools/android/java/com/google/devtools/build/android/desugar/InterfaceDesugaring.java index c32ca9ab98..adcd1e04af 100644 --- a/src/tools/android/java/com/google/devtools/build/android/desugar/InterfaceDesugaring.java +++ b/src/tools/android/java/com/google/devtools/build/android/desugar/InterfaceDesugaring.java @@ -14,7 +14,6 @@ package com.google.devtools.build.android.desugar; import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; import javax.annotation.Nullable; @@ -38,9 +37,6 @@ import org.objectweb.asm.TypePath; */ class InterfaceDesugaring extends ClassVisitor { - static final String COMPANION_METHOD_TO_TRIGGER_INTERFACE_CLINIT_NAME = "$$triggerInterfaceInit"; - static final String COMPANION_METHOD_TO_TRIGGER_INTERFACE_CLINIT_DESC = "()V"; - static final String COMPANION_SUFFIX = "$$CC"; static final String INTERFACE_STATIC_COMPANION_METHOD_SUFFIX = "$$STATIC$$"; @@ -51,7 +47,6 @@ class InterfaceDesugaring extends ClassVisitor { private int bytecodeVersion; private int accessFlags; @Nullable private ClassVisitor companion; - @Nullable private FieldInfo interfaceFieldToAccessInCompanionMethodToTriggerInterfaceClinit; public InterfaceDesugaring( ClassVisitor dest, ClassReaderFactory bootclasspath, GeneratedClassStore store) { @@ -78,50 +73,18 @@ class InterfaceDesugaring extends ClassVisitor { @Override public void visitEnd() { if (companion != null) { - // Emit a method to access the fields of the interfaces that need initialization. - emitInterfaceFieldAccessInCompanionMethodToTriggerInterfaceClinit(); companion.visitEnd(); } super.visitEnd(); } - private void emitInterfaceFieldAccessInCompanionMethodToTriggerInterfaceClinit() { - if (companion == null - || interfaceFieldToAccessInCompanionMethodToTriggerInterfaceClinit == null) { - return; - } - - // Create a method to access the interface fields - MethodVisitor visitor = - checkNotNull( - companion.visitMethod( - Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC, - COMPANION_METHOD_TO_TRIGGER_INTERFACE_CLINIT_NAME, - COMPANION_METHOD_TO_TRIGGER_INTERFACE_CLINIT_DESC, - null, - null), - "Cannot get a method visitor to write out %s to the companion class.", - COMPANION_METHOD_TO_TRIGGER_INTERFACE_CLINIT_NAME); - // Visit the interface field to triger <clinit> of the interface. - visitor.visitFieldInsn( - Opcodes.GETSTATIC, - interfaceFieldToAccessInCompanionMethodToTriggerInterfaceClinit.owner(), - interfaceFieldToAccessInCompanionMethodToTriggerInterfaceClinit.name(), - interfaceFieldToAccessInCompanionMethodToTriggerInterfaceClinit.desc()); - visitor.visitInsn(Opcodes.POP); - visitor.visitInsn(Opcodes.RETURN); - } - @Override public MethodVisitor visitMethod( int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor result; - if (isStaticInitializer(name)) { - result = - new InterfaceFieldWriteCollector( - super.visitMethod(access, name, desc, signature, exceptions)); - } else if (BitFlags.isSet(accessFlags, Opcodes.ACC_INTERFACE) - && BitFlags.noneSet(access, Opcodes.ACC_ABSTRACT | Opcodes.ACC_BRIDGE)) { + if (BitFlags.isSet(accessFlags, Opcodes.ACC_INTERFACE) + && BitFlags.noneSet(access, Opcodes.ACC_ABSTRACT | Opcodes.ACC_BRIDGE) + && !"<clinit>".equals(name)) { checkArgument(BitFlags.noneSet(access, Opcodes.ACC_NATIVE), "Forbidden per JLS ch 9.4"); boolean isLambdaBody = @@ -177,10 +140,6 @@ class InterfaceDesugaring extends ClassVisitor { : null; } - private static boolean isStaticInitializer(String methodName) { - return "<clinit>".equals(methodName); - } - private static String normalizeInterfaceMethodName( String name, boolean isLambda, boolean isStatic) { String suffix; @@ -197,10 +156,6 @@ class InterfaceDesugaring extends ClassVisitor { return name + suffix; } - static String getCompanionClassName(String interfaceName) { - return interfaceName + COMPANION_SUFFIX; - } - /** * Returns the descriptor of a static method for an instance method with the given receiver and * description, simply by pre-pending the given descriptor's parameter list with the given @@ -217,7 +172,7 @@ class InterfaceDesugaring extends ClassVisitor { private ClassVisitor companion() { if (companion == null) { checkState(BitFlags.isSet(accessFlags, Opcodes.ACC_INTERFACE)); - String companionName = getCompanionClassName(internalName); + String companionName = internalName + COMPANION_SUFFIX; companion = store.add(companionName); companion.visit( @@ -233,32 +188,6 @@ class InterfaceDesugaring extends ClassVisitor { } /** - * Interface field scanner to get the field of the current interface that is written in the - * initializer. - */ - private class InterfaceFieldWriteCollector extends MethodVisitor { - - public InterfaceFieldWriteCollector(MethodVisitor mv) { - super(Opcodes.ASM5, mv); - } - - @Override - public void visitFieldInsn(int opcode, String owner, String name, String desc) { - if (interfaceFieldToAccessInCompanionMethodToTriggerInterfaceClinit == null - && opcode == Opcodes.PUTSTATIC) { - checkState( - owner.equals(internalName), - "Expect only the fields in this interface to be initialized. owner=%s, expected=%s", - owner, - internalName); - interfaceFieldToAccessInCompanionMethodToTriggerInterfaceClinit = - FieldInfo.create(owner, name, desc); - } - super.visitFieldInsn(opcode, owner, name, desc); - } - } - - /** * Rewriter for calls to static interface methods and super calls to default methods, unless * they're part of the bootclasspath, as well as all lambda body methods. Keeps calls to interface * methods declared in the bootclasspath as-is (but note that these would presumably fail on |