|  | // Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  | package com.android.tools.r8.cf; | 
|  |  | 
|  | import static org.junit.Assert.assertEquals; | 
|  |  | 
|  | import com.android.tools.r8.ByteDataView; | 
|  | import com.android.tools.r8.ClassFileConsumer.ArchiveConsumer; | 
|  | import com.android.tools.r8.CompilationMode; | 
|  | import com.android.tools.r8.R8; | 
|  | import com.android.tools.r8.R8Command; | 
|  | import com.android.tools.r8.TestBase; | 
|  | import com.android.tools.r8.ToolHelper; | 
|  | import com.android.tools.r8.ToolHelper.ProcessResult; | 
|  | import java.nio.file.Path; | 
|  | import org.junit.Test; | 
|  | import org.objectweb.asm.ClassWriter; | 
|  | import org.objectweb.asm.Label; | 
|  | import org.objectweb.asm.MethodVisitor; | 
|  | import org.objectweb.asm.Opcodes; | 
|  |  | 
|  | public class UnneededLoadStoreDebugInfoTest extends TestBase { | 
|  |  | 
|  | private static final String CLASS_NAME = "UnneededLoadStoreDebugInfoTest"; | 
|  | private static final String DESCRIPTOR = "L" + CLASS_NAME + ";"; | 
|  |  | 
|  | public static class Dump implements Opcodes { | 
|  |  | 
|  | public static byte[] dump() { | 
|  | ClassWriter cw = new ClassWriter(0); | 
|  | MethodVisitor mv; | 
|  |  | 
|  | cw.visit(V1_8, ACC_PUBLIC + ACC_SUPER, CLASS_NAME, null, "java/lang/Object", null); | 
|  |  | 
|  | { | 
|  | mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null); | 
|  | mv.visitCode(); | 
|  | Label argsStart = new Label(); | 
|  | mv.visitLabel(argsStart); | 
|  | mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); | 
|  | Label argsEnd = new Label(); | 
|  | mv.visitLabel(argsEnd); | 
|  | mv.visitTypeInsn(CHECKCAST, "java/io/PrintStream"); | 
|  | mv.visitInsn(POP); | 
|  | mv.visitInsn(RETURN); | 
|  | mv.visitLocalVariable("args", "[Ljava/lang/String;", null, argsStart, argsEnd, 0); | 
|  | mv.visitMaxs(1, 1); | 
|  | mv.visitEnd(); | 
|  | } | 
|  | cw.visitEnd(); | 
|  |  | 
|  | return cw.toByteArray(); | 
|  | } | 
|  | } | 
|  |  | 
|  | @Test | 
|  | public void test() throws Exception { | 
|  | Path inputJar = temp.getRoot().toPath().resolve("input.jar"); | 
|  | ArchiveConsumer consumer = new ArchiveConsumer(inputJar); | 
|  | consumer.accept(ByteDataView.of(Dump.dump()), DESCRIPTOR, null); | 
|  | consumer.finished(null); | 
|  | ProcessResult runInput = ToolHelper.runJava(inputJar, CLASS_NAME); | 
|  | assertEquals(0, runInput.exitCode); | 
|  | Path outputJar = temp.getRoot().toPath().resolve("output.jar"); | 
|  | R8.run( | 
|  | R8Command.builder() | 
|  | .setMode(CompilationMode.DEBUG) | 
|  | .setDisableTreeShaking(true) | 
|  | .setDisableMinification(true) | 
|  | .addProgramFiles(inputJar) | 
|  | .addLibraryFiles(ToolHelper.getJava8RuntimeJar()) | 
|  | .setProgramConsumer(new ArchiveConsumer(outputJar)) | 
|  | .build()); | 
|  | ProcessResult runOutput = ToolHelper.runJava(outputJar, CLASS_NAME); | 
|  | assertEquals(runInput.toString(), runOutput.toString()); | 
|  | } | 
|  | } |