Don't write out preamble lines for class file output.
Bug: b/259104971
Change-Id: I256352319ac8ef97006e97809338dd26d7f1f8f8
diff --git a/src/main/java/com/android/tools/r8/graph/CfCode.java b/src/main/java/com/android/tools/r8/graph/CfCode.java
index 63d7d65..43e7099 100644
--- a/src/main/java/com/android/tools/r8/graph/CfCode.java
+++ b/src/main/java/com/android/tools/r8/graph/CfCode.java
@@ -397,6 +397,23 @@
return true;
}
+ private static class PrunePreambleMethodVisitor extends MethodVisitor {
+
+ private boolean inPreamble = true;
+
+ public PrunePreambleMethodVisitor(MethodVisitor methodVisitor) {
+ super(InternalOptions.ASM_VERSION, methodVisitor);
+ }
+
+ @Override
+ public void visitLineNumber(int line, Label start) {
+ if (!inPreamble || line != 0) {
+ inPreamble = false;
+ super.visitLineNumber(line, start);
+ }
+ }
+ }
+
@Override
public void writeCf(
ProgramMethod method,
@@ -422,12 +439,20 @@
|| (appView.enableWholeProgramOptimizations()
&& classFileVersion.isEqualTo(CfVersion.V1_6)
&& !options.shouldKeepStackMapTable());
+ PrunePreambleMethodVisitor prunePreambleVisitor = new PrunePreambleMethodVisitor(visitor);
for (CfInstruction instruction : instructions) {
if (discardFrames && instruction instanceof CfFrame) {
continue;
}
instruction.write(
- appView, method, dexItemFactory, graphLens, initClassLens, namingLens, rewriter, visitor);
+ appView,
+ method,
+ dexItemFactory,
+ graphLens,
+ initClassLens,
+ namingLens,
+ rewriter,
+ prunePreambleVisitor);
}
visitor.visitEnd();
visitor.visitMaxs(maxStack, maxLocals);
diff --git a/src/test/java/com/android/tools/r8/cf/CompanionClassPreamblePositionTest.java b/src/test/java/com/android/tools/r8/cf/CompanionClassPreamblePositionTest.java
index 7f4e142..49d7ef6 100644
--- a/src/test/java/com/android/tools/r8/cf/CompanionClassPreamblePositionTest.java
+++ b/src/test/java/com/android/tools/r8/cf/CompanionClassPreamblePositionTest.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.cf;
import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.MatcherAssert.assertThat;
import com.android.tools.r8.TestBase;
@@ -76,8 +77,7 @@
private void checkZeroLineNotPresent(CodeInspector inspector) throws Exception {
ClassSubject companion = inspector.companionClassFor(I.class);
- // TODO(b/259104971): The zero line should not be added.
- assertThat(companion.javap(true), containsString("line 0: 0"));
+ assertThat(companion.javap(true), not(containsString("line 0: 0")));
}
private byte[] getTransformedI(boolean includeZero) throws Exception {