From d3d324cb04cec79fb60e6019cbd9953af7472f18 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Tue, 8 Nov 2016 20:19:56 +0300 Subject: [PATCH] do not gather line numbers if not needed --- .../actions/JavaSmartStepIntoHandler.java | 2 +- .../debugger/jdi/LocalVariablesUtil.java | 2 +- .../debugger/jdi/MethodBytecodeUtil.java | 21 ++++++++++--------- .../ui/breakpoints/MethodBreakpoint.java | 2 +- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/actions/JavaSmartStepIntoHandler.java b/java/debugger/impl/src/com/intellij/debugger/actions/JavaSmartStepIntoHandler.java index 521fa4689501..a6f570cbbf78 100644 --- a/java/debugger/impl/src/com/intellij/debugger/actions/JavaSmartStepIntoHandler.java +++ b/java/debugger/impl/src/com/intellij/debugger/actions/JavaSmartStepIntoHandler.java @@ -344,7 +344,7 @@ public class JavaSmartStepIntoHandler extends JvmSmartStepIntoHandler { }); } } - }); + }, true); } catch (Exception e) { LOG.info(e); diff --git a/java/debugger/impl/src/com/intellij/debugger/jdi/LocalVariablesUtil.java b/java/debugger/impl/src/com/intellij/debugger/jdi/LocalVariablesUtil.java index 9a708e761ff9..9c22e2a6b160 100644 --- a/java/debugger/impl/src/com/intellij/debugger/jdi/LocalVariablesUtil.java +++ b/java/debugger/impl/src/com/intellij/debugger/jdi/LocalVariablesUtil.java @@ -301,7 +301,7 @@ public class LocalVariablesUtil { } } } - }); + }, false); if (usedVars.isEmpty()) { return Collections.emptyList(); } diff --git a/java/debugger/impl/src/com/intellij/debugger/jdi/MethodBytecodeUtil.java b/java/debugger/impl/src/com/intellij/debugger/jdi/MethodBytecodeUtil.java index 669bfe956786..f4933f23a717 100644 --- a/java/debugger/impl/src/com/intellij/debugger/jdi/MethodBytecodeUtil.java +++ b/java/debugger/impl/src/com/intellij/debugger/jdi/MethodBytecodeUtil.java @@ -32,6 +32,7 @@ import org.jetbrains.org.objectweb.asm.Type; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -46,16 +47,16 @@ public class MethodBytecodeUtil { /** * Allows to use ASM MethodVisitor with jdi method bytecode */ - public static void visit(Method method, MethodVisitor methodVisitor) { - visit(method, method.bytecodes(), methodVisitor); + public static void visit(Method method, MethodVisitor methodVisitor, boolean withLineNumbers) { + visit(method, method.bytecodes(), methodVisitor, withLineNumbers); } - public static void visit(Method method, long maxOffset, MethodVisitor methodVisitor) { + public static void visit(Method method, long maxOffset, MethodVisitor methodVisitor, boolean withLineNumbers) { // need to keep the size, otherwise labels array will not be initialized correctly byte[] originalBytecodes = method.bytecodes(); byte[] bytecodes = new byte[originalBytecodes.length]; System.arraycopy(originalBytecodes, 0, bytecodes, 0, (int)maxOffset); - visit(method, bytecodes, methodVisitor); + visit(method, bytecodes, methodVisitor, withLineNumbers); } public static byte[] getConstantPool(ReferenceType type) { @@ -73,7 +74,7 @@ public class MethodBytecodeUtil { } } - private static void visit(Method method, byte[] bytecodes, MethodVisitor methodVisitor) { + private static void visit(Method method, byte[] bytecodes, MethodVisitor methodVisitor, boolean withLineNumbers) { ReferenceType type = method.declaringType(); try { try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(bos)) { @@ -111,7 +112,7 @@ public class MethodBytecodeUtil { } MethodVisitor mv = writer.visitMethod(Opcodes.ACC_PUBLIC, method.name(), method.signature(), method.signature(), null); - mv.visitAttribute(createCode(writer, method, bytecodes)); + mv.visitAttribute(createCode(writer, method, bytecodes, withLineNumbers)); new ClassReader(writer.toByteArray()).accept(new ClassVisitor(Opcodes.API_VERSION) { @Override @@ -184,14 +185,14 @@ public class MethodBytecodeUtil { } @NotNull - private static Attribute createCode(ClassWriter cw, Method method, byte[] bytecodes) throws IOException { + private static Attribute createCode(ClassWriter cw, Method method, byte[] bytecodes, boolean withLineNumbers) throws IOException { return createAttribute("Code", dos -> { dos.writeShort(0); // max_stack dos.writeShort(0); // max_locals dos.writeInt(bytecodes.length); // code_length dos.write(bytecodes); // code dos.writeShort(0); // exception_table_length - List locations = DebuggerUtilsEx.allLineLocations(method); + List locations = withLineNumbers ? DebuggerUtilsEx.allLineLocations(method) : Collections.emptyList(); if (!locations.isEmpty()) { dos.writeShort(1); // attributes_count dos.writeShort(cw.newUTF8("LineNumberTable")); @@ -246,7 +247,7 @@ public class MethodBytecodeUtil { cls.methodsByName(name, desc).stream().findFirst().ifPresent(methodRef::set); } } - }); + }, false); } } return methodRef.get(); @@ -271,7 +272,7 @@ public class MethodBytecodeUtil { StreamEx.of(cls.methodsByName(name, desc)).findFirst().ifPresent(methodRef::set); } } - }); + }, false); } return methodRef.get(); } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/MethodBreakpoint.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/MethodBreakpoint.java index 79191146c9f5..491529c1c311 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/MethodBreakpoint.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/MethodBreakpoint.java @@ -219,7 +219,7 @@ public class MethodBreakpoint extends BreakpointWithHighlighter createLocationBreakpointRequest(location, debugProcess)); } } - }); + }, true); } } if (base) {