You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by an...@apache.org on 2013/01/22 06:04:00 UTC

svn commit: r1436748 - in /ant/core/trunk: ./ manual/Tasks/ src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/

Author: antoine
Date: Tue Jan 22 05:04:00 2013
New Revision: 1436748

URL: http://svn.apache.org/viewvc?rev=1436748&view=rev
Log:
PR 54090 Depend task does not handle invokeDynamic constant pool entries - java.lang.ClassFormatError: Invalid Constant Pool entry Type 18

Added:
    ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/InvokeDynamicCPInfo.java   (with props)
    ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/MethodHandleCPInfo.java
      - copied, changed from r1436599, ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/MethodRefCPInfo.java
    ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/MethodTypeCPInfo.java
      - copied, changed from r1436599, ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/IntegerCPInfo.java
Modified:
    ant/core/trunk/WHATSNEW
    ant/core/trunk/manual/Tasks/depend.html
    ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/ConstantPoolEntry.java

Modified: ant/core/trunk/WHATSNEW
URL: http://svn.apache.org/viewvc/ant/core/trunk/WHATSNEW?rev=1436748&r1=1436747&r2=1436748&view=diff
==============================================================================
--- ant/core/trunk/WHATSNEW (original)
+++ ant/core/trunk/WHATSNEW Tue Jan 22 05:04:00 2013
@@ -69,6 +69,9 @@ Fixed bugs:
    MacOS X 10.7
    Bugzilla Report 52632
 
+ * Depend task does not handle invokeDynamic constant pool entries - java.lang.ClassFormatError: Invalid Constant Pool entry Type 18
+   Bugzilla Report 54090
+
 Other changes:
 --------------
 

Modified: ant/core/trunk/manual/Tasks/depend.html
URL: http://svn.apache.org/viewvc/ant/core/trunk/manual/Tasks/depend.html?rev=1436748&r1=1436747&r2=1436748&view=diff
==============================================================================
--- ant/core/trunk/manual/Tasks/depend.html (original)
+++ ant/core/trunk/manual/Tasks/depend.html Tue Jan 22 05:04:00 2013
@@ -43,7 +43,7 @@ compiler. This is generally faster than 
 
 <p>
 To learn more about how this information is obtained from the class files, 
-please refer to <a href="http://java.sun.com/docs/books/jvms/">the Java 
+please refer to <a href="http://docs.oracle.com/javase/specs/">the Java
 Virtual Machine Specification</a>
 </p>
 

Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/ConstantPoolEntry.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/ConstantPoolEntry.java?rev=1436748&r1=1436747&r2=1436748&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/ConstantPoolEntry.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/ConstantPoolEntry.java Tue Jan 22 05:04:00 2013
@@ -62,6 +62,15 @@ public abstract class ConstantPoolEntry 
     /** Tag value for Name and Type entries. */
     public static final int CONSTANT_NAMEANDTYPE = 12;
 
+    /** Tag value for Method Handle entries */
+    public static final int CONSTANT_METHODHANDLE  = 15;
+
+    /** Tag value for Method Type entries */
+    public static final int CONSTANT_METHODTYPE = 16;
+
+    /** Tag value for InvokeDynamic entries*/
+    public static final int CONSTANT_INVOKEDYNAMIC = 18;
+
     /**
      * This entry's tag which identifies the type of this constant pool
      * entry.
@@ -155,6 +164,18 @@ public abstract class ConstantPoolEntry 
                 cpInfo = new NameAndTypeCPInfo();
 
                 break;
+            case CONSTANT_METHODHANDLE:
+                cpInfo = new MethodHandleCPInfo();
+
+                break;
+            case CONSTANT_METHODTYPE:
+                cpInfo = new MethodTypeCPInfo();
+
+                break;
+            case CONSTANT_INVOKEDYNAMIC:
+                cpInfo = new InvokeDynamicCPInfo();
+
+                break;
             default:
                 throw new ClassFormatError("Invalid Constant Pool entry Type "
                      + cpTag);

Added: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/InvokeDynamicCPInfo.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/InvokeDynamicCPInfo.java?rev=1436748&view=auto
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/InvokeDynamicCPInfo.java (added)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/InvokeDynamicCPInfo.java Tue Jan 22 05:04:00 2013
@@ -0,0 +1,85 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.tools.ant.taskdefs.optional.depend.constantpool;
+
+import java.io.DataInputStream;
+import java.io.IOException;
+
+/**
+ * An InvokeDynamic CP Info
+ *
+ */
+public class InvokeDynamicCPInfo extends ConstantCPInfo {
+
+    /** Index into the bootstrap methods for the class */
+    private int bootstrapMethodAttrIndex;
+    /** the value of the method descriptor pointed to */
+    private int nameAndTypeIndex;
+    /** the name and type CP info pointed to */
+    private NameAndTypeCPInfo nameAndTypeCPInfo;
+    /** */
+    /** Constructor.  */
+    public InvokeDynamicCPInfo() {
+        super(CONSTANT_INVOKEDYNAMIC, 1);
+    }
+
+    /**
+     * read a constant pool entry from a class stream.
+     *
+     * @param cpStream the DataInputStream which contains the constant pool
+     *      entry to be read.
+     * @exception java.io.IOException if there is a problem reading the entry from
+     *      the stream.
+     */
+    public void read(DataInputStream cpStream) throws IOException {
+        bootstrapMethodAttrIndex = cpStream.readUnsignedShort();
+        nameAndTypeIndex = cpStream.readUnsignedShort();
+    }
+
+    /**
+     * Print a readable version of the constant pool entry.
+     *
+     * @return the string representation of this constant pool entry.
+     */
+    public String toString() {
+        String value;
+        if (isResolved()) {
+            value = "Name = " + nameAndTypeCPInfo.getName() + ", type = " + nameAndTypeCPInfo.getType();
+        } else {
+            value = "BootstrapMethodAttrIndex inx = " + bootstrapMethodAttrIndex
+            + "NameAndType index = " + nameAndTypeIndex;
+        }
+
+        return value;
+    }
+    /**
+     * Resolve this constant pool entry with respect to its dependents in
+     * the constant pool.
+     *
+     * @param constantPool the constant pool of which this entry is a member
+     *      and against which this entry is to be resolved.
+     */
+    public void resolve(ConstantPool constantPool) {
+        nameAndTypeCPInfo
+                = (NameAndTypeCPInfo) constantPool.getEntry(nameAndTypeIndex);
+        nameAndTypeCPInfo.resolve(constantPool);
+        super.resolve(constantPool);
+    }
+
+}
+

Propchange: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/InvokeDynamicCPInfo.java
------------------------------------------------------------------------------
    svn:eol-style = native

Copied: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/MethodHandleCPInfo.java (from r1436599, ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/MethodRefCPInfo.java)
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/MethodHandleCPInfo.java?p2=ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/MethodHandleCPInfo.java&p1=ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/MethodRefCPInfo.java&r1=1436599&r2=1436748&rev=1436748&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/MethodRefCPInfo.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/MethodHandleCPInfo.java Tue Jan 22 05:04:00 2013
@@ -21,27 +21,40 @@ import java.io.DataInputStream;
 import java.io.IOException;
 
 /**
- * A MethodRef CP Info
+ * A MethodHandle CP Info
  *
  */
-public class MethodRefCPInfo extends ConstantPoolEntry {
-    /** the name of the class defining this method */
-    private String methodClassName;
-    /** the name of the method */
-    private String methodName;
-    /** the method's type descriptor */
-    private String methodType;
-    /** The index into the constant pool which defines the class of this method. */
-    private int classIndex;
+public class MethodHandleCPInfo extends ConstantPoolEntry {
+    private ConstantPoolEntry reference;
+
+    /** reference kind **/
+    private ReferenceKind referenceKind;
+    /** Must be a valid index into the constant pool tabel. */
+    private int referenceIndex;
     /**
      * the index into the constant pool which defined the name and type
      * signature of the method
      */
     private int nameAndTypeIndex;
+    public enum ReferenceKind {
+        REF_getField(1),
+        REF_getStatic(2),
+        REF_putField(3),
+        REF_putStatic(4),
+        REF_invokeVirtual(5),
+        REF_invokeStatic(6),
+        REF_invokeSpecial(7),
+        REF_newInvokeSpecial(8),
+        REF_invokeInterface(9);
+        private final int referenceKind;
+        ReferenceKind(int referenceKind) {
+            this.referenceKind = referenceKind;
+        }
 
+    }
     /** Constructor. */
-    public MethodRefCPInfo() {
-        super(CONSTANT_METHODREF, 1);
+    public MethodHandleCPInfo() {
+        super(CONSTANT_METHODHANDLE, 1);
     }
 
     /**
@@ -49,12 +62,13 @@ public class MethodRefCPInfo extends Con
      *
      * @param cpStream the DataInputStream which contains the constant pool
      *      entry to be read.
-     * @exception IOException if there is a problem reading the entry from
+     * @exception java.io.IOException if there is a problem reading the entry from
      *      the stream.
      */
     public void read(DataInputStream cpStream) throws IOException {
-        classIndex = cpStream.readUnsignedShort();
-        nameAndTypeIndex = cpStream.readUnsignedShort();
+        referenceKind = ReferenceKind.values()[cpStream.readUnsignedByte() - 1];
+
+        referenceIndex = cpStream.readUnsignedShort();
     }
 
     /**
@@ -66,11 +80,10 @@ public class MethodRefCPInfo extends Con
         String value;
 
         if (isResolved()) {
-            value = "Method : Class = " + methodClassName + ", name = "
-                 + methodName + ", type = " + methodType;
+            value = "MethodHandle : " + reference.toString();
         } else {
-            value = "Method : Class index = " + classIndex
-                 + ", name and type index = " + nameAndTypeIndex;
+            value = "MethodHandle : Reference kind = " + referenceKind
+                 +  "Reference index = " + referenceIndex;
         }
 
         return value;
@@ -84,50 +97,11 @@ public class MethodRefCPInfo extends Con
      *      and against which this entry is to be resolved.
      */
     public void resolve(ConstantPool constantPool) {
-        ClassCPInfo methodClass
-             = (ClassCPInfo) constantPool.getEntry(classIndex);
-
-        methodClass.resolve(constantPool);
-
-        methodClassName = methodClass.getClassName();
-
-        NameAndTypeCPInfo nt
-             = (NameAndTypeCPInfo) constantPool.getEntry(nameAndTypeIndex);
-
-        nt.resolve(constantPool);
-
-        methodName = nt.getName();
-        methodType = nt.getType();
-
+        reference = constantPool.getEntry(referenceIndex);
+        reference.resolve(constantPool);
         super.resolve(constantPool);
     }
 
-    /**
-     * Get the name of the class defining the method
-     *
-     * @return the name of the class defining this method
-     */
-    public String getMethodClassName() {
-        return methodClassName;
-    }
-
-    /**
-     * Get the name of the method.
-     *
-     * @return the name of the method.
-     */
-    public String getMethodName() {
-        return methodName;
-    }
-
-    /**
-     * Get the type signature of the method.
-     *
-     * @return the type signature of the method.
-     */
-    public String getMethodType() {
-        return methodType;
-    }
 
 }
 

Copied: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/MethodTypeCPInfo.java (from r1436599, ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/IntegerCPInfo.java)
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/MethodTypeCPInfo.java?p2=ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/MethodTypeCPInfo.java&p1=ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/IntegerCPInfo.java&r1=1436599&r2=1436748&rev=1436748&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/IntegerCPInfo.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/depend/constantpool/MethodTypeCPInfo.java Tue Jan 22 05:04:00 2013
@@ -21,14 +21,18 @@ import java.io.DataInputStream;
 import java.io.IOException;
 
 /**
- * An Integer CP Info
+ * A Method Type CP Info
  *
  */
-public class IntegerCPInfo extends ConstantCPInfo {
+public class MethodTypeCPInfo extends ConstantCPInfo {
 
+    /** Index into the constant pool for the class */
+    private int methodDescriptorIndex;
+    /** the value of the method descriptor pointed to */
+    private String methodDescriptor;
     /** Constructor.  */
-    public IntegerCPInfo() {
-        super(CONSTANT_INTEGER, 1);
+    public MethodTypeCPInfo() {
+        super(CONSTANT_METHODTYPE, 1);
     }
 
     /**
@@ -36,20 +40,39 @@ public class IntegerCPInfo extends Const
      *
      * @param cpStream the DataInputStream which contains the constant pool
      *      entry to be read.
-     * @exception IOException if there is a problem reading the entry from
+     * @exception java.io.IOException if there is a problem reading the entry from
      *      the stream.
      */
     public void read(DataInputStream cpStream) throws IOException {
-        setValue(new Integer(cpStream.readInt()));
+        methodDescriptorIndex = cpStream.readUnsignedShort();
     }
 
     /**
+     * Resolve this constant pool entry with respect to its dependents in
+     * the constant pool.
+     *
+     * @param constantPool the constant pool of which this entry is a member
+     *      and against which this entry is to be resolved.
+     */
+    public void resolve(ConstantPool constantPool) {
+        Utf8CPInfo methodClass
+                = (Utf8CPInfo) constantPool.getEntry(methodDescriptorIndex);
+        methodClass.resolve(constantPool);
+        methodDescriptor = methodClass.getValue();
+        super.resolve(constantPool);
+    }
+    /**
      * Print a readable version of the constant pool entry.
      *
      * @return the string representation of this constant pool entry.
      */
     public String toString() {
-        return "Integer Constant Pool Entry: " + getValue();
+        if (! isResolved()) {
+            return "MethodDescriptorIndex: " + methodDescriptorIndex;
+        } else {
+            return "MethodDescriptor: " + methodDescriptor;
+
+        }
     }
 
 }