]> source.dussan.org Git - javassist.git/commitdiff
performance tuning
authorchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Fri, 30 Apr 2010 15:20:53 +0000 (15:20 +0000)
committerchiba <chiba@30ef5769-5b8d-40dd-aea6-55b5d6557bb3>
Fri, 30 Apr 2010 15:20:53 +0000 (15:20 +0000)
git-svn-id: http://anonsvn.jboss.org/repos/javassist/trunk@541 30ef5769-5b8d-40dd-aea6-55b5d6557bb3

src/main/javassist/bytecode/Bytecode.java
src/main/javassist/bytecode/ClassFile.java
src/main/javassist/bytecode/ClassFilePrinter.java [new file with mode: 0644]
src/main/javassist/bytecode/ClassFileWriter.java [deleted file]

index 64128c53020a399fdd42ed98be77059e37c87b5b..92fd1f02906a0666d046e6b253c9231f2ed3f077 100644 (file)
@@ -37,7 +37,7 @@ class ByteVector implements Cloneable {
 
     public final byte[] copy() {
         byte[] b = new byte[size];
-        arraycopy(buffer, b, size);
+        System.arraycopy(buffer, 0, b, 0, size);
         return b;
     }
 
@@ -60,6 +60,20 @@ class ByteVector implements Cloneable {
         buffer[size - 1] = (byte)code;
     }
 
+    public void add(int b1, int b2) {
+        addGap(2);
+        buffer[size - 2] = (byte)b1;
+        buffer[size - 1] = (byte)b2;
+    }
+
+    public void add(int b1, int b2, int b3, int b4) {
+        addGap(4);
+        buffer[size - 4] = (byte)b1;
+        buffer[size - 3] = (byte)b2;
+        buffer[size - 2] = (byte)b3;
+        buffer[size - 1] = (byte)b4;
+    }
+
     public void addGap(int length) {
         if (size + length > buffer.length) {
             int newSize = size << 1;
@@ -67,17 +81,12 @@ class ByteVector implements Cloneable {
                 newSize = size + length;
 
             byte[] newBuf = new byte[newSize];
-            arraycopy(buffer, newBuf, size);
+            System.arraycopy(buffer, 0, newBuf, 0, size);
             buffer = newBuf;
         }
 
         size += length;
     }
-
-    private static void arraycopy(byte[] src, byte[] dest, int size) {
-        for (int i = 0; i < size; i++)
-            dest[i] = src[i];
-    }
 }
 
 /**
@@ -376,10 +385,7 @@ public class Bytecode extends ByteVector implements Cloneable, Opcode {
      * Appends a 32bit value to the end of the bytecode sequence.
      */
     public void add32bit(int value) {
-        add(value >> 24);
-        add(value >> 16);
-        add(value >> 8);
-        add(value);
+        add(value >> 24, value >> 16, value >> 8, value);
     }
 
     /**
@@ -441,8 +447,7 @@ public class Bytecode extends ByteVector implements Cloneable, Opcode {
      * It never changes the current stack depth.
      */
     public void addIndex(int index) {
-        add(index >> 8);
-        add(index);
+        add(index >> 8, index);
     }
 
     /**
index 1cd9048b412f637ced43f4df210984a4ccbdd6e1..e6017aac3cdd7fc7ee10e16030e7d785b718c24e 100644 (file)
@@ -19,7 +19,6 @@ import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.ListIterator;
 import java.util.Map;
@@ -40,7 +39,7 @@ public final class ClassFile {
     int[] interfaces;
     ArrayList fields;
     ArrayList methods;
-    LinkedList attributes;
+    ArrayList attributes;
     String thisclassname; // not JVM-internal name
     String[] cachedInterfaces;
     String cachedSuperclass;
@@ -135,7 +134,7 @@ public final class ClassFile {
         methods = new ArrayList();
         thisclassname = classname;
 
-        attributes = new LinkedList();
+        attributes = new ArrayList();
         attributes.add(new SourceFileAttribute(constPool,
                 getSourcefileName(thisclassname)));
     }
@@ -209,7 +208,7 @@ public final class ClassFile {
      */
     public void prune() {
         ConstPool cp = compact0();
-        LinkedList newAttributes = new LinkedList();
+        ArrayList newAttributes = new ArrayList();
         AttributeInfo invisibleAnnotations
             = getAttribute(AnnotationsAttribute.invisibleTag);
         if (invisibleAnnotations != null) {
@@ -545,7 +544,15 @@ public final class ClassFile {
         fields.add(finfo);
     }
 
-    private void addField0(FieldInfo finfo) {
+    /**
+     * Just appends a field to the class.
+     * It does not check field duplication.
+     * Use this method only when minimizing performance overheads
+     * is seriously required.
+     *
+     * @since 3.13
+     */
+    public final void addField2(FieldInfo finfo) {
         fields.add(finfo);
     }
 
@@ -607,7 +614,15 @@ public final class ClassFile {
         methods.add(minfo);
     }
 
-    private void addMethod0(MethodInfo minfo) {
+    /**
+     * Just appends a method to the class.
+     * It does not check method duplication or remove a bridge method.
+     * Use this method only when minimizing performance overheads
+     * is seriously required.
+     *
+     * @since 3.13
+     */
+    public final void addMethod2(MethodInfo minfo) {
         methods.add(minfo);
     }
 
@@ -675,7 +690,7 @@ public final class ClassFile {
      * @see #getAttributes()
      */
     public AttributeInfo getAttribute(String name) {
-        LinkedList list = attributes;
+        ArrayList list = attributes;
         int n = list.size();
         for (int i = 0; i < n; ++i) {
             AttributeInfo ai = (AttributeInfo)list.get(i);
@@ -737,14 +752,14 @@ public final class ClassFile {
         n = in.readUnsignedShort();
         fields = new ArrayList();
         for (i = 0; i < n; ++i)
-            addField0(new FieldInfo(cp, in));
+            addField2(new FieldInfo(cp, in));
 
         n = in.readUnsignedShort();
         methods = new ArrayList();
         for (i = 0; i < n; ++i)
-            addMethod0(new MethodInfo(cp, in));
+            addMethod2(new MethodInfo(cp, in));
 
-        attributes = new LinkedList();
+        attributes = new ArrayList();
         n = in.readUnsignedShort();
         for (i = 0; i < n; ++i)
             addAttribute(AttributeInfo.read(cp, in));
diff --git a/src/main/javassist/bytecode/ClassFilePrinter.java b/src/main/javassist/bytecode/ClassFilePrinter.java
new file mode 100644 (file)
index 0000000..49f7066
--- /dev/null
@@ -0,0 +1,146 @@
+/*
+ * Javassist, a Java-bytecode translator toolkit.
+ * Copyright (C) 1999-2007 Shigeru Chiba. All Rights Reserved.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License.  Alternatively, the contents of this file may be used under
+ * the terms of the GNU Lesser General Public License Version 2.1 or later.
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ */
+
+package javassist.bytecode;
+
+import java.io.PrintWriter;
+import javassist.Modifier;
+import java.util.List;
+
+/**
+ * A utility class for priting the contents of a class file.
+ * It prints a constant pool table, fields, and methods in a
+ * human readable representation.
+ */
+public class ClassFilePrinter {
+    /**
+     * Prints the contents of a class file to the standard output stream.
+     */
+    public static void print(ClassFile cf) {
+        print(cf, new PrintWriter(System.out, true));
+    }
+
+    /**
+     * Prints the contents of a class file.
+     */
+    public static void print(ClassFile cf, PrintWriter out) {
+        List list;
+        int n;
+
+        /* 0x0020 (SYNCHRONIZED) means ACC_SUPER if the modifiers
+         * are of a class.
+         */
+        int mod
+            = AccessFlag.toModifier(cf.getAccessFlags()
+                                    & ~AccessFlag.SYNCHRONIZED);
+        out.println("major: " + cf.major + ", minor: " + cf.minor
+                    + " modifiers: " + Integer.toHexString(cf.getAccessFlags()));
+        out.println(Modifier.toString(mod) + " class "
+                    + cf.getName() + " extends " + cf.getSuperclass());
+
+        String[] infs = cf.getInterfaces();
+        if (infs != null && infs.length > 0) {
+            out.print("    implements ");
+            out.print(infs[0]);
+            for (int i = 1; i < infs.length; ++i)
+                out.print(", " + infs[i]);
+
+            out.println();
+        }
+
+        out.println();
+        list = cf.getFields();
+        n = list.size();
+        for (int i = 0; i < n; ++i) {
+            FieldInfo finfo = (FieldInfo)list.get(i);
+            int acc = finfo.getAccessFlags();
+            out.println(Modifier.toString(AccessFlag.toModifier(acc))
+                        + " " + finfo.getName() + "\t"
+                        + finfo.getDescriptor());
+            printAttributes(finfo.getAttributes(), out, 'f');
+        }
+
+        out.println();
+        list = cf.getMethods();
+        n = list.size();
+        for (int i = 0; i < n; ++i) {
+            MethodInfo minfo = (MethodInfo)list.get(i);
+            int acc = minfo.getAccessFlags();
+            out.println(Modifier.toString(AccessFlag.toModifier(acc))
+                        + " " + minfo.getName() + "\t"
+                        + minfo.getDescriptor());
+            printAttributes(minfo.getAttributes(), out, 'm');
+            out.println();
+        }
+
+        out.println();
+        printAttributes(cf.getAttributes(), out, 'c');
+    }
+
+    static void printAttributes(List list, PrintWriter out, char kind) {
+        if (list == null)
+            return;
+
+        int n = list.size();
+        for (int i = 0; i < n; ++i) {
+            AttributeInfo ai = (AttributeInfo)list.get(i);
+            if (ai instanceof CodeAttribute) {
+                CodeAttribute ca = (CodeAttribute)ai;
+                out.println("attribute: " + ai.getName() + ": "
+                            + ai.getClass().getName());
+                out.println("max stack " + ca.getMaxStack()
+                            + ", max locals " + ca.getMaxLocals()
+                            + ", " + ca.getExceptionTable().size()
+                            + " catch blocks");
+                out.println("<code attribute begin>");
+                printAttributes(ca.getAttributes(), out, kind);
+                out.println("<code attribute end>");
+            }
+            else if (ai instanceof StackMapTable) {
+                out.println("<stack map table begin>");
+                StackMapTable.Printer.print((StackMapTable)ai, out);
+                out.println("<stack map table end>");
+            }
+            else if (ai instanceof StackMap) {
+                out.println("<stack map begin>");
+                ((StackMap)ai).print(out);
+                out.println("<stack map end>");
+            }
+            else if (ai instanceof SignatureAttribute) {
+                SignatureAttribute sa = (SignatureAttribute)ai;
+                String sig = sa.getSignature();
+                out.println("signature: " + sig);
+                try {
+                    String s;
+                    if (kind == 'c')
+                        s = SignatureAttribute.toClassSignature(sig).toString();
+                    else if (kind == 'm')
+                        s = SignatureAttribute.toMethodSignature(sig).toString();
+                    else
+                        s = SignatureAttribute.toFieldSignature(sig).toString();
+
+                    out.println("           " + s);
+                }
+                catch (BadBytecode e) {
+                    out.println("           syntax error");
+                }
+            }
+            else
+                out.println("attribute: " + ai.getName()
+                            + " (" + ai.get().length + " byte): "
+                            + ai.getClass().getName());
+        }
+    }
+}
diff --git a/src/main/javassist/bytecode/ClassFileWriter.java b/src/main/javassist/bytecode/ClassFileWriter.java
deleted file mode 100644 (file)
index e1d835b..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Javassist, a Java-bytecode translator toolkit.
- * Copyright (C) 1999-2007 Shigeru Chiba. All Rights Reserved.
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License.  Alternatively, the contents of this file may be used under
- * the terms of the GNU Lesser General Public License Version 2.1 or later.
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- */
-
-package javassist.bytecode;
-
-import java.io.PrintWriter;
-import javassist.Modifier;
-import java.util.List;
-
-/**
- * A utility class for priting the contents of a class file.
- * It prints a constant pool table, fields, and methods in a
- * human readable representation.
- */
-public class ClassFileWriter {
-    /**
-     * Prints the contents of a class file to the standard output stream.
-     */
-    public static void print(ClassFile cf) {
-        print(cf, new PrintWriter(System.out, true));
-    }
-
-    /**
-     * Prints the contents of a class file.
-     */
-    public static void print(ClassFile cf, PrintWriter out) {
-        List list;
-        int n;
-
-        /* 0x0020 (SYNCHRONIZED) means ACC_SUPER if the modifiers
-         * are of a class.
-         */
-        int mod
-            = AccessFlag.toModifier(cf.getAccessFlags()
-                                    & ~AccessFlag.SYNCHRONIZED);
-        out.println("major: " + cf.major + ", minor: " + cf.minor
-                    + " modifiers: " + Integer.toHexString(cf.getAccessFlags()));
-        out.println(Modifier.toString(mod) + " class "
-                    + cf.getName() + " extends " + cf.getSuperclass());
-
-        String[] infs = cf.getInterfaces();
-        if (infs != null && infs.length > 0) {
-            out.print("    implements ");
-            out.print(infs[0]);
-            for (int i = 1; i < infs.length; ++i)
-                out.print(", " + infs[i]);
-
-            out.println();
-        }
-
-        out.println();
-        list = cf.getFields();
-        n = list.size();
-        for (int i = 0; i < n; ++i) {
-            FieldInfo finfo = (FieldInfo)list.get(i);
-            int acc = finfo.getAccessFlags();
-            out.println(Modifier.toString(AccessFlag.toModifier(acc))
-                        + " " + finfo.getName() + "\t"
-                        + finfo.getDescriptor());
-            printAttributes(finfo.getAttributes(), out, 'f');
-        }
-
-        out.println();
-        list = cf.getMethods();
-        n = list.size();
-        for (int i = 0; i < n; ++i) {
-            MethodInfo minfo = (MethodInfo)list.get(i);
-            int acc = minfo.getAccessFlags();
-            out.println(Modifier.toString(AccessFlag.toModifier(acc))
-                        + " " + minfo.getName() + "\t"
-                        + minfo.getDescriptor());
-            printAttributes(minfo.getAttributes(), out, 'm');
-            out.println();
-        }
-
-        out.println();
-        printAttributes(cf.getAttributes(), out, 'c');
-    }
-
-    static void printAttributes(List list, PrintWriter out, char kind) {
-        if (list == null)
-            return;
-
-        int n = list.size();
-        for (int i = 0; i < n; ++i) {
-            AttributeInfo ai = (AttributeInfo)list.get(i);
-            if (ai instanceof CodeAttribute) {
-                CodeAttribute ca = (CodeAttribute)ai;
-                out.println("attribute: " + ai.getName() + ": "
-                            + ai.getClass().getName());
-                out.println("max stack " + ca.getMaxStack()
-                            + ", max locals " + ca.getMaxLocals()
-                            + ", " + ca.getExceptionTable().size()
-                            + " catch blocks");
-                out.println("<code attribute begin>");
-                printAttributes(ca.getAttributes(), out, kind);
-                out.println("<code attribute end>");
-            }
-            else if (ai instanceof StackMapTable) {
-                out.println("<stack map table begin>");
-                StackMapTable.Printer.print((StackMapTable)ai, out);
-                out.println("<stack map table end>");
-            }
-            else if (ai instanceof StackMap) {
-                out.println("<stack map begin>");
-                ((StackMap)ai).print(out);
-                out.println("<stack map end>");
-            }
-            else if (ai instanceof SignatureAttribute) {
-                SignatureAttribute sa = (SignatureAttribute)ai;
-                String sig = sa.getSignature();
-                out.println("signature: " + sig);
-                try {
-                    String s;
-                    if (kind == 'c')
-                        s = SignatureAttribute.toClassSignature(sig).toString();
-                    else if (kind == 'm')
-                        s = SignatureAttribute.toMethodSignature(sig).toString();
-                    else
-                        s = SignatureAttribute.toFieldSignature(sig).toString();
-
-                    out.println("           " + s);
-                }
-                catch (BadBytecode e) {
-                    out.println("           syntax error");
-                }
-            }
-            else
-                out.println("attribute: " + ai.getName()
-                            + " (" + ai.get().length + " byte): "
-                            + ai.getClass().getName());
-        }
-    }
-}