/* * 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; } }