| // Copyright (c) 2024, 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 twr.twrcloseresourceduplication.asm; | |
| import org.objectweb.asm.AnnotationVisitor; | |
| import org.objectweb.asm.ClassWriter; | |
| import org.objectweb.asm.FieldVisitor; | |
| import org.objectweb.asm.Handle; | |
| import org.objectweb.asm.Label; | |
| import org.objectweb.asm.MethodVisitor; | |
| import org.objectweb.asm.Opcodes; | |
| import org.objectweb.asm.RecordComponentVisitor; | |
| public class TwrCloseResourceDuplication$BarDump implements Opcodes { | |
| public static byte[] dump() throws Exception { | |
| ClassWriter classWriter = new ClassWriter(0); | |
| FieldVisitor fieldVisitor; | |
| RecordComponentVisitor recordComponentVisitor; | |
| MethodVisitor methodVisitor; | |
| AnnotationVisitor annotationVisitor0; | |
| classWriter.visit( | |
| V9, | |
| ACC_PUBLIC | ACC_SUPER, | |
| "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar", | |
| null, | |
| "java/lang/Object", | |
| null); | |
| classWriter.visitSource("TwrCloseResourceDuplication.java", null); | |
| classWriter.visitInnerClass( | |
| "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar", | |
| "twr/twrcloseresourceduplication/TwrCloseResourceDuplication", | |
| "Bar", | |
| ACC_PUBLIC | ACC_STATIC); | |
| classWriter.visitInnerClass( | |
| "java/lang/invoke/MethodHandles$Lookup", | |
| "java/lang/invoke/MethodHandles", | |
| "Lookup", | |
| ACC_PUBLIC | ACC_FINAL | ACC_STATIC); | |
| { | |
| methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null); | |
| methodVisitor.visitCode(); | |
| Label label0 = new Label(); | |
| methodVisitor.visitLabel(label0); | |
| methodVisitor.visitLineNumber(31, label0); | |
| methodVisitor.visitVarInsn(ALOAD, 0); | |
| methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false); | |
| methodVisitor.visitInsn(RETURN); | |
| Label label1 = new Label(); | |
| methodVisitor.visitLabel(label1); | |
| methodVisitor.visitLocalVariable( | |
| "this", | |
| "Ltwrcloseresourceduplication/TwrCloseResourceDuplication$Bar;", | |
| null, | |
| label0, | |
| label1, | |
| 0); | |
| methodVisitor.visitMaxs(1, 1); | |
| methodVisitor.visitEnd(); | |
| } | |
| { | |
| methodVisitor = classWriter.visitMethod(0, "bar", "(Ljava/lang/String;)V", null, null); | |
| methodVisitor.visitCode(); | |
| Label label0 = new Label(); | |
| Label label1 = new Label(); | |
| Label label2 = new Label(); | |
| methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Throwable"); | |
| Label label3 = new Label(); | |
| methodVisitor.visitTryCatchBlock(label0, label1, label3, null); | |
| Label label4 = new Label(); | |
| methodVisitor.visitTryCatchBlock(label2, label4, label3, null); | |
| Label label5 = new Label(); | |
| Label label6 = new Label(); | |
| Label label7 = new Label(); | |
| methodVisitor.visitTryCatchBlock(label5, label6, label7, "java/lang/Exception"); | |
| Label label8 = new Label(); | |
| methodVisitor.visitTryCatchBlock(label5, label6, label8, null); | |
| Label label9 = new Label(); | |
| methodVisitor.visitTryCatchBlock(label7, label9, label8, null); | |
| Label label10 = new Label(); | |
| methodVisitor.visitTryCatchBlock(label8, label10, label8, null); | |
| Label label11 = new Label(); | |
| Label label12 = new Label(); | |
| methodVisitor.visitTryCatchBlock(label11, label12, label12, "java/lang/Throwable"); | |
| Label label13 = new Label(); | |
| Label label14 = new Label(); | |
| methodVisitor.visitTryCatchBlock(label11, label13, label14, null); | |
| Label label15 = new Label(); | |
| Label label16 = new Label(); | |
| methodVisitor.visitTryCatchBlock(label15, label16, label16, "java/lang/Exception"); | |
| Label label17 = new Label(); | |
| Label label18 = new Label(); | |
| methodVisitor.visitTryCatchBlock(label15, label17, label18, null); | |
| Label label19 = new Label(); | |
| methodVisitor.visitTryCatchBlock(label18, label19, label18, null); | |
| methodVisitor.visitLabel(label5); | |
| methodVisitor.visitLineNumber(34, label5); | |
| methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile"); | |
| methodVisitor.visitInsn(DUP); | |
| methodVisitor.visitVarInsn(ALOAD, 1); | |
| methodVisitor.visitMethodInsn( | |
| INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false); | |
| methodVisitor.visitVarInsn(ASTORE, 2); | |
| Label label20 = new Label(); | |
| methodVisitor.visitLabel(label20); | |
| methodVisitor.visitInsn(ACONST_NULL); | |
| methodVisitor.visitVarInsn(ASTORE, 3); | |
| methodVisitor.visitLabel(label0); | |
| methodVisitor.visitLineNumber(35, label0); | |
| methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); | |
| methodVisitor.visitLdcInsn("bar opened 1"); | |
| methodVisitor.visitMethodInsn( | |
| INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false); | |
| methodVisitor.visitLabel(label1); | |
| methodVisitor.visitLineNumber(36, label1); | |
| methodVisitor.visitVarInsn(ALOAD, 3); | |
| methodVisitor.visitVarInsn(ALOAD, 2); | |
| methodVisitor.visitMethodInsn( | |
| INVOKESTATIC, | |
| "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar", | |
| "$closeResource", | |
| "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V", | |
| false); | |
| methodVisitor.visitJumpInsn(GOTO, label6); | |
| methodVisitor.visitLabel(label2); | |
| methodVisitor.visitLineNumber(34, label2); | |
| methodVisitor.visitFrame( | |
| Opcodes.F_FULL, | |
| 4, | |
| new Object[] { | |
| "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar", | |
| "java/lang/String", | |
| "java/util/jar/JarFile", | |
| "java/lang/Throwable" | |
| }, | |
| 1, | |
| new Object[] {"java/lang/Throwable"}); | |
| methodVisitor.visitVarInsn(ASTORE, 4); | |
| methodVisitor.visitVarInsn(ALOAD, 4); | |
| methodVisitor.visitVarInsn(ASTORE, 3); | |
| methodVisitor.visitVarInsn(ALOAD, 4); | |
| methodVisitor.visitInsn(ATHROW); | |
| methodVisitor.visitLabel(label3); | |
| methodVisitor.visitLineNumber(36, label3); | |
| methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"}); | |
| methodVisitor.visitVarInsn(ASTORE, 5); | |
| methodVisitor.visitLabel(label4); | |
| methodVisitor.visitVarInsn(ALOAD, 3); | |
| methodVisitor.visitVarInsn(ALOAD, 2); | |
| methodVisitor.visitMethodInsn( | |
| INVOKESTATIC, | |
| "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar", | |
| "$closeResource", | |
| "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V", | |
| false); | |
| methodVisitor.visitVarInsn(ALOAD, 5); | |
| methodVisitor.visitInsn(ATHROW); | |
| methodVisitor.visitLabel(label6); | |
| methodVisitor.visitLineNumber(39, label6); | |
| methodVisitor.visitFrame(Opcodes.F_CHOP, 2, null, 0, null); | |
| methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); | |
| methodVisitor.visitLdcInsn("bar post close 1"); | |
| methodVisitor.visitMethodInsn( | |
| INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false); | |
| Label label21 = new Label(); | |
| methodVisitor.visitLabel(label21); | |
| methodVisitor.visitLineNumber(40, label21); | |
| methodVisitor.visitJumpInsn(GOTO, label15); | |
| methodVisitor.visitLabel(label7); | |
| methodVisitor.visitLineNumber(36, label7); | |
| methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Exception"}); | |
| methodVisitor.visitVarInsn(ASTORE, 2); | |
| Label label22 = new Label(); | |
| methodVisitor.visitLabel(label22); | |
| methodVisitor.visitLineNumber(37, label22); | |
| methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); | |
| methodVisitor.visitVarInsn(ALOAD, 2); | |
| methodVisitor.visitMethodInsn( | |
| INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false); | |
| methodVisitor.visitMethodInsn( | |
| INVOKEVIRTUAL, "java/lang/Class", "getSimpleName", "()Ljava/lang/String;", false); | |
| methodVisitor.visitInvokeDynamicInsn( | |
| "makeConcatWithConstants", | |
| "(Ljava/lang/String;)Ljava/lang/String;", | |
| new Handle( | |
| Opcodes.H_INVOKESTATIC, | |
| "java/lang/invoke/StringConcatFactory", | |
| "makeConcatWithConstants", | |
| "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;", | |
| false), | |
| new Object[] {"bar caught from 1: \u0001"}); | |
| methodVisitor.visitMethodInsn( | |
| INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false); | |
| methodVisitor.visitLabel(label9); | |
| methodVisitor.visitLineNumber(39, label9); | |
| methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); | |
| methodVisitor.visitLdcInsn("bar post close 1"); | |
| methodVisitor.visitMethodInsn( | |
| INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false); | |
| Label label23 = new Label(); | |
| methodVisitor.visitLabel(label23); | |
| methodVisitor.visitLineNumber(40, label23); | |
| methodVisitor.visitJumpInsn(GOTO, label15); | |
| methodVisitor.visitLabel(label8); | |
| methodVisitor.visitLineNumber(39, label8); | |
| methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"}); | |
| methodVisitor.visitVarInsn(ASTORE, 6); | |
| methodVisitor.visitLabel(label10); | |
| methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); | |
| methodVisitor.visitLdcInsn("bar post close 1"); | |
| methodVisitor.visitMethodInsn( | |
| INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false); | |
| methodVisitor.visitVarInsn(ALOAD, 6); | |
| methodVisitor.visitInsn(ATHROW); | |
| methodVisitor.visitLabel(label15); | |
| methodVisitor.visitLineNumber(41, label15); | |
| methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); | |
| methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile"); | |
| methodVisitor.visitInsn(DUP); | |
| methodVisitor.visitVarInsn(ALOAD, 1); | |
| methodVisitor.visitMethodInsn( | |
| INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false); | |
| methodVisitor.visitVarInsn(ASTORE, 2); | |
| Label label24 = new Label(); | |
| methodVisitor.visitLabel(label24); | |
| methodVisitor.visitInsn(ACONST_NULL); | |
| methodVisitor.visitVarInsn(ASTORE, 3); | |
| methodVisitor.visitLabel(label11); | |
| methodVisitor.visitLineNumber(42, label11); | |
| methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); | |
| methodVisitor.visitLdcInsn("bar opened 2"); | |
| methodVisitor.visitMethodInsn( | |
| INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false); | |
| Label label25 = new Label(); | |
| methodVisitor.visitLabel(label25); | |
| methodVisitor.visitLineNumber(43, label25); | |
| methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException"); | |
| methodVisitor.visitInsn(DUP); | |
| methodVisitor.visitMethodInsn( | |
| INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false); | |
| methodVisitor.visitInsn(ATHROW); | |
| methodVisitor.visitLabel(label12); | |
| methodVisitor.visitLineNumber(41, label12); | |
| methodVisitor.visitFrame( | |
| Opcodes.F_FULL, | |
| 4, | |
| new Object[] { | |
| "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar", | |
| "java/lang/String", | |
| "java/util/jar/JarFile", | |
| "java/lang/Throwable" | |
| }, | |
| 1, | |
| new Object[] {"java/lang/Throwable"}); | |
| methodVisitor.visitVarInsn(ASTORE, 4); | |
| methodVisitor.visitVarInsn(ALOAD, 4); | |
| methodVisitor.visitVarInsn(ASTORE, 3); | |
| methodVisitor.visitVarInsn(ALOAD, 4); | |
| methodVisitor.visitInsn(ATHROW); | |
| methodVisitor.visitLabel(label14); | |
| methodVisitor.visitLineNumber(44, label14); | |
| methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"}); | |
| methodVisitor.visitVarInsn(ASTORE, 7); | |
| methodVisitor.visitLabel(label13); | |
| methodVisitor.visitVarInsn(ALOAD, 3); | |
| methodVisitor.visitVarInsn(ALOAD, 2); | |
| methodVisitor.visitMethodInsn( | |
| INVOKESTATIC, | |
| "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar", | |
| "$closeResource", | |
| "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V", | |
| false); | |
| methodVisitor.visitVarInsn(ALOAD, 7); | |
| methodVisitor.visitInsn(ATHROW); | |
| methodVisitor.visitLabel(label16); | |
| methodVisitor.visitFrame( | |
| Opcodes.F_FULL, | |
| 2, | |
| new Object[] { | |
| "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar", "java/lang/String" | |
| }, | |
| 1, | |
| new Object[] {"java/lang/Exception"}); | |
| methodVisitor.visitVarInsn(ASTORE, 2); | |
| Label label26 = new Label(); | |
| methodVisitor.visitLabel(label26); | |
| methodVisitor.visitLineNumber(45, label26); | |
| methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); | |
| methodVisitor.visitVarInsn(ALOAD, 2); | |
| methodVisitor.visitMethodInsn( | |
| INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false); | |
| methodVisitor.visitMethodInsn( | |
| INVOKEVIRTUAL, "java/lang/Class", "getSimpleName", "()Ljava/lang/String;", false); | |
| methodVisitor.visitInvokeDynamicInsn( | |
| "makeConcatWithConstants", | |
| "(Ljava/lang/String;)Ljava/lang/String;", | |
| new Handle( | |
| Opcodes.H_INVOKESTATIC, | |
| "java/lang/invoke/StringConcatFactory", | |
| "makeConcatWithConstants", | |
| "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;", | |
| false), | |
| new Object[] {"bar caught from 2: \u0001"}); | |
| methodVisitor.visitMethodInsn( | |
| INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false); | |
| methodVisitor.visitLabel(label17); | |
| methodVisitor.visitLineNumber(47, label17); | |
| methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); | |
| methodVisitor.visitLdcInsn("bar post close 2"); | |
| methodVisitor.visitMethodInsn( | |
| INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false); | |
| Label label27 = new Label(); | |
| methodVisitor.visitLabel(label27); | |
| methodVisitor.visitLineNumber(48, label27); | |
| Label label28 = new Label(); | |
| methodVisitor.visitJumpInsn(GOTO, label28); | |
| methodVisitor.visitLabel(label18); | |
| methodVisitor.visitLineNumber(47, label18); | |
| methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"}); | |
| methodVisitor.visitVarInsn(ASTORE, 8); | |
| methodVisitor.visitLabel(label19); | |
| methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); | |
| methodVisitor.visitLdcInsn("bar post close 2"); | |
| methodVisitor.visitMethodInsn( | |
| INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false); | |
| methodVisitor.visitVarInsn(ALOAD, 8); | |
| methodVisitor.visitInsn(ATHROW); | |
| methodVisitor.visitLabel(label28); | |
| methodVisitor.visitLineNumber(49, label28); | |
| methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); | |
| methodVisitor.visitInsn(RETURN); | |
| Label label29 = new Label(); | |
| methodVisitor.visitLabel(label29); | |
| methodVisitor.visitLocalVariable("f", "Ljava/util/jar/JarFile;", null, label20, label6, 2); | |
| methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label22, label9, 2); | |
| methodVisitor.visitLocalVariable("f", "Ljava/util/jar/JarFile;", null, label24, label16, 2); | |
| methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label26, label17, 2); | |
| methodVisitor.visitLocalVariable( | |
| "this", | |
| "Ltwrcloseresourceduplication/TwrCloseResourceDuplication$Bar;", | |
| null, | |
| label5, | |
| label29, | |
| 0); | |
| methodVisitor.visitLocalVariable("name", "Ljava/lang/String;", null, label5, label29, 1); | |
| methodVisitor.visitMaxs(3, 9); | |
| methodVisitor.visitEnd(); | |
| } | |
| { | |
| methodVisitor = | |
| classWriter.visitMethod( | |
| ACC_PRIVATE | ACC_STATIC | ACC_SYNTHETIC, | |
| "$closeResource", | |
| "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V", | |
| null, | |
| null); | |
| methodVisitor.visitCode(); | |
| Label label0 = new Label(); | |
| Label label1 = new Label(); | |
| Label label2 = new Label(); | |
| methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Throwable"); | |
| Label label3 = new Label(); | |
| methodVisitor.visitLabel(label3); | |
| methodVisitor.visitLineNumber(36, label3); | |
| methodVisitor.visitVarInsn(ALOAD, 0); | |
| Label label4 = new Label(); | |
| methodVisitor.visitJumpInsn(IFNULL, label4); | |
| methodVisitor.visitLabel(label0); | |
| methodVisitor.visitVarInsn(ALOAD, 1); | |
| methodVisitor.visitMethodInsn( | |
| INVOKEINTERFACE, "java/lang/AutoCloseable", "close", "()V", true); | |
| methodVisitor.visitLabel(label1); | |
| Label label5 = new Label(); | |
| methodVisitor.visitJumpInsn(GOTO, label5); | |
| methodVisitor.visitLabel(label2); | |
| methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"}); | |
| methodVisitor.visitVarInsn(ASTORE, 2); | |
| methodVisitor.visitVarInsn(ALOAD, 0); | |
| methodVisitor.visitVarInsn(ALOAD, 2); | |
| methodVisitor.visitMethodInsn( | |
| INVOKEVIRTUAL, "java/lang/Throwable", "addSuppressed", "(Ljava/lang/Throwable;)V", false); | |
| methodVisitor.visitJumpInsn(GOTO, label5); | |
| methodVisitor.visitLabel(label4); | |
| methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); | |
| methodVisitor.visitVarInsn(ALOAD, 1); | |
| methodVisitor.visitMethodInsn( | |
| INVOKEINTERFACE, "java/lang/AutoCloseable", "close", "()V", true); | |
| methodVisitor.visitLabel(label5); | |
| methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); | |
| methodVisitor.visitInsn(RETURN); | |
| Label label6 = new Label(); | |
| methodVisitor.visitLabel(label6); | |
| methodVisitor.visitLocalVariable("x0", "Ljava/lang/Throwable;", null, label3, label6, 0); | |
| methodVisitor.visitLocalVariable("x1", "Ljava/lang/AutoCloseable;", null, label3, label6, 1); | |
| methodVisitor.visitMaxs(2, 3); | |
| methodVisitor.visitEnd(); | |
| } | |
| classWriter.visitEnd(); | |
| return classWriter.toByteArray(); | |
| } | |
| } |