/* * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package sun.invoke.anon; /** * A visitor called by {@link ConstantPoolParser#parse(ConstantPoolVisitor)} * when a constant pool entry is parsed. * <p> * A visit* method is called when a constant pool entry is parsed. * The first argument is always the constant pool index. * The second argument is always the constant pool tag, * even for methods like {@link #visitUTF8(int, byte, String)} which only apply to one tag. * String arguments refer to Utf8 or NameAndType entries declared elsewhere, * and are always accompanied by the indexes of those entries. * <p> * The order of the calls to the visit* methods is not necessarily related * to the order of the entries in the constant pool. * If one entry has a reference to another entry, the latter (lower-level) * entry will be visited first. * <p> * The following table shows the relation between constant pool entry * types and the corresponding visit* methods: * * <table border=1 cellpadding=5 summary="constant pool visitor methods"> * <tr><th>Tag(s)</th><th>Method</th></tr> * <tr> * <td>{@link #CONSTANT_Utf8}</td> * <td>{@link #visitUTF8(int, byte, String)}</td> * </tr><tr> * <td>{@link #CONSTANT_Integer}, {@link #CONSTANT_Float}, * {@link #CONSTANT_Long}, {@link #CONSTANT_Double}</td> * <td>{@link #visitConstantValue(int, byte, Object)}</td> * </tr><tr> * <td>{@link #CONSTANT_String}, {@link #CONSTANT_Class}</td> * <td>{@link #visitConstantString(int, byte, String, int)}</td> * </tr><tr> * <td>{@link #CONSTANT_NameAndType}</td> * <td>{@link #visitDescriptor(int, byte, String, String, int, int)}</td> * </tr><tr> * <td>{@link #CONSTANT_Fieldref}, * {@link #CONSTANT_Methodref}, * {@link #CONSTANT_InterfaceMethodref}</td> * <td>{@link #visitMemberRef(int, byte, String, String, String, int, int)}</td> * </tr> * </table> * * @see ConstantPoolPatch * @author Remi Forax * @author jrose */public class ConstantPoolVisitor { /** Called each time an UTF8 constant pool entry is found. * @param index the constant pool index * @param tag always {@link #CONSTANT_Utf8} * @param utf8 string encoded in modified UTF-8 format passed as a {@code String} * * @see ConstantPoolPatch#putUTF8(int, String) */ public void visitUTF8(int index, byte tag, String utf8) { // do nothing } /** Called for each constant pool entry that encodes an integer, * a float, a long, or a double. * Constant strings and classes are not managed by this method but * by {@link #visitConstantString(int, byte, String, int)}. * * @param index the constant pool index * @param tag one of {@link #CONSTANT_Integer}, * {@link #CONSTANT_Float}, * {@link #CONSTANT_Long}, * or {@link #CONSTANT_Double} * @param value encoded value * * @see ConstantPoolPatch#putConstantValue(int, Object) */ public void visitConstantValue(int index, byte tag, Object value) { // do nothing } /** Called for each constant pool entry that encodes a string or a class. * @param index the constant pool index * @param tag one of {@link #CONSTANT_String}, * {@link #CONSTANT_Class}, * @param name string body or class name (using dot separator) * @param nameIndex the index of the Utf8 string for the name * * @see ConstantPoolPatch#putConstantValue(int, byte, Object) */ public void visitConstantString(int index, byte tag, String name, int nameIndex) { // do nothing } /** Called for each constant pool entry that encodes a name and type. * @param index the constant pool index * @param tag always {@link #CONSTANT_NameAndType} * @param memberName a field or method name * @param signature the member signature * @param memberNameIndex index of the Utf8 string for the member name * @param signatureIndex index of the Utf8 string for the signature * * @see ConstantPoolPatch#putDescriptor(int, String, String) */ public void visitDescriptor(int index, byte tag, String memberName, String signature, int memberNameIndex, int signatureIndex) { // do nothing } /** Called for each constant pool entry that encodes a field or method. * @param index the constant pool index * @param tag one of {@link #CONSTANT_Fieldref}, * or {@link #CONSTANT_Methodref}, * or {@link #CONSTANT_InterfaceMethodref} * @param className the class name (using dot separator) * @param memberName name of the field or method * @param signature the field or method signature * @param classNameIndex index of the Utf8 string for the class name * @param descriptorIndex index of the NameAndType descriptor constant * * @see ConstantPoolPatch#putMemberRef(int, byte, String, String, String) */ public void visitMemberRef(int index, byte tag, String className, String memberName, String signature, int classNameIndex, int descriptorIndex) { // do nothing } public static final byte CONSTANT_None = 0, CONSTANT_Utf8 = 1, //CONSTANT_Unicode = 2, /* unused */ CONSTANT_Integer = 3, CONSTANT_Float = 4, CONSTANT_Long = 5, CONSTANT_Double = 6, CONSTANT_Class = 7, CONSTANT_String = 8, CONSTANT_Fieldref = 9, CONSTANT_Methodref = 10, CONSTANT_InterfaceMethodref = 11, CONSTANT_NameAndType = 12; private static String[] TAG_NAMES = { "Empty", "Utf8", null, //"Unicode", "Integer", "Float", "Long", "Double", "Class", "String", "Fieldref", "Methodref", "InterfaceMethodref", "NameAndType" }; public static String tagName(byte tag) { String name = null; if ((tag & 0xFF) < TAG_NAMES.length) name = TAG_NAMES[tag]; if (name == null) name = "Unknown#"+(tag&0xFF); return name; }}
/*
* Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package sun.invoke.anon;
/**
* A visitor called by {@link ConstantPoolParser#parse(ConstantPoolVisitor)}
* when a constant pool entry is parsed.
* <p>
* A visit* method is called when a constant pool entry is parsed.
* The first argument is always the constant pool index.
* The second argument is always the constant pool tag,
* even for methods like {@link #visitUTF8(int, byte, String)} which only apply to one tag.
* String arguments refer to Utf8 or NameAndType entries declared elsewhere,
* and are always accompanied by the indexes of those entries.
* <p>
* The order of the calls to the visit* methods is not necessarily related
* to the order of the entries in the constant pool.
* If one entry has a reference to another entry, the latter (lower-level)
* entry will be visited first.
* <p>
* The following table shows the relation between constant pool entry
* types and the corresponding visit* methods:
*
* <table border=1 cellpadding=5 summary="constant pool visitor methods">
* <tr><th>Tag(s)</th><th>Method</th></tr>
* <tr>
* <td>{@link #CONSTANT_Utf8}</td>
* <td>{@link #visitUTF8(int, byte, String)}</td>
* </tr><tr>
* <td>{@link #CONSTANT_Integer}, {@link #CONSTANT_Float},
* {@link #CONSTANT_Long}, {@link #CONSTANT_Double}</td>
* <td>{@link #visitConstantValue(int, byte, Object)}</td>
* </tr><tr>
* <td>{@link #CONSTANT_String}, {@link #CONSTANT_Class}</td>
* <td>{@link #visitConstantString(int, byte, String, int)}</td>
* </tr><tr>
* <td>{@link #CONSTANT_NameAndType}</td>
* <td>{@link #visitDescriptor(int, byte, String, String, int, int)}</td>
* </tr><tr>
* <td>{@link #CONSTANT_Fieldref},
* {@link #CONSTANT_Methodref},
* {@link #CONSTANT_InterfaceMethodref}</td>
* <td>{@link #visitMemberRef(int, byte, String, String, String, int, int)}</td>
* </tr>
* </table>
*
* @see ConstantPoolPatch
* @author Remi Forax
* @author jrose
*/
public class ConstantPoolVisitor {
/** Called each time an UTF8 constant pool entry is found.
* @param index the constant pool index
* @param tag always {@link #CONSTANT_Utf8}
* @param utf8 string encoded in modified UTF-8 format passed as a {@code String}
*
* @see ConstantPoolPatch#putUTF8(int, String)
*/
public void visitUTF8(int index, byte tag, String utf8) {
// do nothing
}
/** Called for each constant pool entry that encodes an integer,
* a float, a long, or a double.
* Constant strings and classes are not managed by this method but
* by {@link #visitConstantString(int, byte, String, int)}.
*
* @param index the constant pool index
* @param tag one of {@link #CONSTANT_Integer},
* {@link #CONSTANT_Float},
* {@link #CONSTANT_Long},
* or {@link #CONSTANT_Double}
* @param value encoded value
*
* @see ConstantPoolPatch#putConstantValue(int, Object)
*/
public void visitConstantValue(int index, byte tag, Object value) {
// do nothing
}
/** Called for each constant pool entry that encodes a string or a class.
* @param index the constant pool index
* @param tag one of {@link #CONSTANT_String},
* {@link #CONSTANT_Class},
* @param name string body or class name (using dot separator)
* @param nameIndex the index of the Utf8 string for the name
*
* @see ConstantPoolPatch#putConstantValue(int, byte, Object)
*/
public void visitConstantString(int index, byte tag,
String name, int nameIndex) {
// do nothing
}
/** Called for each constant pool entry that encodes a name and type.
* @param index the constant pool index
* @param tag always {@link #CONSTANT_NameAndType}
* @param memberName a field or method name
* @param signature the member signature
* @param memberNameIndex index of the Utf8 string for the member name
* @param signatureIndex index of the Utf8 string for the signature
*
* @see ConstantPoolPatch#putDescriptor(int, String, String)
*/
public void visitDescriptor(int index, byte tag,
String memberName, String signature,
int memberNameIndex, int signatureIndex) {
// do nothing
}
/** Called for each constant pool entry that encodes a field or method.
* @param index the constant pool index
* @param tag one of {@link #CONSTANT_Fieldref},
* or {@link #CONSTANT_Methodref},
* or {@link #CONSTANT_InterfaceMethodref}
* @param className the class name (using dot separator)
* @param memberName name of the field or method
* @param signature the field or method signature
* @param classNameIndex index of the Utf8 string for the class name
* @param descriptorIndex index of the NameAndType descriptor constant
*
* @see ConstantPoolPatch#putMemberRef(int, byte, String, String, String)
*/
public void visitMemberRef(int index, byte tag,
String className, String memberName, String signature,
int classNameIndex, int descriptorIndex) {
// do nothing
}
public static final byte
CONSTANT_None = 0,
CONSTANT_Utf8 = 1,
//CONSTANT_Unicode = 2, /* unused */
CONSTANT_Integer = 3,
CONSTANT_Float = 4,
CONSTANT_Long = 5,
CONSTANT_Double = 6,
CONSTANT_Class = 7,
CONSTANT_String = 8,
CONSTANT_Fieldref = 9,
CONSTANT_Methodref = 10,
CONSTANT_InterfaceMethodref = 11,
CONSTANT_NameAndType = 12;
private static String[] TAG_NAMES = {
"Empty",
"Utf8",
null, //"Unicode",
"Integer",
"Float",
"Long",
"Double",
"Class",
"String",
"Fieldref",
"Methodref",
"InterfaceMethodref",
"NameAndType"
};
public static String tagName(byte tag) {
String name = null;
if ((tag & 0xFF) < TAG_NAMES.length)
name = TAG_NAMES[tag];
if (name == null)
name = "Unknown#"+(tag&0xFF);
return name;
}
}