public final byte[] copy() {
byte[] b = new byte[size];
- arraycopy(buffer, b, size);
+ System.arraycopy(buffer, 0, b, 0, size);
return b;
}
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;
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];
- }
}
/**
* 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);
}
/**
* It never changes the current stack depth.
*/
public void addIndex(int index) {
- add(index >> 8);
- add(index);
+ add(index >> 8, index);
}
/**
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;
int[] interfaces;
ArrayList fields;
ArrayList methods;
- LinkedList attributes;
+ ArrayList attributes;
String thisclassname; // not JVM-internal name
String[] cachedInterfaces;
String cachedSuperclass;
methods = new ArrayList();
thisclassname = classname;
- attributes = new LinkedList();
+ attributes = new ArrayList();
attributes.add(new SourceFileAttribute(constPool,
getSourcefileName(thisclassname)));
}
*/
public void prune() {
ConstPool cp = compact0();
- LinkedList newAttributes = new LinkedList();
+ ArrayList newAttributes = new ArrayList();
AttributeInfo invisibleAnnotations
= getAttribute(AnnotationsAttribute.invisibleTag);
if (invisibleAnnotations != null) {
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);
}
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);
}
* @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);
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));
--- /dev/null
+/*
+ * 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());
+ }
+ }
+}
+++ /dev/null
-/*
- * 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());
- }
- }
-}