git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@1436748 13f79535-47bb-0310-9956-ffa450edef68master
@@ -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: | |||
-------------- | |||
@@ -43,7 +43,7 @@ compiler. This is generally faster than parsing the Java source.</p> | |||
<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> | |||
@@ -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. | |||
@@ -154,6 +163,18 @@ public abstract class ConstantPoolEntry { | |||
case CONSTANT_NAMEANDTYPE: | |||
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 " | |||
@@ -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); | |||
} | |||
} | |||
@@ -0,0 +1,107 @@ | |||
/* | |||
* 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; | |||
/** | |||
* A MethodHandle CP Info | |||
* | |||
*/ | |||
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 MethodHandleCPInfo() { | |||
super(CONSTANT_METHODHANDLE, 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 { | |||
referenceKind = ReferenceKind.values()[cpStream.readUnsignedByte() - 1]; | |||
referenceIndex = 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 = "MethodHandle : " + reference.toString(); | |||
} else { | |||
value = "MethodHandle : Reference kind = " + referenceKind | |||
+ "Reference index = " + referenceIndex; | |||
} | |||
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) { | |||
reference = constantPool.getEntry(referenceIndex); | |||
reference.resolve(constantPool); | |||
super.resolve(constantPool); | |||
} | |||
} | |||
@@ -0,0 +1,79 @@ | |||
/* | |||
* 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; | |||
/** | |||
* A Method Type CP Info | |||
* | |||
*/ | |||
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 MethodTypeCPInfo() { | |||
super(CONSTANT_METHODTYPE, 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 { | |||
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() { | |||
if (! isResolved()) { | |||
return "MethodDescriptorIndex: " + methodDescriptorIndex; | |||
} else { | |||
return "MethodDescriptor: " + methodDescriptor; | |||
} | |||
} | |||
} | |||