From faf15103cdbb617172793d9d8053389bee06a474 Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Mon, 20 Jun 2011 20:03:52 +0400 Subject: [PATCH] Getting rid of using a classloader in forms instrumenter [by db], take 21 --- .../src/com/intellij/ant/AntClassWriter.java | 2 + .../com/intellij/ant/InstrumentationUtil.java | 34 ++++++++------- .../com/intellij/ant/PseudoClassLoader.java | 42 ++++++++++++++----- 3 files changed, 53 insertions(+), 25 deletions(-) diff --git a/java/compiler/javac2/src/com/intellij/ant/AntClassWriter.java b/java/compiler/javac2/src/com/intellij/ant/AntClassWriter.java index f2dbe795142f..dc8b6552147d 100644 --- a/java/compiler/javac2/src/com/intellij/ant/AntClassWriter.java +++ b/java/compiler/javac2/src/com/intellij/ant/AntClassWriter.java @@ -43,9 +43,11 @@ public class AntClassWriter extends ClassWriter { return p1.getCommonSuperClassName(p2); } catch (ClassNotFoundException e) { + e.printStackTrace(); throw new RuntimeException(e.getMessage()); } catch (IOException e) { + e.printStackTrace(); throw new RuntimeException(e.getMessage()); } } diff --git a/java/compiler/javac2/src/com/intellij/ant/InstrumentationUtil.java b/java/compiler/javac2/src/com/intellij/ant/InstrumentationUtil.java index bba07b3c7d64..8409618031a9 100644 --- a/java/compiler/javac2/src/com/intellij/ant/InstrumentationUtil.java +++ b/java/compiler/javac2/src/com/intellij/ant/InstrumentationUtil.java @@ -243,23 +243,27 @@ public class InstrumentationUtil { } } - public static byte[] instrumentNotNull(final ClassReader reader, final PseudoClassLoader loader) { - int version = getClassFileVersion(reader); - - if (version >= Opcodes.V1_5) { - ClassWriter writer = new AntClassWriter(getAsmClassWriterFlags(version), loader); - - final NotNullVerifyingInstrumenter instrumenter = new NotNullVerifyingInstrumenter(writer); - reader.accept(instrumenter, 0); - - if (instrumenter.isModification()) { - return writer.toByteArray(); - } - } - - return null; + public static byte[] instrumentNotNull(final byte[] buffer, final PseudoClassLoader loader) { + return instrumentNotNull(new ClassReader (buffer), loader); } + private static byte[] instrumentNotNull(final ClassReader reader, final PseudoClassLoader loader) { + int version = getClassFileVersion(reader); + + if (version >= Opcodes.V1_5) { + ClassWriter writer = new AntClassWriter(getAsmClassWriterFlags(version), loader); + + final NotNullVerifyingInstrumenter instrumenter = new NotNullVerifyingInstrumenter(writer); + reader.accept(instrumenter, 0); + + if (instrumenter.isModification()) { + return writer.toByteArray(); + } + } + + return null; + } + public static int instrumentNotNull(final File file, final PseudoClassLoader loader) throws IOException { int instrumented = 0; final String path = file.getPath(); diff --git a/java/compiler/javac2/src/com/intellij/ant/PseudoClassLoader.java b/java/compiler/javac2/src/com/intellij/ant/PseudoClassLoader.java index 97ba1d9e96e8..b0b92553edda 100644 --- a/java/compiler/javac2/src/com/intellij/ant/PseudoClassLoader.java +++ b/java/compiler/javac2/src/com/intellij/ant/PseudoClassLoader.java @@ -15,7 +15,6 @@ */ package com.intellij.ant; -import com.sun.tools.javac.util.Pair; import org.objectweb.asm.Attribute; import org.objectweb.asm.ClassReader; import org.objectweb.asm.Opcodes; @@ -31,11 +30,8 @@ import java.util.Map; import java.util.WeakHashMap; /** - * Created by IntelliJ IDEA. - * User: db + * @author db * Date: 06.06.11 - * Time: 15:02 - * To change this template use File | Settings | File Templates. */ public class PseudoClassLoader { static final WeakHashMap myCache = new WeakHashMap(); @@ -48,6 +44,21 @@ public class PseudoClassLoader { final String[] myInterfaces; final boolean isInterface; + private PseudoClass(final Class repr) { + final Class superclass = repr.getSuperclass(); + final Class[] interfaces = repr.getInterfaces(); + + myName = repr.getName().replace('.', '/'); + mySuperClass = superclass == null ? null : superclass.getName().replace('.', '/'); + myInterfaces = interfaces.length == 0 ? null : new String[interfaces.length]; + + for (int i=0; i