You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ch...@apache.org on 2015/07/19 23:10:46 UTC
svn commit: r1691855 - in /commons/proper/bcel/trunk/src: changes/
main/java/org/apache/bcel/ main/java/org/apache/bcel/classfile/
main/java/org/apache/bcel/generic/ main/java/org/apache/bcel/util/
main/java/org/apache/bcel/verifier/statics/ main/java/...
Author: chas
Date: Sun Jul 19 21:10:46 2015
New Revision: 1691855
URL: http://svn.apache.org/r1691855
Log:
BCEL-209
Bug fixes and improvements to InvokeDynamic and BootStrapMethods implementation
Modified:
commons/proper/bcel/trunk/src/changes/changes.xml
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/Constants.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/ConstantCP.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/ConstantInvokeDynamic.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/ConstantPool.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Utility.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Visitor.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/EmptyVisitor.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldOrMethod.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/GETFIELD.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/GETSTATIC.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/InstructionFactory.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/InvokeInstruction.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/PUTFIELD.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/PUTSTATIC.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/Visitor.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/util/CodeHTML.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/util/InstructionFinder.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java
commons/proper/bcel/trunk/src/test/java/org/apache/bcel/visitors/CounterVisitor.java
Modified: commons/proper/bcel/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/changes/changes.xml?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/changes/changes.xml (original)
+++ commons/proper/bcel/trunk/src/changes/changes.xml Sun Jul 19 21:10:46 2015
@@ -63,6 +63,9 @@ The <action> type attribute can be add,u
<body>
<release version="6.0" date="TBA" description="Major release with Java 7 and 8 support">
+ <action issue="BCEL-209" type="fix" due-to="Mark Roberts">
+ Bug fixes and improvements to InvokeDynamic and BootStrapMethods implementation
+ </action>
<action issue="BCEL-187" type="fix" due-to="Jérôme Leroux">
Verification error when an invoke references a method defined in superclass
</action>
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/Constants.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/Constants.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/Constants.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/Constants.java Sun Jul 19 21:10:46 2015
@@ -1170,7 +1170,7 @@ public interface Constants {
0/*dreturn*/, 0/*areturn*/, 0/*return*/,
2/*getstatic*/, 2/*putstatic*/, 2/*getfield*/,
2/*putfield*/, 2/*invokevirtual*/, 2/*invokespecial*/, 2/*invokestatic*/,
- 4/*invokeinterface*/, 5/*invokedynamic*/, 2/*new*/,
+ 4/*invokeinterface*/, 4/*invokedynamic*/, 2/*new*/,
1/*newarray*/, 2/*anewarray*/,
0/*arraylength*/, 0/*athrow*/, 2/*checkcast*/,
2/*instanceof*/, 0/*monitorenter*/,
@@ -1525,9 +1525,9 @@ public static final byte ATTR_RUNTIMEINV
public static final byte REF_newInvokeSpecial = 8;
public static final byte REF_invokeInterface = 9;
- public static final String[] REF_NAMES = {
- "getfield", "getstatic", "putfield",
- "putstatic", "invokevirtual", "invokestatic",
- "invokespecial", "new dup invokespecial", "invokeinterface"
- };
+ /** The names of the referencd_kinds of a CONSTANT_MethodHandle_info. */
+ public static final String[] METHODHANDLE_NAMES = {
+ "", "getField", "getStatic", "putField", "putStatic", "invokeVirtual",
+ "invokeStatic", "invokeSpecial", "newInvokeSpecial", "invokeInterface" };
+
}
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java Sun Jul 19 21:10:46 2015
@@ -22,8 +22,12 @@ import java.io.DataOutputStream;
import java.io.IOException;
import java.io.Serializable;
+import org.apache.bcel.Constants;
+
/**
- * Entry of the bootstrap_methods table.
+ * This class represents a bootstrap method attribute, i.e., the bootstrap
+ * method ref, the number of bootstrap arguments and an array of the
+ * bootstrap arguments.
*
* @see <a href="http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7.23">The class File Format : The BootstrapMethods Attribute</a>
* @since 6.0
@@ -35,10 +39,17 @@ public class BootstrapMethod implements
/** Index of the CONSTANT_MethodHandle_info structure in the constant_pool table */
private int bootstrap_method_ref;
+ private int num_bootstrap_arguments;
+
/** Array of references to the constant_pool table */
private int[] bootstrap_arguments;
- public BootstrapMethod() {
+
+ /**
+ * Initialize from another object.
+ */
+ public BootstrapMethod(BootstrapMethod c) {
+ this(c.getBootstrapMethodRef(), c.getNumBootstrapArguments(), c.getBootstrapArguments());
}
/**
@@ -46,37 +57,95 @@ public class BootstrapMethod implements
*
* @param input Input stream
* @throws IOException
- * @throws ClassFormatException
*/
- BootstrapMethod(DataInput input) throws IOException, ClassFormatException {
- bootstrap_method_ref = input.readUnsignedShort();
+ BootstrapMethod(DataInput input) throws IOException {
+ this(input.readUnsignedShort(), input.readUnsignedShort(), (int[]) null);
- int num_bootstrap_methods = input.readUnsignedShort();
-
- bootstrap_arguments = new int[num_bootstrap_methods];
- for (int i = 0; i < num_bootstrap_methods; i++) {
+ bootstrap_arguments = new int[num_bootstrap_arguments];
+ for (int i = 0; i < num_bootstrap_arguments; i++) {
bootstrap_arguments[i] = input.readUnsignedShort();
}
}
+
+ /**
+ * @param bootstrap_method_ref int index into constant_pool of CONSTANT_MethodHandle
+ * @param num_bootstrap_arguments int count of number of boostrap arguments
+ * @param bootstrap_arguments int[] indices into constant_pool of CONSTANT_<type>_info
+ */
+ public BootstrapMethod(int bootstrap_method_ref, int num_bootstrap_arguments, int[] bootstrap_arguments) {
+ this.bootstrap_method_ref = bootstrap_method_ref;
+ this.num_bootstrap_arguments = num_bootstrap_arguments;
+ this.bootstrap_arguments = bootstrap_arguments;
+ }
+
+ /**
+ * @return index into constant_pool of bootstrap_method
+ */
public int getBootstrapMethodRef() {
return bootstrap_method_ref;
}
+ /**
+ * @param bootstrap_method_ref int index into constant_pool of CONSTANT_MethodHandle
+ */
public void setBootstrapMethodRef(int bootstrap_method_ref) {
this.bootstrap_method_ref = bootstrap_method_ref;
}
+ /**
+ * @return int[] of bootstrap_method indices into constant_pool of CONSTANT_<type>_info
+ */
public int[] getBootstrapArguments() {
return bootstrap_arguments;
}
+ /**
+ * @return count of number of boostrap arguments
+ */
+ public int getNumBootstrapArguments() {
+ return num_bootstrap_arguments;
+ }
+
+ /**
+ * @param bootstrap_arguments int[] indices into constant_pool of CONSTANT_<type>_info
+ */
public void setBootstrapArguments(int[] bootstrap_arguments) {
this.bootstrap_arguments = bootstrap_arguments;
}
/**
- * Dump object to file stream on binary format.
+ * @return String representation.
+ */
+ @Override
+ public final String toString() {
+ return "BootstrapMethod(" + bootstrap_method_ref + ", " + num_bootstrap_arguments + ", "
+ //UNDONE
+ //+ bootstrap_arguments + ")";
+ + "UNDONE)";
+ }
+
+ /**
+ * @return Resolved string representation
+ */
+ public final String toString( ConstantPool constant_pool ) {
+ StringBuilder buf = new StringBuilder();
+ String bootstrap_method_name;
+ bootstrap_method_name = constant_pool.constantToString(bootstrap_method_ref,
+ Constants.CONSTANT_MethodHandle);
+ buf.append(Utility.compactClassName(bootstrap_method_name));
+ if (num_bootstrap_arguments > 0) {
+ buf.append("\n Method Arguments:");
+ for (int i = 0; i < num_bootstrap_arguments; i++) {
+ buf.append("\n ").append(i).append(": ");
+ buf.append(constant_pool.constantToString(constant_pool.getConstant(bootstrap_arguments[i])));
+ }
+ }
+ return buf.toString();
+ }
+
+ /**
+ * Dump object to file stream in binary format.
*
* @param file Output file stream
* @throws IOException
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java Sun Jul 19 21:10:46 2015
@@ -35,11 +35,35 @@ public class BootstrapMethods extends At
private BootstrapMethod[] bootstrap_methods;
+ /**
+ * Initialize from another object. Note that both objects use the same
+ * references (shallow copy). Use clone() for a physical copy.
+ */
+ public BootstrapMethods(BootstrapMethods c) {
+ this(c.getNameIndex(), c.getLength(), c.getBootstrapMethods(), c.getConstantPool());
+ }
+
+
+ /**
+ * @param name_index Index in constant pool to CONSTANT_Utf8
+ * @param length Content length in bytes
+ * @param bootstrap_methods array of bootstrap methods
+ * @param constant_pool Array of constants
+ */
public BootstrapMethods(int name_index, int length, BootstrapMethod[] bootstrap_methods, ConstantPool constant_pool) {
super(Constants.ATTR_BOOTSTRAP_METHODS, name_index, length, constant_pool);
this.bootstrap_methods = bootstrap_methods;
}
+ /**
+ * Construct object from Input stream.
+ *
+ * @param name_index Index in constant pool to CONSTANT_Utf8
+ * @param length Content length in bytes
+ * @param input Input stream
+ * @param constant_pool Array of constants
+ * @throws IOException
+ */
BootstrapMethods(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException {
this(name_index, length, (BootstrapMethod[]) null, constant_pool);
@@ -50,19 +74,31 @@ public class BootstrapMethods extends At
}
}
+ /**
+ * @return array of bootstrap method "records"
+ */
public final BootstrapMethod[] getBootstrapMethods() {
return bootstrap_methods;
}
+ /**
+ * @param bootstrap_methods the array of bootstrap methods
+ */
public final void setBootstrapMethods(BootstrapMethod[] bootstrap_methods) {
this.bootstrap_methods = bootstrap_methods;
}
+ /**
+ * @param v Visitor object
+ */
@Override
public void accept(Visitor v) {
v.visitBootstrapMethods(this);
}
+ /**
+ * @return deep copy of this attribute
+ */
@Override
public BootstrapMethods copy(ConstantPool _constant_pool) {
BootstrapMethods c = (BootstrapMethods) clone();
@@ -90,4 +126,20 @@ public class BootstrapMethods extends At
bootstrap_method.dump(file);
}
}
+
+ /**
+ * @return String representation.
+ */
+ @Override
+ public final String toString() {
+ StringBuilder buf = new StringBuilder();
+ buf.append("BootstrapMethods(");
+ buf.append(bootstrap_methods.length);
+ buf.append("):\n");
+ for (int i = 0; i < bootstrap_methods.length; i++) {
+ buf.append(" ").append(i).append(": ");
+ buf.append(bootstrap_methods[i].toString(constant_pool)).append("\n");
+ }
+ return buf.toString();
+ }
}
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/ConstantCP.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/ConstantCP.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/ConstantCP.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/ConstantCP.java Sun Jul 19 21:10:46 2015
@@ -24,20 +24,25 @@ import java.io.IOException;
import org.apache.bcel.Constants;
/**
- * Abstract super class for Fieldref and Methodref constants.
+ * Abstract super class for Fieldref, Methodref, InterfaceMethodref and
+ * InvokeDynamic constants.
*
* @version $Id$
* @author <A HREF="mailto:m.dahm@gmx.de">M. Dahm</A>
* @see ConstantFieldref
* @see ConstantMethodref
* @see ConstantInterfaceMethodref
+ * @see ConstantInvokeDynamic
*/
public abstract class ConstantCP extends Constant {
private static final long serialVersionUID = -6275762995206209402L;
/** References to the constants containing the class and the field signature
*/
+ // Note that this field is used to store the
+ // bootstrap_method_attr_index of a ConstantInvokeDynamic.
protected int class_index; // TODO make private (has getter & setter)
+ // This field has the same meaning for all subclasses.
protected int name_and_type_index; // TODO make private (has getter & setter)
@@ -87,7 +92,7 @@ public abstract class ConstantCP extends
/**
- * @return Reference (index) to class this field or method belongs to.
+ * @return Reference (index) to class this constant refers to.
*/
public final int getClassIndex() {
return class_index;
@@ -95,10 +100,13 @@ public abstract class ConstantCP extends
/**
- * @return Reference (index) to signature of the field.
+ * @return Reference (index) to bootstrap method this constant refers to.
+ *
+ * Note that this method is a functional duplicate of getClassIndex
+ * for use by ConstantInvokeDynamic.
*/
- public final int getNameAndTypeIndex() {
- return name_and_type_index;
+ public final int getBootstrapMethodAttrIndex() {
+ return class_index; // AKA bootstrap_method_attr_index
}
@@ -111,10 +119,21 @@ public abstract class ConstantCP extends
/**
- * @return Class this field belongs to.
+ * @param bootstrap_method_attr_index points to a BootstrapMethod.
+ *
+ * Note that this method is a functional duplicate of setClassIndex
+ * for use by ConstantInvokeDynamic.
*/
- public String getClass( ConstantPool cp ) {
- return cp.constantToString(class_index, Constants.CONSTANT_Class);
+ public final void setBootstrapMethodAttrIndex(int bootstrap_method_attr_index) {
+ this.class_index = bootstrap_method_attr_index;
+ }
+
+
+ /**
+ * @return Reference (index) to signature of the field.
+ */
+ public final int getNameAndTypeIndex() {
+ return name_and_type_index;
}
@@ -127,10 +146,20 @@ public abstract class ConstantCP extends
/**
+ * @return Class this field belongs to.
+ */
+ public String getClass( ConstantPool cp ) {
+ return cp.constantToString(class_index, Constants.CONSTANT_Class);
+ }
+
+
+ /**
* @return String representation.
+ *
+ * not final as ConstantInvokeDynamic needs to modify
*/
@Override
- public final String toString() {
+ public String toString() {
return super.toString() + "(class_index = " + class_index + ", name_and_type_index = "
+ name_and_type_index + ")";
}
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/ConstantInvokeDynamic.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/ConstantInvokeDynamic.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/ConstantInvokeDynamic.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/ConstantInvokeDynamic.java Sun Jul 19 21:10:46 2015
@@ -18,7 +18,6 @@
package org.apache.bcel.classfile;
import java.io.DataInput;
-import java.io.DataOutputStream;
import java.io.IOException;
import org.apache.bcel.Constants;
@@ -31,18 +30,15 @@ import org.apache.bcel.Constants;
* @see Constant
* @since 6.0
*/
-public final class ConstantInvokeDynamic extends Constant {
+public final class ConstantInvokeDynamic extends ConstantCP {
private static final long serialVersionUID = 4310367359017396174L;
- private int bootstrap_method_attr_index;
- private int name_and_type_index;
-
/**
* Initialize from another object.
*/
public ConstantInvokeDynamic(ConstantInvokeDynamic c) {
- this(c.getBootstrapMethodAttrIndex(), c.getNameAndTypeIndex());
+ super(Constants.CONSTANT_InvokeDynamic, c.getBootstrapMethodAttrIndex(), c.getNameAndTypeIndex());
}
@@ -53,15 +49,12 @@ public final class ConstantInvokeDynamic
* @throws IOException
*/
ConstantInvokeDynamic(DataInput file) throws IOException {
- this(file.readUnsignedShort(), file.readUnsignedShort());
+ super(Constants.CONSTANT_InvokeDynamic, file);
}
- public ConstantInvokeDynamic(int bootstrap_method_attr_index,
- int name_and_type_index) {
- super(Constants.CONSTANT_InvokeDynamic);
- this.bootstrap_method_attr_index = bootstrap_method_attr_index;
- this.name_and_type_index = name_and_type_index;
+ public ConstantInvokeDynamic(int bootstrap_method_attr_index, int name_and_type_index) {
+ super(Constants.CONSTANT_InvokeDynamic, bootstrap_method_attr_index, name_and_type_index);
}
@@ -74,41 +67,7 @@ public final class ConstantInvokeDynamic
*/
@Override
public void accept( Visitor v ) {
- // TODO Add .visitMethodType to Visitor interface
- }
-
-
- /**
- * Dump name and signature index to file stream in binary format.
- *
- * @param file Output file stream
- * @throws IOException
- */
- @Override
- public final void dump( DataOutputStream file ) throws IOException {
- file.writeByte(tag);
- file.writeShort(bootstrap_method_attr_index);
- file.writeShort(name_and_type_index);
- }
-
-
- public int getBootstrapMethodAttrIndex() {
- return bootstrap_method_attr_index;
- }
-
-
- public void setBootstrapMethodAttrIndex(int bootstrap_method_attr_index) {
- this.bootstrap_method_attr_index = bootstrap_method_attr_index;
- }
-
-
- public int getNameAndTypeIndex() {
- return name_and_type_index;
- }
-
-
- public void setNameAndTypeIndex(int name_and_type_index) {
- this.name_and_type_index = name_and_type_index;
+ v.visitConstantInvokeDynamic(this);
}
@@ -117,8 +76,7 @@ public final class ConstantInvokeDynamic
*/
@Override
public final String toString() {
- return super.toString() + "(bootstrap_method_attr_index = " +
- bootstrap_method_attr_index + ", name_and_type_index = " +
- name_and_type_index + ")";
+ // UNDONE: need to string replace "class_index" with "bootstrap_method_attr_index"
+ return super.toString();
}
}
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/ConstantPool.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/ConstantPool.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/ConstantPool.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/ConstantPool.java Sun Jul 19 21:10:46 2015
@@ -132,7 +132,7 @@ public class ConstantPool implements Clo
case Constants.CONSTANT_NameAndType:
str = (constantToString(((ConstantNameAndType) c).getNameIndex(),
Constants.CONSTANT_Utf8)
- + " " + constantToString(((ConstantNameAndType) c).getSignatureIndex(),
+ + ":" + constantToString(((ConstantNameAndType) c).getSignatureIndex(),
Constants.CONSTANT_Utf8));
break;
case Constants.CONSTANT_InterfaceMethodref:
@@ -143,8 +143,12 @@ public class ConstantPool implements Clo
Constants.CONSTANT_NameAndType));
break;
case Constants.CONSTANT_MethodHandle:
+ // Note that the ReferenceIndex may point to a Fieldref, Methodref or
+ // InterfaceMethodref - so we need to peek ahead to get the actual type.
ConstantMethodHandle cmh = (ConstantMethodHandle) c;
- str = Constants.REF_NAMES[cmh.getReferenceKind()] + " " + constantToString(constant_pool[cmh.getReferenceIndex()]);
+ str = Constants.METHODHANDLE_NAMES[cmh.getReferenceKind()]
+ + " " + constantToString(cmh.getReferenceIndex(),
+ getConstant(cmh.getReferenceIndex()).getTag());
break;
case Constants.CONSTANT_MethodType:
ConstantMethodType cmt = (ConstantMethodType) c;
@@ -152,7 +156,9 @@ public class ConstantPool implements Clo
break;
case Constants.CONSTANT_InvokeDynamic:
ConstantInvokeDynamic cid = ((ConstantInvokeDynamic) c);
- str = cid.getBootstrapMethodAttrIndex() + ": " + constantToString(cid.getNameAndTypeIndex(), Constants.CONSTANT_NameAndType);
+ str = cid.getBootstrapMethodAttrIndex()
+ + ":" + constantToString(cid.getNameAndTypeIndex(),
+ Constants.CONSTANT_NameAndType);
break;
default: // Never reached
throw new RuntimeException("Unknown constant type " + tag);
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java Sun Jul 19 21:10:46 2015
@@ -312,6 +312,14 @@ public class DescendingVisitor implement
stack.pop();
}
+ public void visitConstantInvokeDynamic(
+ ConstantInvokeDynamic constant)
+ {
+ stack.push(constant);
+ constant.accept(visitor);
+ stack.pop();
+ }
+
public void visitConstantLong(ConstantLong constant)
{
stack.push(constant);
@@ -365,6 +373,18 @@ public class DescendingVisitor implement
stack.pop();
}
+ public void visitBootstrapMethods(BootstrapMethods bm)
+ {
+ stack.push(bm);
+ bm.accept(visitor);
+ // BootstrapMethod[] bms = bm.getBootstrapMethods();
+ // for (int i = 0; i < bms.length; i++)
+ // {
+ // bms[i].accept(this);
+ // }
+ stack.pop();
+ }
+
public void visitDeprecated(Deprecated attribute)
{
stack.push(attribute);
@@ -425,13 +445,6 @@ public class DescendingVisitor implement
{
stack.push(obj);
obj.accept(visitor);
- stack.pop();
- }
-
- public void visitBootstrapMethods(BootstrapMethods obj)
- {
- stack.push(obj);
- obj.accept(visitor);
stack.pop();
}
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java Sun Jul 19 21:10:46 2015
@@ -78,6 +78,10 @@ public class EmptyVisitor implements Vis
{
}
+ public void visitConstantInvokeDynamic(ConstantInvokeDynamic obj)
+ {
+ }
+
public void visitConstantLong(ConstantLong obj)
{
}
@@ -126,6 +130,10 @@ public class EmptyVisitor implements Vis
{
}
+ public void visitBootstrapMethods(BootstrapMethods obj)
+ {
+ }
+
public void visitJavaClass(JavaClass obj)
{
}
@@ -190,10 +198,6 @@ public class EmptyVisitor implements Vis
{
}
- public void visitBootstrapMethods(BootstrapMethods obj)
- {
- }
-
public void visitMethodParameters(MethodParameters obj)
{
}
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Utility.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Utility.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Utility.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Utility.java Sun Jul 19 21:10:46 2015
@@ -340,14 +340,18 @@ public abstract class Utility {
*/
case Constants.INVOKESPECIAL:
case Constants.INVOKESTATIC:
- case Constants.INVOKEVIRTUAL:
index = bytes.readUnsignedShort();
Constant c = constant_pool.getConstant(index);
- if (c.getTag() != Constants.CONSTANT_Methodref && c.getTag() != Constants.CONSTANT_InterfaceMethodref) {
- throw new ClassFormatException("Expected class `CONSTANT_Methodref' or 'CONSTANT_InterfaceMethodref' at index " + index + " and got " +c);
- }
+ // With Java8 operand may be either a CONSTANT_Methodref
+ // or a CONSTANT_InterfaceMethodref. (markro)
+ buf.append("\t").append(
+ constant_pool.constantToString(index, c.getTag()))
+ .append((verbose ? " (" + index + ")" : ""));
+ break;
+ case Constants.INVOKEVIRTUAL:
+ index = bytes.readUnsignedShort();
buf.append("\t").append(
- constant_pool.constantToString(c))
+ constant_pool.constantToString(index, Constants.CONSTANT_Methodref))
.append((verbose ? " (" + index + ")" : ""));
break;
case Constants.INVOKEINTERFACE:
@@ -361,14 +365,12 @@ public abstract class Utility {
break;
case Constants.INVOKEDYNAMIC:
index = bytes.readUnsignedShort();
- int ignored = bytes.readUnsignedShort();
- ConstantInvokeDynamic id = (ConstantInvokeDynamic) constant_pool.getConstant(index, Constants.CONSTANT_InvokeDynamic);
- buf.append("\t").append("<dyn>.").append(
+ buf.append("\t").append(
constant_pool
- .constantToString(id.getNameAndTypeIndex(), Constants.CONSTANT_NameAndType));
- if (verbose) {
- buf.append(" (" + index + "/" + id.getNameAndTypeIndex() +")");
- }
+ .constantToString(index, Constants.CONSTANT_InvokeDynamic))
+ .append(verbose ? " (" + index + ")\t" : "")
+ .append(bytes.readUnsignedByte()) // Thrid byte is a reserved space
+ .append(bytes.readUnsignedByte()); // Last byte is a reserved space
break;
/* Operands are references to items in constant pool
*/
@@ -829,7 +831,18 @@ public abstract class Utility {
return compactClassName(signature.substring(1, index), chopit);
}
case 'L': { // Full class name
- int index = signature.indexOf(';'); // Look for closing `;'
+ // should this be a while loop? can there be more than
+ // one generic clause? (markro)
+ int fromIndex = signature.indexOf('<'); // generic type?
+ if (fromIndex < 0) {
+ fromIndex = 0;
+ } else {
+ fromIndex = signature.indexOf('>', fromIndex);
+ if (fromIndex < 0) {
+ throw new ClassFormatException("Invalid signature: " + signature);
+ }
+ }
+ int index = signature.indexOf(';', fromIndex); // Look for closing `;'
if (index < 0) {
throw new ClassFormatException("Invalid signature: " + signature);
}
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Visitor.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Visitor.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Visitor.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Visitor.java Sun Jul 19 21:10:46 2015
@@ -43,6 +43,8 @@ public interface Visitor
void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj);
+ void visitConstantInvokeDynamic(ConstantInvokeDynamic obj);
+
void visitConstantLong(ConstantLong obj);
void visitConstantMethodref(ConstantMethodref obj);
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java Sun Jul 19 21:10:46 2015
@@ -28,6 +28,7 @@ import org.apache.bcel.classfile.Constan
import org.apache.bcel.classfile.ConstantFloat;
import org.apache.bcel.classfile.ConstantInteger;
import org.apache.bcel.classfile.ConstantInterfaceMethodref;
+import org.apache.bcel.classfile.ConstantInvokeDynamic;
import org.apache.bcel.classfile.ConstantLong;
import org.apache.bcel.classfile.ConstantMethodref;
import org.apache.bcel.classfile.ConstantNameAndType;
@@ -127,14 +128,25 @@ public class ConstantPoolGen implements
}
} else if (c instanceof ConstantCP) {
ConstantCP m = (ConstantCP) c;
+ String class_name;
+ ConstantUtf8 u8;
+
+ if (c instanceof ConstantInvokeDynamic) {
+ class_name = Integer.toString(m.getBootstrapMethodAttrIndex());
+ // since name can't begin with digit, can use
+ // METHODREF_DELIM with out fear of duplicates.
+ } else {
ConstantClass clazz = (ConstantClass) constants[m.getClassIndex()];
+ u8 = (ConstantUtf8) constants[clazz.getNameIndex()];
+ class_name = u8.getBytes().replace('/', '.');
+ }
+
ConstantNameAndType n = (ConstantNameAndType) constants[m.getNameAndTypeIndex()];
- ConstantUtf8 u8 = (ConstantUtf8) constants[clazz.getNameIndex()];
- String class_name = u8.getBytes().replace('/', '.');
u8 = (ConstantUtf8) constants[n.getNameIndex()];
String method_name = u8.getBytes();
u8 = (ConstantUtf8) constants[n.getSignatureIndex()];
String signature = u8.getBytes();
+
String delim = METHODREF_DELIM;
if (c instanceof ConstantInterfaceMethodref) {
delim = IMETHODREF_DELIM;
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/EmptyVisitor.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/EmptyVisitor.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/EmptyVisitor.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/EmptyVisitor.java Sun Jul 19 21:10:46 2015
@@ -744,9 +744,6 @@ public abstract class EmptyVisitor imple
public void visitBREAKPOINT( BREAKPOINT obj ) {
}
- public void visitNameSignatureInstruction(NameSignatureInstruction obj) {
- }
-
public void visitINVOKEDYNAMIC(INVOKEDYNAMIC obj) {
}
}
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldOrMethod.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldOrMethod.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldOrMethod.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/FieldOrMethod.java Sun Jul 19 21:10:46 2015
@@ -18,7 +18,12 @@
package org.apache.bcel.generic;
import org.apache.bcel.classfile.ConstantCP;
+import org.apache.bcel.classfile.ConstantNameAndType;
import org.apache.bcel.classfile.ConstantPool;
+import org.apache.bcel.classfile.ConstantUtf8;
+
+// We have removed Deprecated from getClassName() as we continue to use
+// it with our tools and want to remove warnings. (markro)
/**
* Super class for InvokeInstruction and FieldInstruction, since they have
@@ -27,7 +32,7 @@ import org.apache.bcel.classfile.Constan
* @version $Id$
* @author <A HREF="mailto:m.dahm@gmx.de">M. Dahm</A>
*/
-public abstract class FieldOrMethod extends NameSignatureInstruction implements LoadClass {
+public abstract class FieldOrMethod extends CPInstruction implements LoadClass {
private static final long serialVersionUID = 2036985877748835708L;
@@ -48,8 +53,28 @@ public abstract class FieldOrMethod exte
}
+ /** @return signature of referenced method/field.
+ */
+ public String getSignature( ConstantPoolGen cpg ) {
+ ConstantPool cp = cpg.getConstantPool();
+ ConstantCP cmr = (ConstantCP) cp.getConstant(index);
+ ConstantNameAndType cnat = (ConstantNameAndType) cp.getConstant(cmr.getNameAndTypeIndex());
+ return ((ConstantUtf8) cp.getConstant(cnat.getSignatureIndex())).getBytes();
+ }
+
+
+ /** @return name of referenced method/field.
+ */
+ public String getName( ConstantPoolGen cpg ) {
+ ConstantPool cp = cpg.getConstantPool();
+ ConstantCP cmr = (ConstantCP) cp.getConstant(index);
+ ConstantNameAndType cnat = (ConstantNameAndType) cp.getConstant(cmr.getNameAndTypeIndex());
+ return ((ConstantUtf8) cp.getConstant(cnat.getNameIndex())).getBytes();
+ }
+
+
/** @return name of the referenced class/interface
- * @deprecated If the instruction references an array class,
+ * deprecated If the instruction references an array class,
* this method will return "java.lang.Object".
* For code generated by Java 1.5, this answer is
* sometimes wrong (e.g., if the "clone()" method is
@@ -57,7 +82,7 @@ public abstract class FieldOrMethod exte
* the getReferenceType() method, which correctly distinguishes
* between class types and array types.
*/
- @Deprecated
+// @Deprecated
public String getClassName( ConstantPoolGen cpg ) {
ConstantPool cp = cpg.getConstantPool();
ConstantCP cmr = (ConstantCP) cp.getConstant(index);
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/GETFIELD.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/GETFIELD.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/GETFIELD.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/GETFIELD.java Sun Jul 19 21:10:46 2015
@@ -80,7 +80,6 @@ public class GETFIELD extends FieldInstr
v.visitTypedInstruction(this);
v.visitLoadClass(this);
v.visitCPInstruction(this);
- v.visitNameSignatureInstruction(this);
v.visitFieldOrMethod(this);
v.visitFieldInstruction(this);
v.visitGETFIELD(this);
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/GETSTATIC.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/GETSTATIC.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/GETSTATIC.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/GETSTATIC.java Sun Jul 19 21:10:46 2015
@@ -78,7 +78,6 @@ public class GETSTATIC extends FieldInst
v.visitTypedInstruction(this);
v.visitLoadClass(this);
v.visitCPInstruction(this);
- v.visitNameSignatureInstruction(this);
v.visitFieldOrMethod(this);
v.visitFieldInstruction(this);
v.visitGETSTATIC(this);
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java Sun Jul 19 21:10:46 2015
@@ -17,14 +17,11 @@
*/
package org.apache.bcel.generic;
+import java.io.DataOutputStream;
import java.io.IOException;
-import java.util.StringTokenizer;
import org.apache.bcel.Constants;
import org.apache.bcel.ExceptionConstants;
-import org.apache.bcel.classfile.Constant;
-import org.apache.bcel.classfile.ConstantInvokeDynamic;
-import org.apache.bcel.classfile.ConstantNameAndType;
import org.apache.bcel.classfile.ConstantPool;
import org.apache.bcel.util.ByteSequence;
@@ -34,11 +31,9 @@ import org.apache.bcel.util.ByteSequence
* mechanism entirely.
*
* @version $Id: InvokeInstruction.java 1152072 2011-07-29 01:54:05Z dbrosius $
- * @author Bill Pugh
* @since 6.0
*/
-public class INVOKEDYNAMIC extends NameSignatureInstruction implements ExceptionThrower,
- StackConsumer, StackProducer {
+public class INVOKEDYNAMIC extends InvokeInstruction {
private static final long serialVersionUID = 1L;
@@ -51,103 +46,45 @@ public class INVOKEDYNAMIC extends NameS
}
- /**
- * @param index to constant pool
- */
- public INVOKEDYNAMIC(short opcode, int index) {
- super(opcode, index);
+ public INVOKEDYNAMIC(int index) {
+ super(Constants.INVOKEDYNAMIC, index);
}
/**
- * @return mnemonic for instruction with symbolic references resolved
+ * Dump instruction as byte code to stream out.
+ * @param out Output stream
*/
@Override
- public String toString( ConstantPool cp ) {
- Constant c = cp.getConstant(index);
- StringTokenizer tok = new StringTokenizer(cp.constantToString(c));
- return Constants.OPCODE_NAMES[opcode] + " " + tok.nextToken().replace('.', '/')
- + tok.nextToken();
- }
-
- /**
- * Get the ConstantInvokeDynamic associated with this instruction
- */
-
- public ConstantInvokeDynamic getInvokeDynamic( ConstantPoolGen cpg ) {
- ConstantPool cp = cpg.getConstantPool();
- return (ConstantInvokeDynamic) cp.getConstant(index);
+ public void dump( DataOutputStream out ) throws IOException {
+ out.writeByte(opcode);
+ out.writeShort(index);
+ out.writeByte(0);
+ out.writeByte(0);
}
- @Override
- public ConstantNameAndType getNameAndType( ConstantPoolGen cpg ) {
- ConstantPool cp = cpg.getConstantPool();
- ConstantInvokeDynamic id = getInvokeDynamic(cpg);
- return (ConstantNameAndType) cp.getConstant(id.getNameAndTypeIndex());
- }
/**
- * Also works for instructions whose stack effect depends on the
- * constant pool entry they reference.
- * @return Number of words consumed from stack by this instruction
- */
- @Override
- public int consumeStack( ConstantPoolGen cpg ) {
-
- String signature = getSignature(cpg);
- return Type.getArgumentTypesSize(signature);
- }
-
- /**
- * Also works for instructions whose stack effect depends on the
- * constant pool entry they reference.
- * @return Number of words produced onto stack by this instruction
- */
- @Override
- public int produceStack( ConstantPoolGen cpg ) {
- String signature = getSignature(cpg);
- return Type.getReturnTypeSize(signature);
- }
-
-
- /** @return return type of referenced method.
+ * Read needed data (i.e., index) from file.
*/
@Override
- public Type getType( ConstantPoolGen cpg ) {
- return getReturnType(cpg);
- }
-
-
- /** @return name of referenced method.
- */
- public String getMethodName( ConstantPoolGen cpg ) {
- return getName(cpg);
- }
-
-
- /** @return return type of referenced method.
- */
- public Type getReturnType( ConstantPoolGen cpg ) {
- return Type.getReturnType(getSignature(cpg));
+ protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException {
+ super.initFromFile(bytes, wide);
+ length = 5;
+ bytes.readByte(); // Skip 0 byte
+ bytes.readByte(); // Skip 0 byte
}
- /** @return argument types of referenced method.
- */
- public Type[] getArgumentTypes( ConstantPoolGen cpg ) {
- return Type.getArgumentTypes(getSignature(cpg));
- }
-
/**
- * Read needed data (i.e., index) from file.
+ * @return mnemonic for instruction with symbolic references resolved
*/
@Override
- protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException {
- super.initFromFile(bytes, wide);
- length = 5;
- bytes.readUnsignedShort();
+ public String toString( ConstantPool cp ) {
+ return super.toString(cp);
}
+
public Class<?>[] getExceptions() {
Class<?>[] cs = new Class[4 + ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length];
System.arraycopy(ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION, 0, cs, 0,
@@ -174,8 +111,10 @@ public class INVOKEDYNAMIC extends NameS
v.visitTypedInstruction(this);
v.visitStackConsumer(this);
v.visitStackProducer(this);
+ v.visitLoadClass(this);
v.visitCPInstruction(this);
- v.visitNameSignatureInstruction(this);
+ v.visitFieldOrMethod(this);
+ v.visitInvokeInstruction(this);
v.visitINVOKEDYNAMIC(this);
}
}
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java Sun Jul 19 21:10:46 2015
@@ -133,7 +133,6 @@ public final class INVOKEINTERFACE exten
v.visitStackProducer(this);
v.visitLoadClass(this);
v.visitCPInstruction(this);
- v.visitNameSignatureInstruction(this);
v.visitFieldOrMethod(this);
v.visitInvokeInstruction(this);
v.visitINVOKEINTERFACE(this);
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java Sun Jul 19 21:10:46 2015
@@ -75,7 +75,6 @@ public class INVOKESPECIAL extends Invok
v.visitStackProducer(this);
v.visitLoadClass(this);
v.visitCPInstruction(this);
- v.visitNameSignatureInstruction(this);
v.visitFieldOrMethod(this);
v.visitInvokeInstruction(this);
v.visitINVOKESPECIAL(this);
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java Sun Jul 19 21:10:46 2015
@@ -72,7 +72,6 @@ public class INVOKESTATIC extends Invoke
v.visitStackProducer(this);
v.visitLoadClass(this);
v.visitCPInstruction(this);
- v.visitNameSignatureInstruction(this);
v.visitFieldOrMethod(this);
v.visitInvokeInstruction(this);
v.visitINVOKESTATIC(this);
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java Sun Jul 19 21:10:46 2015
@@ -75,7 +75,6 @@ public class INVOKEVIRTUAL extends Invok
v.visitLoadClass(this);
v.visitCPInstruction(this);
v.visitFieldOrMethod(this);
- v.visitNameSignatureInstruction(this);
v.visitInvokeInstruction(this);
v.visitINVOKEVIRTUAL(this);
}
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/InstructionFactory.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/InstructionFactory.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/InstructionFactory.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/InstructionFactory.java Sun Jul 19 21:10:46 2015
@@ -61,7 +61,7 @@ public class InstructionFactory implemen
}
- /** Create an invoke instruction.
+ /** Create an invoke instruction. (Except for invokedynamic.)
*
* @param class_name name of the called class
* @param name name of the called method
@@ -98,6 +98,32 @@ public class InstructionFactory implemen
}
}
+ /** Create an invokedynamic instruction.
+ *
+ * @param bootstrap_index index into the bootstrap_methods array
+ * @param name name of the called method
+ * @param ret_type return type of method
+ * @param arg_types argument types of method
+ * @see Constants
+ */
+/*
+ * createInvokeDynamic only needed if instrumention code wants to generate
+ * a new invokedynamic instruction. I don't think we need. (markro)
+ *
+ public InvokeInstruction createInvokeDynamic( int bootstrap_index, String name, Type ret_type,
+ Type[] arg_types) {
+ int index;
+ int nargs = 0;
+ String signature = Type.getMethodSignature(ret_type, arg_types);
+ for (int i = 0; i < arg_types.length; i++) {
+ nargs += arg_types[i].getSize();
+ }
+ // UNDONE - needs to be added to ConstantPoolGen
+ //index = cp.addInvokeDynamic(bootstrap_index, name, signature);
+ index = 0;
+ return new INVOKEDYNAMIC(index);
+ }
+ */
/** Create a call to the most popular System.out.println() method.
*
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/InvokeInstruction.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/InvokeInstruction.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/InvokeInstruction.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/InvokeInstruction.java Sun Jul 19 21:10:46 2015
@@ -70,7 +70,7 @@ public abstract class InvokeInstruction
@Override
public int consumeStack( ConstantPoolGen cpg ) {
int sum;
- if (opcode == Constants.INVOKESTATIC) {
+ if ((opcode == Constants.INVOKESTATIC) || (opcode == Constants.INVOKEDYNAMIC)) {
sum = 0;
} else {
sum = 1; // this reference
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/PUTFIELD.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/PUTFIELD.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/PUTFIELD.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/PUTFIELD.java Sun Jul 19 21:10:46 2015
@@ -79,7 +79,6 @@ public class PUTFIELD extends FieldInstr
v.visitTypedInstruction(this);
v.visitLoadClass(this);
v.visitCPInstruction(this);
- v.visitNameSignatureInstruction(this);
v.visitFieldOrMethod(this);
v.visitFieldInstruction(this);
v.visitPUTFIELD(this);
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/PUTSTATIC.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/PUTSTATIC.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/PUTSTATIC.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/PUTSTATIC.java Sun Jul 19 21:10:46 2015
@@ -78,7 +78,6 @@ public class PUTSTATIC extends FieldInst
v.visitTypedInstruction(this);
v.visitLoadClass(this);
v.visitCPInstruction(this);
- v.visitNameSignatureInstruction(this);
v.visitFieldOrMethod(this);
v.visitFieldInstruction(this);
v.visitPUTSTATIC(this);
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/Visitor.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/Visitor.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/Visitor.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/generic/Visitor.java Sun Jul 19 21:10:46 2015
@@ -448,6 +448,9 @@ public interface Visitor {
void visitINVOKEVIRTUAL( INVOKEVIRTUAL obj );
+ void visitINVOKEDYNAMIC( INVOKEDYNAMIC obj );
+
+
void visitFASTORE( FASTORE obj );
@@ -566,10 +569,4 @@ public interface Visitor {
void visitBREAKPOINT( BREAKPOINT obj );
-
-
- void visitNameSignatureInstruction( NameSignatureInstruction obj );
-
-
- void visitINVOKEDYNAMIC( INVOKEDYNAMIC obj );
}
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/util/CodeHTML.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/util/CodeHTML.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/util/CodeHTML.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/util/CodeHTML.java Sun Jul 19 21:10:46 2015
@@ -26,6 +26,7 @@ import org.apache.bcel.classfile.Code;
import org.apache.bcel.classfile.CodeException;
import org.apache.bcel.classfile.ConstantFieldref;
import org.apache.bcel.classfile.ConstantInterfaceMethodref;
+import org.apache.bcel.classfile.ConstantInvokeDynamic;
import org.apache.bcel.classfile.ConstantMethodref;
import org.apache.bcel.classfile.ConstantNameAndType;
import org.apache.bcel.classfile.ConstantPool;
@@ -250,6 +251,7 @@ final class CodeHTML implements org.apac
case INVOKESTATIC:
case INVOKEVIRTUAL:
case INVOKEINTERFACE:
+ case INVOKEDYNAMIC:
int m_index = bytes.readShort();
String str;
if (opcode == INVOKEINTERFACE) { // Special treatment needed
@@ -260,16 +262,25 @@ final class CodeHTML implements org.apac
ConstantInterfaceMethodref c = (ConstantInterfaceMethodref) constant_pool
.getConstant(m_index, CONSTANT_InterfaceMethodref);
class_index = c.getClassIndex();
- str = constant_pool.constantToString(c);
index = c.getNameAndTypeIndex();
+ name = Class2HTML.referenceClass(class_index);
+ } else if (opcode == INVOKEDYNAMIC) { // Special treatment needed
+ bytes.readUnsignedByte(); // Reserved
+ bytes.readUnsignedByte(); // Reserved
+ ConstantInvokeDynamic c = (ConstantInvokeDynamic) constant_pool
+ .getConstant(m_index, CONSTANT_InvokeDynamic);
+ index = c.getNameAndTypeIndex();
+ name = "#" + c.getBootstrapMethodAttrIndex();
} else {
+ // UNDONE: Java8 now allows INVOKESPECIAL and INVOKESTATIC to
+ // reference EITHER a Methodref OR an InterfaceMethodref.
+ // Not sure if that affects this code or not. (markro)
ConstantMethodref c = (ConstantMethodref) constant_pool.getConstant(m_index,
CONSTANT_Methodref);
class_index = c.getClassIndex();
- str = constant_pool.constantToString(c);
index = c.getNameAndTypeIndex();
- }
name = Class2HTML.referenceClass(class_index);
+ }
str = Class2HTML.toHTML(constant_pool.constantToString(constant_pool.getConstant(
index, CONSTANT_NameAndType)));
// Get signature, i.e., types
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/util/InstructionFinder.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/util/InstructionFinder.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/util/InstructionFinder.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/util/InstructionFinder.java Sun Jul 19 21:10:46 2015
@@ -317,14 +317,14 @@ public class InstructionFinder {
// Initialize pattern map
static {
map.put("arithmeticinstruction","(irem|lrem|iand|ior|ineg|isub|lneg|fneg|fmul|ldiv|fadd|lxor|frem|idiv|land|ixor|ishr|fsub|lshl|fdiv|iadd|lor|dmul|lsub|ishl|imul|lmul|lushr|dneg|iushr|lshr|ddiv|drem|dadd|ladd|dsub)");
- map.put("invokeinstruction", "(invokevirtual|invokeinterface|invokestatic|invokespecial)");
+ map.put("invokeinstruction", "(invokevirtual|invokeinterface|invokestatic|invokespecial|invokedynamic)");
map.put("arrayinstruction", "(baload|aastore|saload|caload|fastore|lastore|iaload|castore|iastore|aaload|bastore|sastore|faload|laload|daload|dastore)");
map.put("gotoinstruction", "(goto|goto_w)");
map.put("conversioninstruction", "(d2l|l2d|i2s|d2i|l2i|i2b|l2f|d2f|f2i|i2d|i2l|f2d|i2c|f2l|i2f)");
map.put("localvariableinstruction","(fstore|iinc|lload|dstore|dload|iload|aload|astore|istore|fload|lstore)");
map.put("loadinstruction", "(fload|dload|lload|iload|aload)");
map.put("fieldinstruction", "(getfield|putstatic|getstatic|putfield)");
- map.put("cpinstruction", "(ldc2_w|invokeinterface|multianewarray|putstatic|instanceof|getstatic|checkcast|getfield|invokespecial|ldc_w|invokestatic|invokevirtual|putfield|ldc|new|anewarray)");
+ map.put("cpinstruction", "(ldc2_w|invokeinterface|invokedynamic|multianewarray|putstatic|instanceof|getstatic|checkcast|getfield|invokespecial|ldc_w|invokestatic|invokevirtual|putfield|ldc|new|anewarray)");
map.put("stackinstruction", "(dup2|swap|dup2_x2|pop|pop2|dup|dup2_x1|dup_x2|dup_x1)");
map.put("branchinstruction", "(ifle|if_acmpne|if_icmpeq|if_acmpeq|ifnonnull|goto_w|iflt|ifnull|if_icmpne|tableswitch|if_icmple|ifeq|if_icmplt|jsr_w|if_icmpgt|ifgt|jsr|goto|ifne|ifge|lookupswitch|if_icmpge)");
map.put("returninstruction", "(lreturn|ireturn|freturn|dreturn|areturn|return)");
@@ -335,15 +335,15 @@ public class InstructionFinder {
map.put("variablelengthinstruction", "(tableswitch|jsr|goto|lookupswitch)");
map.put("unconditionalbranch", "(goto|jsr|jsr_w|athrow|goto_w)");
map.put("constantpushinstruction", "(dconst|bipush|sipush|fconst|iconst|lconst)");
- map.put("typedinstruction", "(imul|lsub|aload|fload|lor|new|aaload|fcmpg|iand|iaload|lrem|idiv|d2l|isub|dcmpg|dastore|ret|f2d|f2i|drem|iinc|i2c|checkcast|frem|lreturn|astore|lushr|daload|dneg|fastore|istore|lshl|ldiv|lstore|areturn|ishr|ldc_w|invokeinterface|aastore|lxor|ishl|l2d|i2f|return|faload|sipush|iushr|caload|instanceof|invokespecial|putfield|fmul|ireturn|laload|d2f|lneg|ixor|i2l|fdiv|lastore|multianewarray|i2b|getstatic|i2d|putstatic|fcmpl|saload|ladd|irem|dload|jsr_w|dconst|dcmpl|fsub|freturn|ldc|aconst_null|castore|lmul|ldc2_w|dadd|iconst|f2l|ddiv|dstore|land|jsr|anewarray|dmul|bipush|dsub|sastore|d2i|i2s|lshr|iadd|l2i|lload|bastore|fstore|fneg|iload|fadd|baload|fconst|ior|ineg|dreturn|l2f|lconst|getfield|invokevirtual|invokestatic|iastore)");
+ map.put("typedinstruction", "(imul|lsub|aload|fload|lor|new|aaload|fcmpg|iand|iaload|lrem|idiv|d2l|isub|dcmpg|dastore|ret|f2d|f2i|drem|iinc|i2c|checkcast|frem|lreturn|astore|lushr|daload|dneg|fastore|istore|lshl|ldiv|lstore|areturn|ishr|ldc_w|invokeinterface|invokedynamic|aastore|lxor|ishl|l2d|i2f|return|faload|sipush|iushr|caload|instanceof|invokespecial|putfield|fmul|ireturn|laload|d2f|lneg|ixor|i2l|fdiv|lastore|multianewarray|i2b|getstatic|i2d|putstatic|fcmpl|saload|ladd|irem|dload|jsr_w|dconst|dcmpl|fsub|freturn|ldc|aconst_null|castore|lmul|ldc2_w|dadd|iconst|f2l|ddiv|dstore|land|jsr|anewarray|dmul|bipush|dsub|sastore|d2i|i2s|lshr|iadd|l2i|lload|bastore|fstore|fneg|iload|fadd|baload|fconst|ior|ineg|dreturn|l2f|lconst|getfield|invokevirtual|invokestatic|iastore)");
map.put("popinstruction", "(fstore|dstore|pop|pop2|astore|putstatic|istore|lstore)");
map.put("allocationinstruction", "(multianewarray|new|anewarray|newarray)");
- map.put("indexedinstruction", "(lload|lstore|fload|ldc2_w|invokeinterface|multianewarray|astore|dload|putstatic|instanceof|getstatic|checkcast|getfield|invokespecial|dstore|istore|iinc|ldc_w|ret|fstore|invokestatic|iload|putfield|invokevirtual|ldc|new|aload|anewarray)");
+ map.put("indexedinstruction", "(lload|lstore|fload|ldc2_w|invokeinterface|invokedynamic|multianewarray|astore|dload|putstatic|instanceof|getstatic|checkcast|getfield|invokespecial|dstore|istore|iinc|ldc_w|ret|fstore|invokestatic|iload|putfield|invokevirtual|ldc|new|aload|anewarray)");
map.put("pushinstruction", "(dup|lload|dup2|bipush|fload|ldc2_w|sipush|lconst|fconst|dload|getstatic|ldc_w|aconst_null|dconst|iload|ldc|iconst|aload)");
- map.put("stackproducer", "(imul|lsub|aload|fload|lor|new|aaload|fcmpg|iand|iaload|lrem|idiv|d2l|isub|dcmpg|dup|f2d|f2i|drem|i2c|checkcast|frem|lushr|daload|dneg|lshl|ldiv|ishr|ldc_w|invokeinterface|lxor|ishl|l2d|i2f|faload|sipush|iushr|caload|instanceof|invokespecial|fmul|laload|d2f|lneg|ixor|i2l|fdiv|getstatic|i2b|swap|i2d|dup2|fcmpl|saload|ladd|irem|dload|jsr_w|dconst|dcmpl|fsub|ldc|arraylength|aconst_null|tableswitch|lmul|ldc2_w|iconst|dadd|f2l|ddiv|land|jsr|anewarray|dmul|bipush|dsub|d2i|newarray|i2s|lshr|iadd|lload|l2i|fneg|iload|fadd|baload|fconst|lookupswitch|ior|ineg|lconst|l2f|getfield|invokevirtual|invokestatic)");
- map.put("stackconsumer", "(imul|lsub|lor|iflt|fcmpg|if_icmpgt|iand|ifeq|if_icmplt|lrem|ifnonnull|idiv|d2l|isub|dcmpg|dastore|if_icmpeq|f2d|f2i|drem|i2c|checkcast|frem|lreturn|astore|lushr|pop2|monitorexit|dneg|fastore|istore|lshl|ldiv|lstore|areturn|if_icmpge|ishr|monitorenter|invokeinterface|aastore|lxor|ishl|l2d|i2f|return|iushr|instanceof|invokespecial|fmul|ireturn|d2f|lneg|ixor|pop|i2l|ifnull|fdiv|lastore|i2b|if_acmpeq|ifge|swap|i2d|putstatic|fcmpl|ladd|irem|dcmpl|fsub|freturn|ifgt|castore|lmul|dadd|f2l|ddiv|dstore|land|if_icmpne|if_acmpne|dmul|dsub|sastore|ifle|d2i|i2s|lshr|iadd|l2i|bastore|fstore|fneg|fadd|ior|ineg|ifne|dreturn|l2f|if_icmple|getfield|invokevirtual|invokestatic|iastore)");
- map.put("exceptionthrower","(irem|lrem|laload|putstatic|baload|dastore|areturn|getstatic|ldiv|anewarray|iastore|castore|idiv|saload|lastore|fastore|putfield|lreturn|caload|getfield|return|aastore|freturn|newarray|instanceof|multianewarray|athrow|faload|iaload|aaload|dreturn|monitorenter|checkcast|bastore|arraylength|new|invokevirtual|sastore|ldc_w|ireturn|invokespecial|monitorexit|invokeinterface|ldc|invokestatic|daload)");
- map.put("loadclass", "(multianewarray|invokeinterface|instanceof|invokespecial|putfield|checkcast|putstatic|invokevirtual|new|getstatic|invokestatic|getfield|anewarray)");
+ map.put("stackproducer", "(imul|lsub|aload|fload|lor|new|aaload|fcmpg|iand|iaload|lrem|idiv|d2l|isub|dcmpg|dup|f2d|f2i|drem|i2c|checkcast|frem|lushr|daload|dneg|lshl|ldiv|ishr|ldc_w|invokeinterface|invokedynamic|lxor|ishl|l2d|i2f|faload|sipush|iushr|caload|instanceof|invokespecial|fmul|laload|d2f|lneg|ixor|i2l|fdiv|getstatic|i2b|swap|i2d|dup2|fcmpl|saload|ladd|irem|dload|jsr_w|dconst|dcmpl|fsub|ldc|arraylength|aconst_null|tableswitch|lmul|ldc2_w|iconst|dadd|f2l|ddiv|land|jsr|anewarray|dmul|bipush|dsub|d2i|newarray|i2s|lshr|iadd|lload|l2i|fneg|iload|fadd|baload|fconst|lookupswitch|ior|ineg|lconst|l2f|getfield|invokevirtual|invokestatic)");
+ map.put("stackconsumer", "(imul|lsub|lor|iflt|fcmpg|if_icmpgt|iand|ifeq|if_icmplt|lrem|ifnonnull|idiv|d2l|isub|dcmpg|dastore|if_icmpeq|f2d|f2i|drem|i2c|checkcast|frem|lreturn|astore|lushr|pop2|monitorexit|dneg|fastore|istore|lshl|ldiv|lstore|areturn|if_icmpge|ishr|monitorenter|invokeinterface|invokedynamic|aastore|lxor|ishl|l2d|i2f|return|iushr|instanceof|invokespecial|fmul|ireturn|d2f|lneg|ixor|pop|i2l|ifnull|fdiv|lastore|i2b|if_acmpeq|ifge|swap|i2d|putstatic|fcmpl|ladd|irem|dcmpl|fsub|freturn|ifgt|castore|lmul|dadd|f2l|ddiv|dstore|land|if_icmpne|if_acmpne|dmul|dsub|sastore|ifle|d2i|i2s|lshr|iadd|l2i|bastore|fstore|fneg|fadd|ior|ineg|ifne|dreturn|l2f|if_icmple|getfield|invokevirtual|invokestatic|iastore)");
+ map.put("exceptionthrower","(irem|lrem|laload|putstatic|baload|dastore|areturn|getstatic|ldiv|anewarray|iastore|castore|idiv|saload|lastore|fastore|putfield|lreturn|caload|getfield|return|aastore|freturn|newarray|instanceof|multianewarray|athrow|faload|iaload|aaload|dreturn|monitorenter|checkcast|bastore|arraylength|new|invokevirtual|sastore|ldc_w|ireturn|invokespecial|monitorexit|invokeinterface|invokedynamic|ldc|invokestatic|daload)");
+ map.put("loadclass", "(multianewarray|invokeinterface|invokedynamic|instanceof|invokespecial|putfield|checkcast|putstatic|invokevirtual|new|getstatic|invokestatic|getfield|anewarray)");
map.put("instructiontargeter", "(ifle|if_acmpne|if_icmpeq|if_acmpeq|ifnonnull|goto_w|iflt|ifnull|if_icmpne|tableswitch|if_icmple|ifeq|if_icmplt|jsr_w|if_icmpgt|ifgt|jsr|goto|ifne|ifge|lookupswitch|if_icmpge)");
// Some aliases
map.put("if_icmp", "(if_icmpne|if_icmpeq|if_icmple|if_icmpge|if_icmplt|if_icmpgt)");
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java Sun Jul 19 21:10:46 2015
@@ -62,6 +62,7 @@ import org.apache.bcel.generic.ILOAD;
import org.apache.bcel.generic.IMPDEP1;
import org.apache.bcel.generic.IMPDEP2;
import org.apache.bcel.generic.INSTANCEOF;
+import org.apache.bcel.generic.INVOKEDYNAMIC;
import org.apache.bcel.generic.INVOKEINTERFACE;
import org.apache.bcel.generic.INVOKESPECIAL;
import org.apache.bcel.generic.INVOKESTATIC;
@@ -1071,6 +1072,12 @@ public final class Pass3aVerifier extend
/** Checks if the constraints of operands of the said instruction(s) are satisfied. */
@Override
+ public void visitINVOKEDYNAMIC(INVOKEDYNAMIC o){
+ throw new RuntimeException("INVOKEDYNAMIC instruction is not supported at this time");
+ }
+
+ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */
+ @Override
public void visitINVOKEINTERFACE(INVOKEINTERFACE o){
try {
// INVOKEINTERFACE is a LoadClass; the Class where the referenced method is declared in,
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java Sun Jul 19 21:10:46 2015
@@ -788,6 +788,27 @@ public class ExecutionVisitor extends Em
}
/** Symbolically executes the corresponding Java Virtual Machine instruction. */
@Override
+ public void visitINVOKEDYNAMIC(INVOKEDYNAMIC o){
+ for (int i=0; i<o.getArgumentTypes(cpg).length; i++){
+ stack().pop();
+ }
+ // We are sure the invoked method will xRETURN eventually
+ // We simulate xRETURNs functionality here because we
+ // don't really "jump into" and simulate the invoked
+ // method.
+ if (o.getReturnType(cpg) != Type.VOID){
+ Type t = o.getReturnType(cpg);
+ if ( t.equals(Type.BOOLEAN) ||
+ t.equals(Type.CHAR) ||
+ t.equals(Type.BYTE) ||
+ t.equals(Type.SHORT) ) {
+ t = Type.INT;
+ }
+ stack().push(t);
+ }
+ }
+ /** Symbolically executes the corresponding Java Virtual Machine instruction. */
+ @Override
public void visitINVOKEINTERFACE(INVOKEINTERFACE o){
stack().pop(); //objectref
for (int i=0; i<o.getArgumentTypes(cpg).length; i++){
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java Sun Jul 19 21:10:46 2015
@@ -1746,6 +1746,14 @@ public class InstConstraintVisitor exten
* Ensures the specific preconditions of the said instruction.
*/
@Override
+ public void visitINVOKEDYNAMIC(INVOKEDYNAMIC o){
+ throw new RuntimeException("INVOKEDYNAMIC instruction is not supported at this time");
+ }
+
+ /**
+ * Ensures the specific preconditions of the said instruction.
+ */
+ @Override
public void visitINVOKEINTERFACE(INVOKEINTERFACE o){
// Method is not native, otherwise pass 3 would not happen.
Modified: commons/proper/bcel/trunk/src/test/java/org/apache/bcel/visitors/CounterVisitor.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/test/java/org/apache/bcel/visitors/CounterVisitor.java?rev=1691855&r1=1691854&r2=1691855&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/test/java/org/apache/bcel/visitors/CounterVisitor.java (original)
+++ commons/proper/bcel/trunk/src/test/java/org/apache/bcel/visitors/CounterVisitor.java Sun Jul 19 21:10:46 2015
@@ -30,6 +30,7 @@ import org.apache.bcel.classfile.Constan
import org.apache.bcel.classfile.ConstantFloat;
import org.apache.bcel.classfile.ConstantInteger;
import org.apache.bcel.classfile.ConstantInterfaceMethodref;
+import org.apache.bcel.classfile.ConstantInvokeDynamic;
import org.apache.bcel.classfile.ConstantLong;
import org.apache.bcel.classfile.ConstantMethodref;
import org.apache.bcel.classfile.ConstantNameAndType;
@@ -358,4 +359,8 @@ public class CounterVisitor implements V
{
methodParametersCount++;
}
+
+ public void visitConstantInvokeDynamic(ConstantInvokeDynamic obj)
+ {
+ }
}