Fix to EnclosingMethodAttribute
adrian.brock Feb 6, 2006 5:42 AMI was seeing an issue where an EnclosingAttribute didn't have a method index (it was zero).
This caused the compact/clone to fail.
Ths was code generated with JDK5 and it looked it was recording the enclosing
class rather than an method
public class MyClass
{
public class InnerClass
{
}
}
I fixed the problem by adding a new constructor that copeis the attribute retaining
the null index.
User: adrian
Date: 06/02/06 05:02:34
Modified: src/main/javassist/bytecode EnclosingMethodAttribute.java
Log:
Compacting/clone has a problem when the method index is zero.
This looks like an inner class trying to describe its outer class rather
than a method.
Revision Changes Path
1.4 +20 -0 javassist/src/main/javassist/bytecode/EnclosingMethodAttribute.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: EnclosingMethodAttribute.java
===================================================================
RCS file: /cvsroot/jboss/javassist/src/main/javassist/bytecode/EnclosingMethodAttribute.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- EnclosingMethodAttribute.java 11 Jan 2006 06:45:56 -0000 1.3
+++ EnclosingMethodAttribute.java 6 Feb 2006 10:02:34 -0000 1.4
@@ -56,6 +56,24 @@
}
/**
+ * Constructs an EnclosingMethod attribute.
+ *
+ * @param cp a constant pool table.
+ * @param className the name of the innermost enclosing class.
+ */
+ public EnclosingMethodAttribute(ConstPool cp, String className) {
+ super(cp, tag);
+ int ci = cp.addClassInfo(className);
+ int ni = 0;
+ byte[] bvalue = new byte[4];
+ bvalue[0] = (byte)(ci >>> 8);
+ bvalue[1] = (byte)ci;
+ bvalue[2] = (byte)(ni >>> 8);
+ bvalue[3] = (byte)ni;
+ set(bvalue);
+ }
+
+ /**
* Returns the value of <code>class_index</code>.
*/
public int classIndex() {
@@ -105,6 +123,8 @@
* class names.
*/
public AttributeInfo copy(ConstPool newCp, Map classnames) {
+ if (methodIndex() == 0)
+ return new EnclosingMethodAttribute(newCp, className());
return new EnclosingMethodAttribute(newCp, className(),
methodName(), methodDescriptor());
}