You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by th...@apache.org on 2018/11/29 00:34:10 UTC
[23/46] tapestry-5 git commit: TAP5-2588: upgrading from ASM 6 to 7
for Java 9+ support
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/1c71aec7/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/signature/SignatureReader.java
----------------------------------------------------------------------
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/signature/SignatureReader.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/signature/SignatureReader.java
old mode 100644
new mode 100755
index 878cd8d..d1c063c
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/signature/SignatureReader.java
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/signature/SignatureReader.java
@@ -1,228 +1,252 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
+// ASM: a very small and fast Java bytecode manipulation framework
+// Copyright (c) 2000-2011 INRIA, France Telecom
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the copyright holders nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+// THE POSSIBILITY OF SUCH DAMAGE.
package org.apache.tapestry5.internal.plastic.asm.signature;
/**
- * A type signature parser to make a signature visitor visit an existing
- * signature.
- *
+ * A parser for signature literals, as defined in the Java Virtual Machine Specification (JVMS), to
+ * visit them with a SignatureVisitor.
+ *
+ * @see <a href="https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.7.9.1">JVMS
+ * 4.7.9.1</a>
* @author Thomas Hallgren
* @author Eric Bruneton
*/
public class SignatureReader {
- /**
- * The signature to be read.
- */
- private final String signature;
-
- /**
- * Constructs a {@link SignatureReader} for the given signature.
- *
- * @param signature
- * A <i>ClassSignature</i>, <i>MethodTypeSignature</i>, or
- * <i>FieldTypeSignature</i>.
- */
- public SignatureReader(final String signature) {
- this.signature = signature;
- }
+ /** The JVMS signature to be read. */
+ private final String signatureValue;
+
+ /**
+ * Constructs a {@link SignatureReader} for the given signature.
+ *
+ * @param signature A <i>JavaTypeSignature</i>, <i>ClassSignature</i> or <i>MethodSignature</i>.
+ */
+ public SignatureReader(final String signature) {
+ this.signatureValue = signature;
+ }
- /**
- * Makes the given visitor visit the signature of this
- * {@link SignatureReader}. This signature is the one specified in the
- * constructor (see {@link #SignatureReader(String) SignatureReader}). This
- * method is intended to be called on a {@link SignatureReader} that was
- * created using a <i>ClassSignature</i> (such as the <code>signature</code>
- * parameter of the {@link org.objectweb.asm.ClassVisitor#visit
- * ClassVisitor.visit} method) or a <i>MethodTypeSignature</i> (such as the
- * <code>signature</code> parameter of the
- * {@link org.objectweb.asm.ClassVisitor#visitMethod
- * ClassVisitor.visitMethod} method).
- *
- * @param v
- * the visitor that must visit this signature.
- */
- public void accept(final SignatureVisitor v) {
- String signature = this.signature;
- int len = signature.length();
- int pos;
- char c;
-
- if (signature.charAt(0) == '<') {
- pos = 2;
- do {
- int end = signature.indexOf(':', pos);
- v.visitFormalTypeParameter(signature.substring(pos - 1, end));
- pos = end + 1;
-
- c = signature.charAt(pos);
- if (c == 'L' || c == '[' || c == 'T') {
- pos = parseType(signature, pos, v.visitClassBound());
- }
-
- while ((c = signature.charAt(pos++)) == ':') {
- pos = parseType(signature, pos, v.visitInterfaceBound());
- }
- } while (c != '>');
- } else {
- pos = 0;
+ /**
+ * Makes the given visitor visit the signature of this {@link SignatureReader}. This signature is
+ * the one specified in the constructor (see {@link #SignatureReader}). This method is intended to
+ * be called on a {@link SignatureReader} that was created using a <i>ClassSignature</i> (such as
+ * the <code>signature</code> parameter of the {@link org.apache.tapestry5.internal.plastic.asm.ClassVisitor#visit}
+ * method) or a <i>MethodSignature</i> (such as the <code>signature</code> parameter of the {@link
+ * org.apache.tapestry5.internal.plastic.asm.ClassVisitor#visitMethod} method).
+ *
+ * @param signatureVistor the visitor that must visit this signature.
+ */
+ public void accept(final SignatureVisitor signatureVistor) {
+ String signature = this.signatureValue;
+ int length = signature.length();
+ int offset; // Current offset in the parsed signature (parsed from left to right).
+ char currentChar; // The signature character at 'offset', or just before.
+
+ // If the signature starts with '<', it starts with TypeParameters, i.e. a formal type parameter
+ // identifier, followed by one or more pair ':',ReferenceTypeSignature (for its class bound and
+ // interface bounds).
+ if (signature.charAt(0) == '<') {
+ // Invariant: offset points to the second character of a formal type parameter name at the
+ // beginning of each iteration of the loop below.
+ offset = 2;
+ do {
+ // The formal type parameter name is everything between offset - 1 and the first ':'.
+ int classBoundStartOffset = signature.indexOf(':', offset);
+ signatureVistor.visitFormalTypeParameter(
+ signature.substring(offset - 1, classBoundStartOffset));
+
+ // If the character after the ':' class bound marker is not the start of a
+ // ReferenceTypeSignature, it means the class bound is empty (which is a valid case).
+ offset = classBoundStartOffset + 1;
+ currentChar = signature.charAt(offset);
+ if (currentChar == 'L' || currentChar == '[' || currentChar == 'T') {
+ offset = parseType(signature, offset, signatureVistor.visitClassBound());
}
- if (signature.charAt(pos) == '(') {
- pos++;
- while (signature.charAt(pos) != ')') {
- pos = parseType(signature, pos, v.visitParameterType());
- }
- pos = parseType(signature, pos + 1, v.visitReturnType());
- while (pos < len) {
- pos = parseType(signature, pos + 1, v.visitExceptionType());
- }
- } else {
- pos = parseType(signature, pos, v.visitSuperclass());
- while (pos < len) {
- pos = parseType(signature, pos, v.visitInterface());
- }
+ // While the character after the class bound or after the last parsed interface bound
+ // is ':', we need to parse another interface bound.
+ while ((currentChar = signature.charAt(offset++)) == ':') {
+ offset = parseType(signature, offset, signatureVistor.visitInterfaceBound());
}
+
+ // At this point a TypeParameter has been fully parsed, and we need to parse the next one
+ // (note that currentChar is now the first character of the next TypeParameter, and that
+ // offset points to the second character), unless the character just after this
+ // TypeParameter signals the end of the TypeParameters.
+ } while (currentChar != '>');
+ } else {
+ offset = 0;
}
- /**
- * Makes the given visitor visit the signature of this
- * {@link SignatureReader}. This signature is the one specified in the
- * constructor (see {@link #SignatureReader(String) SignatureReader}). This
- * method is intended to be called on a {@link SignatureReader} that was
- * created using a <i>FieldTypeSignature</i>, such as the
- * <code>signature</code> parameter of the
- * {@link org.objectweb.asm.ClassVisitor#visitField ClassVisitor.visitField}
- * or {@link org.objectweb.asm.MethodVisitor#visitLocalVariable
- * MethodVisitor.visitLocalVariable} methods.
- *
- * @param v
- * the visitor that must visit this signature.
- */
- public void acceptType(final SignatureVisitor v) {
- parseType(this.signature, 0, v);
+ // If the (optional) TypeParameters is followed by '(' this means we are parsing a
+ // MethodSignature, which has JavaTypeSignature type inside parentheses, followed by a Result
+ // type and optional ThrowsSignature types.
+ if (signature.charAt(offset) == '(') {
+ offset++;
+ while (signature.charAt(offset) != ')') {
+ offset = parseType(signature, offset, signatureVistor.visitParameterType());
+ }
+ // Use offset + 1 to skip ')'.
+ offset = parseType(signature, offset + 1, signatureVistor.visitReturnType());
+ while (offset < length) {
+ // Use offset + 1 to skip the first character of a ThrowsSignature, i.e. '^'.
+ offset = parseType(signature, offset + 1, signatureVistor.visitExceptionType());
+ }
+ } else {
+ // Otherwise we are parsing a ClassSignature (by hypothesis on the method input), which has
+ // one or more ClassTypeSignature for the super class and the implemented interfaces.
+ offset = parseType(signature, offset, signatureVistor.visitSuperclass());
+ while (offset < length) {
+ offset = parseType(signature, offset, signatureVistor.visitInterface());
+ }
}
+ }
+
+ /**
+ * Makes the given visitor visit the signature of this {@link SignatureReader}. This signature is
+ * the one specified in the constructor (see {@link #SignatureReader}). This method is intended to
+ * be called on a {@link SignatureReader} that was created using a <i>JavaTypeSignature</i>, such
+ * as the <code>signature</code> parameter of the {@link
+ * org.apache.tapestry5.internal.plastic.asm.ClassVisitor#visitField} or {@link
+ * org.apache.tapestry5.internal.plastic.asm.MethodVisitor#visitLocalVariable} methods.
+ *
+ * @param signatureVisitor the visitor that must visit this signature.
+ */
+ public void acceptType(final SignatureVisitor signatureVisitor) {
+ parseType(signatureValue, 0, signatureVisitor);
+ }
+
+ /**
+ * Parses a JavaTypeSignature and makes the given visitor visit it.
+ *
+ * @param signature a string containing the signature that must be parsed.
+ * @param startOffset index of the first character of the signature to parsed.
+ * @param signatureVisitor the visitor that must visit this signature.
+ * @return the index of the first character after the parsed signature.
+ */
+ private static int parseType(
+ final String signature, final int startOffset, final SignatureVisitor signatureVisitor) {
+ int offset = startOffset; // Current offset in the parsed signature.
+ char currentChar = signature.charAt(offset++); // The signature character at 'offset'.
+
+ // Switch based on the first character of the JavaTypeSignature, which indicates its kind.
+ switch (currentChar) {
+ case 'Z':
+ case 'C':
+ case 'B':
+ case 'S':
+ case 'I':
+ case 'F':
+ case 'J':
+ case 'D':
+ case 'V':
+ // Case of a BaseType or a VoidDescriptor.
+ signatureVisitor.visitBaseType(currentChar);
+ return offset;
+
+ case '[':
+ // Case of an ArrayTypeSignature, a '[' followed by a JavaTypeSignature.
+ return parseType(signature, offset, signatureVisitor.visitArrayType());
- /**
- * Parses a field type signature and makes the given visitor visit it.
- *
- * @param signature
- * a string containing the signature that must be parsed.
- * @param pos
- * index of the first character of the signature to parsed.
- * @param v
- * the visitor that must visit this signature.
- * @return the index of the first character after the parsed signature.
- */
- private static int parseType(final String signature, int pos,
- final SignatureVisitor v) {
- char c;
- int start, end;
- boolean visited, inner;
- String name;
-
- switch (c = signature.charAt(pos++)) {
- case 'Z':
- case 'C':
- case 'B':
- case 'S':
- case 'I':
- case 'F':
- case 'J':
- case 'D':
- case 'V':
- v.visitBaseType(c);
- return pos;
-
- case '[':
- return parseType(signature, pos, v.visitArrayType());
-
- case 'T':
- end = signature.indexOf(';', pos);
- v.visitTypeVariable(signature.substring(pos, end));
- return end + 1;
-
- default: // case 'L':
- start = pos;
+ case 'T':
+ // Case of TypeVariableSignature, an identifier between 'T' and ';'.
+ int endOffset = signature.indexOf(';', offset);
+ signatureVisitor.visitTypeVariable(signature.substring(offset, endOffset));
+ return endOffset + 1;
+
+ case 'L':
+ // Case of a ClassTypeSignature, which ends with ';'.
+ // These signatures have a main class type followed by zero or more inner class types
+ // (separated by '.'). Each can have type arguments, inside '<' and '>'.
+ int start = offset; // The start offset of the currently parsed main or inner class name.
+ boolean visited = false; // Whether the currently parsed class name has been visited.
+ boolean inner = false; // Whether we are currently parsing an inner class type.
+ // Parses the signature, one character at a time.
+ while (true) {
+ currentChar = signature.charAt(offset++);
+ if (currentChar == '.' || currentChar == ';') {
+ // If a '.' or ';' is encountered, this means we have fully parsed the main class name
+ // or an inner class name. This name may already have been visited it is was followed by
+ // type arguments between '<' and '>'. If not, we need to visit it here.
+ if (!visited) {
+ String name = signature.substring(start, offset - 1);
+ if (inner) {
+ signatureVisitor.visitInnerClassType(name);
+ } else {
+ signatureVisitor.visitClassType(name);
+ }
+ }
+ // If we reached the end of the ClassTypeSignature return, otherwise start the parsing
+ // of a new class name, which is necessarily an inner class name.
+ if (currentChar == ';') {
+ signatureVisitor.visitEnd();
+ break;
+ }
+ start = offset;
visited = false;
- inner = false;
- for (;;) {
- switch (c = signature.charAt(pos++)) {
- case '.':
- case ';':
- if (!visited) {
- name = signature.substring(start, pos - 1);
- if (inner) {
- v.visitInnerClassType(name);
- } else {
- v.visitClassType(name);
- }
- }
- if (c == ';') {
- v.visitEnd();
- return pos;
- }
- start = pos;
- visited = false;
- inner = true;
- break;
-
- case '<':
- name = signature.substring(start, pos - 1);
- if (inner) {
- v.visitInnerClassType(name);
- } else {
- v.visitClassType(name);
- }
- visited = true;
- top: for (;;) {
- switch (c = signature.charAt(pos)) {
- case '>':
- break top;
- case '*':
- ++pos;
- v.visitTypeArgument();
- break;
- case '+':
- case '-':
- pos = parseType(signature, pos + 1,
- v.visitTypeArgument(c));
- break;
- default:
- pos = parseType(signature, pos,
- v.visitTypeArgument('='));
- break;
- }
- }
- }
+ inner = true;
+ } else if (currentChar == '<') {
+ // If a '<' is encountered, this means we have fully parsed the main class name or an
+ // inner class name, and that we now need to parse TypeArguments. First, we need to
+ // visit the parsed class name.
+ String name = signature.substring(start, offset - 1);
+ if (inner) {
+ signatureVisitor.visitInnerClassType(name);
+ } else {
+ signatureVisitor.visitClassType(name);
}
+ visited = true;
+ // Now, parse the TypeArgument(s), one at a time.
+ while ((currentChar = signature.charAt(offset)) != '>') {
+ switch (currentChar) {
+ case '*':
+ // Unbounded TypeArgument.
+ ++offset;
+ signatureVisitor.visitTypeArgument();
+ break;
+ case '+':
+ case '-':
+ // Extends or Super TypeArgument. Use offset + 1 to skip the '+' or '-'.
+ offset =
+ parseType(
+ signature, offset + 1, signatureVisitor.visitTypeArgument(currentChar));
+ break;
+ default:
+ // Instanceof TypeArgument. The '=' is implicit.
+ offset = parseType(signature, offset, signatureVisitor.visitTypeArgument('='));
+ break;
+ }
+ }
+ }
}
+ return offset;
+
+ default:
+ throw new IllegalArgumentException();
}
+ }
}
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/1c71aec7/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/signature/SignatureVisitor.java
----------------------------------------------------------------------
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/signature/SignatureVisitor.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/signature/SignatureVisitor.java
old mode 100644
new mode 100755
index 4277ade..3f0cc9a
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/signature/SignatureVisitor.java
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/signature/SignatureVisitor.java
@@ -1,238 +1,203 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
+// ASM: a very small and fast Java bytecode manipulation framework
+// Copyright (c) 2000-2011 INRIA, France Telecom
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the copyright holders nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+// THE POSSIBILITY OF SUCH DAMAGE.
package org.apache.tapestry5.internal.plastic.asm.signature;
import org.apache.tapestry5.internal.plastic.asm.Opcodes;
/**
- * A visitor to visit a generic signature. The methods of this interface must be
- * called in one of the three following orders (the last one is the only valid
- * order for a {@link SignatureVisitor} that is returned by a method of this
- * interface):
+ * A visitor to visit a generic signature. The methods of this interface must be called in one of
+ * the three following orders (the last one is the only valid order for a {@link SignatureVisitor}
+ * that is returned by a method of this interface):
+ *
* <ul>
- * <li><i>ClassSignature</i> = ( <tt>visitFormalTypeParameter</tt>
- * <tt>visitClassBound</tt>? <tt>visitInterfaceBound</tt>* )* (
- * <tt>visitSuperclass</tt> <tt>visitInterface</tt>* )</li>
- * <li><i>MethodSignature</i> = ( <tt>visitFormalTypeParameter</tt>
- * <tt>visitClassBound</tt>? <tt>visitInterfaceBound</tt>* )* (
- * <tt>visitParameterType</tt>* <tt>visitReturnType</tt>
- * <tt>visitExceptionType</tt>* )</li>
- * <li><i>TypeSignature</i> = <tt>visitBaseType</tt> |
- * <tt>visitTypeVariable</tt> | <tt>visitArrayType</tt> | (
- * <tt>visitClassType</tt> <tt>visitTypeArgument</tt>* (
- * <tt>visitInnerClassType</tt> <tt>visitTypeArgument</tt>* )* <tt>visitEnd</tt>
- * ) )</li>
+ * <li><i>ClassSignature</i> = ( {@code visitFormalTypeParameter} {@code visitClassBound}? {@code
+ * visitInterfaceBound}* )* ({@code visitSuperclass} {@code visitInterface}* )
+ * <li><i>MethodSignature</i> = ( {@code visitFormalTypeParameter} {@code visitClassBound}? {@code
+ * visitInterfaceBound}* )* ({@code visitParameterType}* {@code visitReturnType} {@code
+ * visitExceptionType}* )
+ * <li><i>TypeSignature</i> = {@code visitBaseType} | {@code visitTypeVariable} | {@code
+ * visitArrayType} | ( {@code visitClassType} {@code visitTypeArgument}* ( {@code
+ * visitInnerClassType} {@code visitTypeArgument}* )* {@code visitEnd} ) )
* </ul>
- *
+ *
* @author Thomas Hallgren
* @author Eric Bruneton
*/
public abstract class SignatureVisitor {
- /**
- * Wildcard for an "extends" type argument.
- */
- public final static char EXTENDS = '+';
-
- /**
- * Wildcard for a "super" type argument.
- */
- public final static char SUPER = '-';
-
- /**
- * Wildcard for a normal type argument.
- */
- public final static char INSTANCEOF = '=';
-
- /**
- * The ASM API version implemented by this visitor. The value of this field
- * must be one of {@link Opcodes#ASM4}, {@link Opcodes#ASM5} or {@link Opcodes#ASM6}.
- */
- protected final int api;
-
- /**
- * Constructs a new {@link SignatureVisitor}.
- *
- * @param api
- * the ASM API version implemented by this visitor. Must be one
- * of {@link Opcodes#ASM4}, {@link Opcodes#ASM5} or {@link Opcodes#ASM6}.
- */
- public SignatureVisitor(final int api) {
- if (api < Opcodes.ASM4 || api > Opcodes.ASM6) {
- throw new IllegalArgumentException();
- }
- this.api = api;
- }
-
- /**
- * Visits a formal type parameter.
- *
- * @param name
- * the name of the formal parameter.
- */
- public void visitFormalTypeParameter(String name) {
- }
-
- /**
- * Visits the class bound of the last visited formal type parameter.
- *
- * @return a non null visitor to visit the signature of the class bound.
- */
- public SignatureVisitor visitClassBound() {
- return this;
- }
-
- /**
- * Visits an interface bound of the last visited formal type parameter.
- *
- * @return a non null visitor to visit the signature of the interface bound.
- */
- public SignatureVisitor visitInterfaceBound() {
- return this;
- }
-
- /**
- * Visits the type of the super class.
- *
- * @return a non null visitor to visit the signature of the super class
- * type.
- */
- public SignatureVisitor visitSuperclass() {
- return this;
- }
-
- /**
- * Visits the type of an interface implemented by the class.
- *
- * @return a non null visitor to visit the signature of the interface type.
- */
- public SignatureVisitor visitInterface() {
- return this;
- }
-
- /**
- * Visits the type of a method parameter.
- *
- * @return a non null visitor to visit the signature of the parameter type.
- */
- public SignatureVisitor visitParameterType() {
- return this;
- }
-
- /**
- * Visits the return type of the method.
- *
- * @return a non null visitor to visit the signature of the return type.
- */
- public SignatureVisitor visitReturnType() {
- return this;
- }
-
- /**
- * Visits the type of a method exception.
- *
- * @return a non null visitor to visit the signature of the exception type.
- */
- public SignatureVisitor visitExceptionType() {
- return this;
- }
-
- /**
- * Visits a signature corresponding to a primitive type.
- *
- * @param descriptor
- * the descriptor of the primitive type, or 'V' for <tt>void</tt>
- * .
- */
- public void visitBaseType(char descriptor) {
- }
-
- /**
- * Visits a signature corresponding to a type variable.
- *
- * @param name
- * the name of the type variable.
- */
- public void visitTypeVariable(String name) {
- }
-
- /**
- * Visits a signature corresponding to an array type.
- *
- * @return a non null visitor to visit the signature of the array element
- * type.
- */
- public SignatureVisitor visitArrayType() {
- return this;
- }
-
- /**
- * Starts the visit of a signature corresponding to a class or interface
- * type.
- *
- * @param name
- * the internal name of the class or interface.
- */
- public void visitClassType(String name) {
- }
-
- /**
- * Visits an inner class.
- *
- * @param name
- * the local name of the inner class in its enclosing class.
- */
- public void visitInnerClassType(String name) {
- }
-
- /**
- * Visits an unbounded type argument of the last visited class or inner
- * class type.
- */
- public void visitTypeArgument() {
- }
-
- /**
- * Visits a type argument of the last visited class or inner class type.
- *
- * @param wildcard
- * '+', '-' or '='.
- * @return a non null visitor to visit the signature of the type argument.
- */
- public SignatureVisitor visitTypeArgument(char wildcard) {
- return this;
- }
-
- /**
- * Ends the visit of a signature corresponding to a class or interface type.
- */
- public void visitEnd() {
- }
+ /** Wildcard for an "extends" type argument. */
+ public static final char EXTENDS = '+';
+
+ /** Wildcard for a "super" type argument. */
+ public static final char SUPER = '-';
+
+ /** Wildcard for a normal type argument. */
+ public static final char INSTANCEOF = '=';
+
+ /**
+ * The ASM API version implemented by this visitor. The value of this field must be one of {@link
+ * Opcodes#ASM4}, {@link Opcodes#ASM5}, {@link Opcodes#ASM6} or {@link Opcodes#ASM7}.
+ */
+ protected final int api;
+
+ /**
+ * Constructs a new {@link SignatureVisitor}.
+ *
+ * @param api the ASM API version implemented by this visitor. Must be one of {@link
+ * Opcodes#ASM4}, {@link Opcodes#ASM5}, {@link Opcodes#ASM6} or {@link Opcodes#ASM7}.
+ */
+ public SignatureVisitor(final int api) {
+ if (api != Opcodes.ASM6 && api != Opcodes.ASM5 && api != Opcodes.ASM4 && api != Opcodes.ASM7) {
+ throw new IllegalArgumentException();
+ }
+ this.api = api;
+ }
+
+ /**
+ * Visits a formal type parameter.
+ *
+ * @param name the name of the formal parameter.
+ */
+ public void visitFormalTypeParameter(final String name) {}
+
+ /**
+ * Visits the class bound of the last visited formal type parameter.
+ *
+ * @return a non null visitor to visit the signature of the class bound.
+ */
+ public SignatureVisitor visitClassBound() {
+ return this;
+ }
+
+ /**
+ * Visits an interface bound of the last visited formal type parameter.
+ *
+ * @return a non null visitor to visit the signature of the interface bound.
+ */
+ public SignatureVisitor visitInterfaceBound() {
+ return this;
+ }
+
+ /**
+ * Visits the type of the super class.
+ *
+ * @return a non null visitor to visit the signature of the super class type.
+ */
+ public SignatureVisitor visitSuperclass() {
+ return this;
+ }
+
+ /**
+ * Visits the type of an interface implemented by the class.
+ *
+ * @return a non null visitor to visit the signature of the interface type.
+ */
+ public SignatureVisitor visitInterface() {
+ return this;
+ }
+
+ /**
+ * Visits the type of a method parameter.
+ *
+ * @return a non null visitor to visit the signature of the parameter type.
+ */
+ public SignatureVisitor visitParameterType() {
+ return this;
+ }
+
+ /**
+ * Visits the return type of the method.
+ *
+ * @return a non null visitor to visit the signature of the return type.
+ */
+ public SignatureVisitor visitReturnType() {
+ return this;
+ }
+
+ /**
+ * Visits the type of a method exception.
+ *
+ * @return a non null visitor to visit the signature of the exception type.
+ */
+ public SignatureVisitor visitExceptionType() {
+ return this;
+ }
+
+ /**
+ * Visits a signature corresponding to a primitive type.
+ *
+ * @param descriptor the descriptor of the primitive type, or 'V' for {@code void} .
+ */
+ public void visitBaseType(final char descriptor) {}
+
+ /**
+ * Visits a signature corresponding to a type variable.
+ *
+ * @param name the name of the type variable.
+ */
+ public void visitTypeVariable(final String name) {}
+
+ /**
+ * Visits a signature corresponding to an array type.
+ *
+ * @return a non null visitor to visit the signature of the array element type.
+ */
+ public SignatureVisitor visitArrayType() {
+ return this;
+ }
+
+ /**
+ * Starts the visit of a signature corresponding to a class or interface type.
+ *
+ * @param name the internal name of the class or interface.
+ */
+ public void visitClassType(final String name) {}
+
+ /**
+ * Visits an inner class.
+ *
+ * @param name the local name of the inner class in its enclosing class.
+ */
+ public void visitInnerClassType(final String name) {}
+
+ /** Visits an unbounded type argument of the last visited class or inner class type. */
+ public void visitTypeArgument() {}
+
+ /**
+ * Visits a type argument of the last visited class or inner class type.
+ *
+ * @param wildcard '+', '-' or '='.
+ * @return a non null visitor to visit the signature of the type argument.
+ */
+ public SignatureVisitor visitTypeArgument(final char wildcard) {
+ return this;
+ }
+
+ /** Ends the visit of a signature corresponding to a class or interface type. */
+ public void visitEnd() {}
}
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/1c71aec7/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/signature/SignatureWriter.java
----------------------------------------------------------------------
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/signature/SignatureWriter.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/signature/SignatureWriter.java
old mode 100644
new mode 100755
index 8d98cd1..4adc4e2
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/signature/SignatureWriter.java
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/signature/SignatureWriter.java
@@ -1,227 +1,240 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
+// ASM: a very small and fast Java bytecode manipulation framework
+// Copyright (c) 2000-2011 INRIA, France Telecom
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the copyright holders nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+// THE POSSIBILITY OF SUCH DAMAGE.
package org.apache.tapestry5.internal.plastic.asm.signature;
import org.apache.tapestry5.internal.plastic.asm.Opcodes;
/**
- * A signature visitor that generates signatures in string format.
- *
+ * A SignatureVisitor that generates signature literals, as defined in the Java Virtual Machine
+ * Specification (JVMS).
+ *
+ * @see <a href="https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.7.9.1">JVMS
+ * 4.7.9.1</a>
* @author Thomas Hallgren
* @author Eric Bruneton
*/
public class SignatureWriter extends SignatureVisitor {
- /**
- * Builder used to construct the signature.
- */
- private final StringBuilder buf = new StringBuilder();
-
- /**
- * Indicates if the signature contains formal type parameters.
- */
- private boolean hasFormals;
-
- /**
- * Indicates if the signature contains method parameter types.
- */
- private boolean hasParameters;
-
- /**
- * Stack used to keep track of class types that have arguments. Each element
- * of this stack is a boolean encoded in one bit. The top of the stack is
- * the lowest order bit. Pushing false = *2, pushing true = *2+1, popping =
- * /2.
- */
- private int argumentStack;
-
- /**
- * Constructs a new {@link SignatureWriter} object.
- */
- public SignatureWriter() {
- super(Opcodes.ASM6);
- }
-
- // ------------------------------------------------------------------------
- // Implementation of the SignatureVisitor interface
- // ------------------------------------------------------------------------
-
- @Override
- public void visitFormalTypeParameter(final String name) {
- if (!hasFormals) {
- hasFormals = true;
- buf.append('<');
- }
- buf.append(name);
- buf.append(':');
- }
-
- @Override
- public SignatureVisitor visitClassBound() {
- return this;
- }
-
- @Override
- public SignatureVisitor visitInterfaceBound() {
- buf.append(':');
- return this;
- }
-
- @Override
- public SignatureVisitor visitSuperclass() {
- endFormals();
- return this;
- }
-
- @Override
- public SignatureVisitor visitInterface() {
- return this;
- }
-
- @Override
- public SignatureVisitor visitParameterType() {
- endFormals();
- if (!hasParameters) {
- hasParameters = true;
- buf.append('(');
- }
- return this;
- }
-
- @Override
- public SignatureVisitor visitReturnType() {
- endFormals();
- if (!hasParameters) {
- buf.append('(');
- }
- buf.append(')');
- return this;
- }
-
- @Override
- public SignatureVisitor visitExceptionType() {
- buf.append('^');
- return this;
- }
-
- @Override
- public void visitBaseType(final char descriptor) {
- buf.append(descriptor);
- }
-
- @Override
- public void visitTypeVariable(final String name) {
- buf.append('T');
- buf.append(name);
- buf.append(';');
- }
-
- @Override
- public SignatureVisitor visitArrayType() {
- buf.append('[');
- return this;
- }
-
- @Override
- public void visitClassType(final String name) {
- buf.append('L');
- buf.append(name);
- argumentStack *= 2;
- }
-
- @Override
- public void visitInnerClassType(final String name) {
- endArguments();
- buf.append('.');
- buf.append(name);
- argumentStack *= 2;
- }
-
- @Override
- public void visitTypeArgument() {
- if (argumentStack % 2 == 0) {
- ++argumentStack;
- buf.append('<');
- }
- buf.append('*');
- }
-
- @Override
- public SignatureVisitor visitTypeArgument(final char wildcard) {
- if (argumentStack % 2 == 0) {
- ++argumentStack;
- buf.append('<');
- }
- if (wildcard != '=') {
- buf.append(wildcard);
- }
- return this;
- }
-
- @Override
- public void visitEnd() {
- endArguments();
- buf.append(';');
- }
-
- /**
- * Returns the signature that was built by this signature writer.
- *
- * @return the signature that was built by this signature writer.
- */
- @Override
- public String toString() {
- return buf.toString();
- }
-
- // ------------------------------------------------------------------------
- // Utility methods
- // ------------------------------------------------------------------------
-
- /**
- * Ends the formal type parameters section of the signature.
- */
- private void endFormals() {
- if (hasFormals) {
- hasFormals = false;
- buf.append('>');
- }
- }
-
- /**
- * Ends the type arguments of a class or inner class type.
- */
- private void endArguments() {
- if (argumentStack % 2 != 0) {
- buf.append('>');
- }
- argumentStack /= 2;
- }
-}
\ No newline at end of file
+ /** The builder used to construct the visited signature. */
+ private final StringBuilder stringBuilder = new StringBuilder();
+
+ /** Whether the visited signature contains formal type parameters. */
+ private boolean hasFormals;
+
+ /** Whether the visited signature contains method parameter types. */
+ private boolean hasParameters;
+
+ /**
+ * The stack used to keep track of class types that have arguments. Each element of this stack is
+ * a boolean encoded in one bit. The top of the stack is the least significant bit. Pushing false
+ * = *2, pushing true = *2+1, popping = /2.
+ *
+ * <p>Class type arguments must be surrounded with '<' and '>' and, because
+ *
+ * <ol>
+ * <li>class types can be nested (because type arguments can themselves be class types),
+ * <li>SignatureWriter always returns 'this' in each visit* method (to avoid allocating new
+ * SignatureWriter instances),
+ * </ol>
+ *
+ * <p>we need a stack to properly balance these 'parentheses'. A new element is pushed on this
+ * stack for each new visited type, and popped when the visit of this type ends (either is
+ * visitEnd, or because visitInnerClassType is called).
+ */
+ private int argumentStack;
+
+ /** Constructs a new {@link SignatureWriter}. */
+ public SignatureWriter() {
+ super(Opcodes.ASM7);
+ }
+
+ // -----------------------------------------------------------------------------------------------
+ // Implementation of the SignatureVisitor interface
+ // -----------------------------------------------------------------------------------------------
+
+ @Override
+ public void visitFormalTypeParameter(final String name) {
+ if (!hasFormals) {
+ hasFormals = true;
+ stringBuilder.append('<');
+ }
+ stringBuilder.append(name);
+ stringBuilder.append(':');
+ }
+
+ @Override
+ public SignatureVisitor visitClassBound() {
+ return this;
+ }
+
+ @Override
+ public SignatureVisitor visitInterfaceBound() {
+ stringBuilder.append(':');
+ return this;
+ }
+
+ @Override
+ public SignatureVisitor visitSuperclass() {
+ endFormals();
+ return this;
+ }
+
+ @Override
+ public SignatureVisitor visitInterface() {
+ return this;
+ }
+
+ @Override
+ public SignatureVisitor visitParameterType() {
+ endFormals();
+ if (!hasParameters) {
+ hasParameters = true;
+ stringBuilder.append('(');
+ }
+ return this;
+ }
+
+ @Override
+ public SignatureVisitor visitReturnType() {
+ endFormals();
+ if (!hasParameters) {
+ stringBuilder.append('(');
+ }
+ stringBuilder.append(')');
+ return this;
+ }
+
+ @Override
+ public SignatureVisitor visitExceptionType() {
+ stringBuilder.append('^');
+ return this;
+ }
+
+ @Override
+ public void visitBaseType(final char descriptor) {
+ stringBuilder.append(descriptor);
+ }
+
+ @Override
+ public void visitTypeVariable(final String name) {
+ stringBuilder.append('T');
+ stringBuilder.append(name);
+ stringBuilder.append(';');
+ }
+
+ @Override
+ public SignatureVisitor visitArrayType() {
+ stringBuilder.append('[');
+ return this;
+ }
+
+ @Override
+ public void visitClassType(final String name) {
+ stringBuilder.append('L');
+ stringBuilder.append(name);
+ // Pushes 'false' on the stack, meaning that this type does not have type arguments (as far as
+ // we can tell at this point).
+ argumentStack *= 2;
+ }
+
+ @Override
+ public void visitInnerClassType(final String name) {
+ endArguments();
+ stringBuilder.append('.');
+ stringBuilder.append(name);
+ // Pushes 'false' on the stack, meaning that this type does not have type arguments (as far as
+ // we can tell at this point).
+ argumentStack *= 2;
+ }
+
+ @Override
+ public void visitTypeArgument() {
+ // If the top of the stack is 'false', this means we are visiting the first type argument of the
+ // currently visited type. We therefore need to append a '<', and to replace the top stack
+ // element with 'true' (meaning that the current type does have type arguments).
+ if (argumentStack % 2 == 0) {
+ argumentStack |= 1;
+ stringBuilder.append('<');
+ }
+ stringBuilder.append('*');
+ }
+
+ @Override
+ public SignatureVisitor visitTypeArgument(final char wildcard) {
+ // If the top of the stack is 'false', this means we are visiting the first type argument of the
+ // currently visited type. We therefore need to append a '<', and to replace the top stack
+ // element with 'true' (meaning that the current type does have type arguments).
+ if (argumentStack % 2 == 0) {
+ argumentStack |= 1;
+ stringBuilder.append('<');
+ }
+ if (wildcard != '=') {
+ stringBuilder.append(wildcard);
+ }
+ return this;
+ }
+
+ @Override
+ public void visitEnd() {
+ endArguments();
+ stringBuilder.append(';');
+ }
+
+ /**
+ * Returns the signature that was built by this signature writer.
+ *
+ * @return the signature that was built by this signature writer.
+ */
+ @Override
+ public String toString() {
+ return stringBuilder.toString();
+ }
+
+ // -----------------------------------------------------------------------------------------------
+ // Utility methods
+ // -----------------------------------------------------------------------------------------------
+
+ /** Ends the formal type parameters section of the signature. */
+ private void endFormals() {
+ if (hasFormals) {
+ hasFormals = false;
+ stringBuilder.append('>');
+ }
+ }
+
+ /** Ends the type arguments of a class or inner class type. */
+ private void endArguments() {
+ // If the top of the stack is 'true', this means that some type arguments have been visited for
+ // the type whose visit is now ending. We therefore need to append a '>', and to pop one element
+ // from the stack.
+ if (argumentStack % 2 == 1) {
+ stringBuilder.append('>');
+ }
+ argumentStack /= 2;
+ }
+}
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/1c71aec7/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/signature/package.html
----------------------------------------------------------------------
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/signature/package.html b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/signature/package.html
old mode 100644
new mode 100755
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/1c71aec7/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/AbstractInsnNode.java
----------------------------------------------------------------------
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/AbstractInsnNode.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/AbstractInsnNode.java
old mode 100644
new mode 100755
index a6a01d6..9005565
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/AbstractInsnNode.java
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/AbstractInsnNode.java
@@ -1,326 +1,265 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
+// ASM: a very small and fast Java bytecode manipulation framework
+// Copyright (c) 2000-2011 INRIA, France Telecom
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the copyright holders nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+// THE POSSIBILITY OF SUCH DAMAGE.
package org.apache.tapestry5.internal.plastic.asm.tree;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
-
import org.apache.tapestry5.internal.plastic.asm.MethodVisitor;
/**
- * A node that represents a bytecode instruction. <i>An instruction can appear
- * at most once in at most one {@link InsnList} at a time</i>.
- *
+ * A node that represents a bytecode instruction. <i>An instruction can appear at most once in at
+ * most one {@link InsnList} at a time</i>.
+ *
* @author Eric Bruneton
*/
public abstract class AbstractInsnNode {
- /**
- * The type of {@link InsnNode} instructions.
- */
- public static final int INSN = 0;
-
- /**
- * The type of {@link IntInsnNode} instructions.
- */
- public static final int INT_INSN = 1;
-
- /**
- * The type of {@link VarInsnNode} instructions.
- */
- public static final int VAR_INSN = 2;
-
- /**
- * The type of {@link TypeInsnNode} instructions.
- */
- public static final int TYPE_INSN = 3;
-
- /**
- * The type of {@link FieldInsnNode} instructions.
- */
- public static final int FIELD_INSN = 4;
-
- /**
- * The type of {@link MethodInsnNode} instructions.
- */
- public static final int METHOD_INSN = 5;
-
- /**
- * The type of {@link InvokeDynamicInsnNode} instructions.
- */
- public static final int INVOKE_DYNAMIC_INSN = 6;
-
- /**
- * The type of {@link JumpInsnNode} instructions.
- */
- public static final int JUMP_INSN = 7;
-
- /**
- * The type of {@link LabelNode} "instructions".
- */
- public static final int LABEL = 8;
-
- /**
- * The type of {@link LdcInsnNode} instructions.
- */
- public static final int LDC_INSN = 9;
-
- /**
- * The type of {@link IincInsnNode} instructions.
- */
- public static final int IINC_INSN = 10;
-
- /**
- * The type of {@link TableSwitchInsnNode} instructions.
- */
- public static final int TABLESWITCH_INSN = 11;
-
- /**
- * The type of {@link LookupSwitchInsnNode} instructions.
- */
- public static final int LOOKUPSWITCH_INSN = 12;
-
- /**
- * The type of {@link MultiANewArrayInsnNode} instructions.
- */
- public static final int MULTIANEWARRAY_INSN = 13;
-
- /**
- * The type of {@link FrameNode} "instructions".
- */
- public static final int FRAME = 14;
-
- /**
- * The type of {@link LineNumberNode} "instructions".
- */
- public static final int LINE = 15;
-
- /**
- * The opcode of this instruction.
- */
- protected int opcode;
-
- /**
- * The runtime visible type annotations of this instruction. This field is
- * only used for real instructions (i.e. not for labels, frames, or line
- * number nodes). This list is a list of {@link TypeAnnotationNode} objects.
- * May be <tt>null</tt>.
- *
- * @associates org.objectweb.asm.tree.TypeAnnotationNode
- * @label visible
- */
- public List<TypeAnnotationNode> visibleTypeAnnotations;
-
- /**
- * The runtime invisible type annotations of this instruction. This field is
- * only used for real instructions (i.e. not for labels, frames, or line
- * number nodes). This list is a list of {@link TypeAnnotationNode} objects.
- * May be <tt>null</tt>.
- *
- * @associates org.objectweb.asm.tree.TypeAnnotationNode
- * @label invisible
- */
- public List<TypeAnnotationNode> invisibleTypeAnnotations;
-
- /**
- * Previous instruction in the list to which this instruction belongs.
- */
- AbstractInsnNode prev;
-
- /**
- * Next instruction in the list to which this instruction belongs.
- */
- AbstractInsnNode next;
-
- /**
- * Index of this instruction in the list to which it belongs. The value of
- * this field is correct only when {@link InsnList#cache} is not null. A
- * value of -1 indicates that this instruction does not belong to any
- * {@link InsnList}.
- */
- int index;
-
- /**
- * Constructs a new {@link AbstractInsnNode}.
- *
- * @param opcode
- * the opcode of the instruction to be constructed.
- */
- protected AbstractInsnNode(final int opcode) {
- this.opcode = opcode;
- this.index = -1;
- }
-
- /**
- * Returns the opcode of this instruction.
- *
- * @return the opcode of this instruction.
- */
- public int getOpcode() {
- return opcode;
- }
+ /** The type of {@link InsnNode} instructions. */
+ public static final int INSN = 0;
+
+ /** The type of {@link IntInsnNode} instructions. */
+ public static final int INT_INSN = 1;
- /**
- * Returns the type of this instruction.
- *
- * @return the type of this instruction, i.e. one the constants defined in
- * this class.
- */
- public abstract int getType();
-
- /**
- * Returns the previous instruction in the list to which this instruction
- * belongs, if any.
- *
- * @return the previous instruction in the list to which this instruction
- * belongs, if any. May be <tt>null</tt>.
- */
- public AbstractInsnNode getPrevious() {
- return prev;
+ /** The type of {@link VarInsnNode} instructions. */
+ public static final int VAR_INSN = 2;
+
+ /** The type of {@link TypeInsnNode} instructions. */
+ public static final int TYPE_INSN = 3;
+
+ /** The type of {@link FieldInsnNode} instructions. */
+ public static final int FIELD_INSN = 4;
+
+ /** The type of {@link MethodInsnNode} instructions. */
+ public static final int METHOD_INSN = 5;
+
+ /** The type of {@link InvokeDynamicInsnNode} instructions. */
+ public static final int INVOKE_DYNAMIC_INSN = 6;
+
+ /** The type of {@link JumpInsnNode} instructions. */
+ public static final int JUMP_INSN = 7;
+
+ /** The type of {@link LabelNode} "instructions". */
+ public static final int LABEL = 8;
+
+ /** The type of {@link LdcInsnNode} instructions. */
+ public static final int LDC_INSN = 9;
+
+ /** The type of {@link IincInsnNode} instructions. */
+ public static final int IINC_INSN = 10;
+
+ /** The type of {@link TableSwitchInsnNode} instructions. */
+ public static final int TABLESWITCH_INSN = 11;
+
+ /** The type of {@link LookupSwitchInsnNode} instructions. */
+ public static final int LOOKUPSWITCH_INSN = 12;
+
+ /** The type of {@link MultiANewArrayInsnNode} instructions. */
+ public static final int MULTIANEWARRAY_INSN = 13;
+
+ /** The type of {@link FrameNode} "instructions". */
+ public static final int FRAME = 14;
+
+ /** The type of {@link LineNumberNode} "instructions". */
+ public static final int LINE = 15;
+
+ /** The opcode of this instruction. */
+ protected int opcode;
+
+ /**
+ * The runtime visible type annotations of this instruction. This field is only used for real
+ * instructions (i.e. not for labels, frames, or line number nodes). This list is a list of {@link
+ * TypeAnnotationNode} objects. May be {@literal null}.
+ */
+ public List<TypeAnnotationNode> visibleTypeAnnotations;
+
+ /**
+ * The runtime invisible type annotations of this instruction. This field is only used for real
+ * instructions (i.e. not for labels, frames, or line number nodes). This list is a list of {@link
+ * TypeAnnotationNode} objects. May be {@literal null}.
+ */
+ public List<TypeAnnotationNode> invisibleTypeAnnotations;
+
+ /** The previous instruction in the list to which this instruction belongs. */
+ AbstractInsnNode previousInsn;
+
+ /** The next instruction in the list to which this instruction belongs. */
+ AbstractInsnNode nextInsn;
+
+ /**
+ * The index of this instruction in the list to which it belongs. The value of this field is
+ * correct only when {@link InsnList#cache} is not null. A value of -1 indicates that this
+ * instruction does not belong to any {@link InsnList}.
+ */
+ int index;
+
+ /**
+ * Constructs a new {@link AbstractInsnNode}.
+ *
+ * @param opcode the opcode of the instruction to be constructed.
+ */
+ protected AbstractInsnNode(final int opcode) {
+ this.opcode = opcode;
+ this.index = -1;
+ }
+
+ /**
+ * Returns the opcode of this instruction.
+ *
+ * @return the opcode of this instruction.
+ */
+ public int getOpcode() {
+ return opcode;
+ }
+
+ /**
+ * Returns the type of this instruction.
+ *
+ * @return the type of this instruction, i.e. one the constants defined in this class.
+ */
+ public abstract int getType();
+
+ /**
+ * Returns the previous instruction in the list to which this instruction belongs, if any.
+ *
+ * @return the previous instruction in the list to which this instruction belongs, if any. May be
+ * {@literal null}.
+ */
+ public AbstractInsnNode getPrevious() {
+ return previousInsn;
+ }
+
+ /**
+ * Returns the next instruction in the list to which this instruction belongs, if any.
+ *
+ * @return the next instruction in the list to which this instruction belongs, if any. May be
+ * {@literal null}.
+ */
+ public AbstractInsnNode getNext() {
+ return nextInsn;
+ }
+
+ /**
+ * Makes the given method visitor visit this instruction.
+ *
+ * @param methodVisitor a method visitor.
+ */
+ public abstract void accept(MethodVisitor methodVisitor);
+
+ /**
+ * Makes the given visitor visit the annotations of this instruction.
+ *
+ * @param methodVisitor a method visitor.
+ */
+ protected final void acceptAnnotations(final MethodVisitor methodVisitor) {
+ if (visibleTypeAnnotations != null) {
+ for (int i = 0, n = visibleTypeAnnotations.size(); i < n; ++i) {
+ TypeAnnotationNode typeAnnotation = visibleTypeAnnotations.get(i);
+ typeAnnotation.accept(
+ methodVisitor.visitInsnAnnotation(
+ typeAnnotation.typeRef, typeAnnotation.typePath, typeAnnotation.desc, true));
+ }
}
-
- /**
- * Returns the next instruction in the list to which this instruction
- * belongs, if any.
- *
- * @return the next instruction in the list to which this instruction
- * belongs, if any. May be <tt>null</tt>.
- */
- public AbstractInsnNode getNext() {
- return next;
+ if (invisibleTypeAnnotations != null) {
+ for (int i = 0, n = invisibleTypeAnnotations.size(); i < n; ++i) {
+ TypeAnnotationNode typeAnnotation = invisibleTypeAnnotations.get(i);
+ typeAnnotation.accept(
+ methodVisitor.visitInsnAnnotation(
+ typeAnnotation.typeRef, typeAnnotation.typePath, typeAnnotation.desc, false));
+ }
}
-
- /**
- * Makes the given code visitor visit this instruction.
- *
- * @param cv
- * a code visitor.
- */
- public abstract void accept(final MethodVisitor cv);
-
- /**
- * Makes the given visitor visit the annotations of this instruction.
- *
- * @param mv
- * a method visitor.
- */
- protected final void acceptAnnotations(final MethodVisitor mv) {
- int n = visibleTypeAnnotations == null ? 0 : visibleTypeAnnotations
- .size();
- for (int i = 0; i < n; ++i) {
- TypeAnnotationNode an = visibleTypeAnnotations.get(i);
- an.accept(mv.visitInsnAnnotation(an.typeRef, an.typePath, an.desc,
- true));
- }
- n = invisibleTypeAnnotations == null ? 0 : invisibleTypeAnnotations
- .size();
- for (int i = 0; i < n; ++i) {
- TypeAnnotationNode an = invisibleTypeAnnotations.get(i);
- an.accept(mv.visitInsnAnnotation(an.typeRef, an.typePath, an.desc,
- false));
- }
+ }
+
+ /**
+ * Returns a copy of this instruction.
+ *
+ * @param clonedLabels a map from LabelNodes to cloned LabelNodes.
+ * @return a copy of this instruction. The returned instruction does not belong to any {@link
+ * InsnList}.
+ */
+ public abstract AbstractInsnNode clone(Map<LabelNode, LabelNode> clonedLabels);
+
+ /**
+ * Returns the clone of the given label.
+ *
+ * @param label a label.
+ * @param clonedLabels a map from LabelNodes to cloned LabelNodes.
+ * @return the clone of the given label.
+ */
+ static LabelNode clone(final LabelNode label, final Map<LabelNode, LabelNode> clonedLabels) {
+ return clonedLabels.get(label);
+ }
+
+ /**
+ * Returns the clones of the given labels.
+ *
+ * @param labels a list of labels.
+ * @param clonedLabels a map from LabelNodes to cloned LabelNodes.
+ * @return the clones of the given labels.
+ */
+ static LabelNode[] clone(
+ final List<LabelNode> labels, final Map<LabelNode, LabelNode> clonedLabels) {
+ LabelNode[] clones = new LabelNode[labels.size()];
+ for (int i = 0, n = clones.length; i < n; ++i) {
+ clones[i] = clonedLabels.get(labels.get(i));
}
-
- /**
- * Returns a copy of this instruction.
- *
- * @param labels
- * a map from LabelNodes to cloned LabelNodes.
- * @return a copy of this instruction. The returned instruction does not
- * belong to any {@link InsnList}.
- */
- public abstract AbstractInsnNode clone(
- final Map<LabelNode, LabelNode> labels);
-
- /**
- * Returns the clone of the given label.
- *
- * @param label
- * a label.
- * @param map
- * a map from LabelNodes to cloned LabelNodes.
- * @return the clone of the given label.
- */
- static LabelNode clone(final LabelNode label,
- final Map<LabelNode, LabelNode> map) {
- return map.get(label);
+ return clones;
+ }
+
+ /**
+ * Clones the annotations of the given instruction into this instruction.
+ *
+ * @param insnNode the source instruction.
+ * @return this instruction.
+ */
+ protected final AbstractInsnNode cloneAnnotations(final AbstractInsnNode insnNode) {
+ if (insnNode.visibleTypeAnnotations != null) {
+ this.visibleTypeAnnotations = new ArrayList<TypeAnnotationNode>();
+ for (int i = 0, n = insnNode.visibleTypeAnnotations.size(); i < n; ++i) {
+ TypeAnnotationNode sourceAnnotation = insnNode.visibleTypeAnnotations.get(i);
+ TypeAnnotationNode cloneAnnotation =
+ new TypeAnnotationNode(
+ sourceAnnotation.typeRef, sourceAnnotation.typePath, sourceAnnotation.desc);
+ sourceAnnotation.accept(cloneAnnotation);
+ this.visibleTypeAnnotations.add(cloneAnnotation);
+ }
}
-
- /**
- * Returns the clones of the given labels.
- *
- * @param labels
- * a list of labels.
- * @param map
- * a map from LabelNodes to cloned LabelNodes.
- * @return the clones of the given labels.
- */
- static LabelNode[] clone(final List<LabelNode> labels,
- final Map<LabelNode, LabelNode> map) {
- LabelNode[] clones = new LabelNode[labels.size()];
- for (int i = 0; i < clones.length; ++i) {
- clones[i] = map.get(labels.get(i));
- }
- return clones;
- }
-
- /**
- * Clones the annotations of the given instruction into this instruction.
- *
- * @param insn
- * the source instruction.
- * @return this instruction.
- */
- protected final AbstractInsnNode cloneAnnotations(
- final AbstractInsnNode insn) {
- if (insn.visibleTypeAnnotations != null) {
- this.visibleTypeAnnotations = new ArrayList<TypeAnnotationNode>();
- for (int i = 0; i < insn.visibleTypeAnnotations.size(); ++i) {
- TypeAnnotationNode src = insn.visibleTypeAnnotations.get(i);
- TypeAnnotationNode ann = new TypeAnnotationNode(src.typeRef,
- src.typePath, src.desc);
- src.accept(ann);
- this.visibleTypeAnnotations.add(ann);
- }
- }
- if (insn.invisibleTypeAnnotations != null) {
- this.invisibleTypeAnnotations = new ArrayList<TypeAnnotationNode>();
- for (int i = 0; i < insn.invisibleTypeAnnotations.size(); ++i) {
- TypeAnnotationNode src = insn.invisibleTypeAnnotations.get(i);
- TypeAnnotationNode ann = new TypeAnnotationNode(src.typeRef,
- src.typePath, src.desc);
- src.accept(ann);
- this.invisibleTypeAnnotations.add(ann);
- }
- }
- return this;
+ if (insnNode.invisibleTypeAnnotations != null) {
+ this.invisibleTypeAnnotations = new ArrayList<TypeAnnotationNode>();
+ for (int i = 0, n = insnNode.invisibleTypeAnnotations.size(); i < n; ++i) {
+ TypeAnnotationNode sourceAnnotation = insnNode.invisibleTypeAnnotations.get(i);
+ TypeAnnotationNode cloneAnnotation =
+ new TypeAnnotationNode(
+ sourceAnnotation.typeRef, sourceAnnotation.typePath, sourceAnnotation.desc);
+ sourceAnnotation.accept(cloneAnnotation);
+ this.invisibleTypeAnnotations.add(cloneAnnotation);
+ }
}
+ return this;
+ }
}