169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal/*
269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Javassist, a Java-bytecode translator toolkit.
369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Copyright (C) 1999-2007 Shigeru Chiba. All Rights Reserved.
469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal *
569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * The contents of this file are subject to the Mozilla Public License Version
669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * 1.1 (the "License"); you may not use this file except in compliance with
769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * the License.  Alternatively, the contents of this file may be used under
869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * the terms of the GNU Lesser General Public License Version 2.1 or later.
969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal *
1069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Software distributed under the License is distributed on an "AS IS" basis,
1169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
1269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * for the specific language governing rights and limitations under the
1369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * License.
1469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */
1569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
1669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalpackage javassist.bytecode;
1769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
1869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.io.DataInputStream;
1969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.io.DataOutputStream;
2069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.io.ByteArrayOutputStream;
2169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.io.PrintWriter;
2269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.io.IOException;
2369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.util.HashMap;
2469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.util.HashSet;
2569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.util.Map;
2669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.util.Set;
2769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
2869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.CtClass;
2969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
3069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal/**
3169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Constant pool table.
3269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */
3369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalpublic final class ConstPool {
3469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    LongVector items;
3569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    int numOfItems;
3669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    HashMap classes;
3769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    HashMap strings;
3869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    ConstInfo[] constInfoCache;
3969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    int[] constInfoIndexCache;
4069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    int thisClassInfo;
4169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
4269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    private static final int CACHE_SIZE = 32;
4369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
4469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
4569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * A hash function for CACHE_SIZE
4669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
4769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    private static int hashFunc(int a, int b) {
4869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        int h = -2128831035;
4969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        final int prime = 16777619;
5069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        h = (h ^ (a & 0xff)) * prime;
5169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        h = (h ^ (b & 0xff)) * prime;
5269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
5369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        // changing the hash key size from 32bit to 5bit
5469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        h = (h >> 5) ^ (h & 0x1f);
5569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return h & 0x1f;    // 0..31
5669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
5769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
5869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
5969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_Class</code>
6069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
6169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public static final int CONST_Class = ClassInfo.tag;
6269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
6369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
6469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_Fieldref</code>
6569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
6669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public static final int CONST_Fieldref = FieldrefInfo.tag;
6769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
6869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
6969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_Methodref</code>
7069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
7169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public static final int CONST_Methodref = MethodrefInfo.tag;
7269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
7369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
7469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_InterfaceMethodref</code>
7569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
7669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public static final int CONST_InterfaceMethodref
7769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                                        = InterfaceMethodrefInfo.tag;
7869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
7969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
8069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_String</code>
8169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
8269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public static final int CONST_String = StringInfo.tag;
8369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
8469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
8569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_Integer</code>
8669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
8769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public static final int CONST_Integer = IntegerInfo.tag;
8869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
8969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
9069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_Float</code>
9169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
9269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public static final int CONST_Float = FloatInfo.tag;
9369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
9469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
9569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_Long</code>
9669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
9769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public static final int CONST_Long = LongInfo.tag;
9869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
9969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
10069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_Double</code>
10169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
10269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public static final int CONST_Double = DoubleInfo.tag;
10369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
10469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
10569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_NameAndType</code>
10669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
10769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public static final int CONST_NameAndType = NameAndTypeInfo.tag;
10869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
10969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
11069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_Utf8</code>
11169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
11269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public static final int CONST_Utf8 = Utf8Info.tag;
11369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
11469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
11569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Represents the class using this constant pool table.
11669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
11769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public static final CtClass THIS = null;
11869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
11969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
12069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Constructs a constant pool table.
12169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
12269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param thisclass         the name of the class using this constant
12369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *                          pool table
12469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
12569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public ConstPool(String thisclass) {
12669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        items = new LongVector();
12769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        numOfItems = 0;
12869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        addItem(null);          // index 0 is reserved by the JVM.
12969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        classes = new HashMap();
13069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        strings = new HashMap();
13169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        constInfoCache = new ConstInfo[CACHE_SIZE];
13269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        constInfoIndexCache = new int[CACHE_SIZE];
13369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        thisClassInfo = addClassInfo(thisclass);
13469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
13569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
13669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
13769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Constructs a constant pool table from the given byte stream.
13869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
13969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param in        byte stream.
14069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
14169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public ConstPool(DataInputStream in) throws IOException {
14269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        classes = new HashMap();
14369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        strings = new HashMap();
14469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        constInfoCache = new ConstInfo[CACHE_SIZE];
14569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        constInfoIndexCache = new int[CACHE_SIZE];
14669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        thisClassInfo = 0;
14769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        /* read() initializes items and numOfItems, and do addItem(null).
14869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal         */
14969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        read(in);
15069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
15169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
15269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    void prune() {
15369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        classes = new HashMap();
15469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        strings = new HashMap();
15569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        constInfoCache = new ConstInfo[CACHE_SIZE];
15669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        constInfoIndexCache = new int[CACHE_SIZE];
15769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
15869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
15969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
16069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Returns the number of entries in this table.
16169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
16269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int getSize() {
16369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return numOfItems;
16469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
16569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
16669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
16769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Returns the name of the class using this constant pool table.
16869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
16969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public String getClassName() {
17069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return getClassInfo(thisClassInfo);
17169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
17269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
17369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
17469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Returns the index of <code>CONSTANT_Class_info</code> structure
17569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * specifying the class using this constant pool table.
17669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
17769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int getThisClassInfo() {
17869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return thisClassInfo;
17969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
18069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
18169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    void setThisClassInfo(int i) {
18269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        thisClassInfo = i;
18369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
18469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
18569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    ConstInfo getItem(int n) {
18669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return items.elementAt(n);
18769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
18869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
18969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
19069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Returns the <code>tag</code> field of the constant pool table
19169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * entry at the given index.
19269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
19369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int getTag(int index) {
19469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return getItem(index).getTag();
19569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
19669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
19769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
19869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Reads <code>CONSTANT_Class_info</code> structure
19969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * at the given index.
20069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
20169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return  a fully-qualified class or interface name specified
20269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *          by <code>name_index</code>.  If the type is an array
20369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *          type, this method returns an encoded name like
20469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *          <code>[java.lang.Object;</code> (note that the separators
20569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *          are not slashes but dots).
20669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @see javassist.ClassPool#getCtClass(String)
20769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
20869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public String getClassInfo(int index) {
20969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        ClassInfo c = (ClassInfo)getItem(index);
21069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (c == null)
21169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return null;
21269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else
21369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return Descriptor.toJavaName(getUtf8Info(c.name));
21469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
21569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
21669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
21769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Reads the <code>name_index</code> field of the
21869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_NameAndType_info</code> structure
21969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * at the given index.
22069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
22169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int getNameAndTypeName(int index) {
22269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        NameAndTypeInfo ntinfo = (NameAndTypeInfo)getItem(index);
22369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return ntinfo.memberName;
22469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
22569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
22669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
22769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Reads the <code>descriptor_index</code> field of the
22869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_NameAndType_info</code> structure
22969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * at the given index.
23069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
23169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int getNameAndTypeDescriptor(int index) {
23269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        NameAndTypeInfo ntinfo = (NameAndTypeInfo)getItem(index);
23369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return ntinfo.typeDescriptor;
23469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
23569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
23669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
23769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Reads the <code>class_index</code> field of the
23869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_Fieldref_info</code>,
23969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_Methodref_info</code>,
24069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * or <code>CONSTANT_Interfaceref_info</code>,
24169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * structure at the given index.
24269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
24369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @since 3.6
24469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
24569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int getMemberClass(int index) {
24669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        MemberrefInfo minfo = (MemberrefInfo)getItem(index);
24769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return minfo.classIndex;
24869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
24969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
25069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
25169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Reads the <code>name_and_type_index</code> field of the
25269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_Fieldref_info</code>,
25369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_Methodref_info</code>,
25469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * or <code>CONSTANT_Interfaceref_info</code>,
25569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * structure at the given index.
25669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
25769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @since 3.6
25869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
25969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int getMemberNameAndType(int index) {
26069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        MemberrefInfo minfo = (MemberrefInfo)getItem(index);
26169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return minfo.nameAndTypeIndex;
26269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
26369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
26469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
26569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Reads the <code>class_index</code> field of the
26669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_Fieldref_info</code> structure
26769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * at the given index.
26869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
26969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int getFieldrefClass(int index) {
27069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        FieldrefInfo finfo = (FieldrefInfo)getItem(index);
27169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return finfo.classIndex;
27269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
27369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
27469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
27569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Reads the <code>class_index</code> field of the
27669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_Fieldref_info</code> structure
27769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * at the given index.
27869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
27969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return the name of the class at that <code>class_index</code>.
28069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
28169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public String getFieldrefClassName(int index) {
28269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        FieldrefInfo f = (FieldrefInfo)getItem(index);
28369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (f == null)
28469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return null;
28569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else
28669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return getClassInfo(f.classIndex);
28769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
28869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
28969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
29069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Reads the <code>name_and_type_index</code> field of the
29169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_Fieldref_info</code> structure
29269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * at the given index.
29369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
29469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int getFieldrefNameAndType(int index) {
29569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        FieldrefInfo finfo = (FieldrefInfo)getItem(index);
29669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return finfo.nameAndTypeIndex;
29769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
29869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
29969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
30069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Reads the <code>name_index</code> field of the
30169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_NameAndType_info</code> structure
30269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * indirectly specified by the given index.
30369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
30469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param index     an index to a <code>CONSTANT_Fieldref_info</code>.
30569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return  the name of the field.
30669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
30769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public String getFieldrefName(int index) {
30869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        FieldrefInfo f = (FieldrefInfo)getItem(index);
30969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (f == null)
31069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return null;
31169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else {
31269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            NameAndTypeInfo n = (NameAndTypeInfo)getItem(f.nameAndTypeIndex);
31369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            if(n == null)
31469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                return null;
31569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            else
31669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                return getUtf8Info(n.memberName);
31769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
31869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
31969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
32069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
32169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Reads the <code>descriptor_index</code> field of the
32269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_NameAndType_info</code> structure
32369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * indirectly specified by the given index.
32469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
32569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param index     an index to a <code>CONSTANT_Fieldref_info</code>.
32669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return  the type descriptor of the field.
32769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
32869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public String getFieldrefType(int index) {
32969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        FieldrefInfo f = (FieldrefInfo)getItem(index);
33069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (f == null)
33169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return null;
33269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else {
33369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            NameAndTypeInfo n = (NameAndTypeInfo)getItem(f.nameAndTypeIndex);
33469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            if(n == null)
33569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                return null;
33669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            else
33769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                return getUtf8Info(n.typeDescriptor);
33869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
33969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
34069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
34169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
34269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Reads the <code>class_index</code> field of the
34369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_Methodref_info</code> structure
34469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * at the given index.
34569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
34669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int getMethodrefClass(int index) {
34769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        MethodrefInfo minfo = (MethodrefInfo)getItem(index);
34869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return minfo.classIndex;
34969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
35069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
35169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
35269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Reads the <code>class_index</code> field of the
35369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_Methodref_info</code> structure
35469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * at the given index.
35569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
35669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return the name of the class at that <code>class_index</code>.
35769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
35869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public String getMethodrefClassName(int index) {
35969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        MethodrefInfo minfo = (MethodrefInfo)getItem(index);
36069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (minfo == null)
36169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return null;
36269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else
36369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return getClassInfo(minfo.classIndex);
36469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
36569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
36669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
36769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Reads the <code>name_and_type_index</code> field of the
36869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_Methodref_info</code> structure
36969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * at the given index.
37069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
37169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int getMethodrefNameAndType(int index) {
37269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        MethodrefInfo minfo = (MethodrefInfo)getItem(index);
37369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return minfo.nameAndTypeIndex;
37469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
37569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
37669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
37769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Reads the <code>name_index</code> field of the
37869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_NameAndType_info</code> structure
37969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * indirectly specified by the given index.
38069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
38169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param index     an index to a <code>CONSTANT_Methodref_info</code>.
38269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return  the name of the method.
38369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
38469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public String getMethodrefName(int index) {
38569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        MethodrefInfo minfo = (MethodrefInfo)getItem(index);
38669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (minfo == null)
38769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return null;
38869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else {
38969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            NameAndTypeInfo n
39069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                = (NameAndTypeInfo)getItem(minfo.nameAndTypeIndex);
39169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            if(n == null)
39269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                return null;
39369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            else
39469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                return getUtf8Info(n.memberName);
39569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
39669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
39769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
39869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
39969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Reads the <code>descriptor_index</code> field of the
40069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_NameAndType_info</code> structure
40169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * indirectly specified by the given index.
40269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
40369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param index     an index to a <code>CONSTANT_Methodref_info</code>.
40469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return  the descriptor of the method.
40569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
40669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public String getMethodrefType(int index) {
40769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        MethodrefInfo minfo = (MethodrefInfo)getItem(index);
40869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (minfo == null)
40969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return null;
41069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else {
41169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            NameAndTypeInfo n
41269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                = (NameAndTypeInfo)getItem(minfo.nameAndTypeIndex);
41369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            if(n == null)
41469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                return null;
41569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            else
41669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                return getUtf8Info(n.typeDescriptor);
41769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
41869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
41969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
42069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
42169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Reads the <code>class_index</code> field of the
42269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_InterfaceMethodref_info</code> structure
42369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * at the given index.
42469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
42569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int getInterfaceMethodrefClass(int index) {
42669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        InterfaceMethodrefInfo minfo
42769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            = (InterfaceMethodrefInfo)getItem(index);
42869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return minfo.classIndex;
42969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
43069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
43169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
43269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Reads the <code>class_index</code> field of the
43369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_InterfaceMethodref_info</code> structure
43469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * at the given index.
43569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
43669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return the name of the class at that <code>class_index</code>.
43769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
43869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public String getInterfaceMethodrefClassName(int index) {
43969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        InterfaceMethodrefInfo minfo
44069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            = (InterfaceMethodrefInfo)getItem(index);
44169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return getClassInfo(minfo.classIndex);
44269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
44369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
44469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
44569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Reads the <code>name_and_type_index</code> field of the
44669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_InterfaceMethodref_info</code> structure
44769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * at the given index.
44869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
44969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int getInterfaceMethodrefNameAndType(int index) {
45069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        InterfaceMethodrefInfo minfo
45169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            = (InterfaceMethodrefInfo)getItem(index);
45269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return minfo.nameAndTypeIndex;
45369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
45469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
45569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
45669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Reads the <code>name_index</code> field of the
45769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_NameAndType_info</code> structure
45869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * indirectly specified by the given index.
45969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
46069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param index     an index to
46169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *                  a <code>CONSTANT_InterfaceMethodref_info</code>.
46269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return  the name of the method.
46369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
46469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public String getInterfaceMethodrefName(int index) {
46569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        InterfaceMethodrefInfo minfo
46669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            = (InterfaceMethodrefInfo)getItem(index);
46769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (minfo == null)
46869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return null;
46969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else {
47069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            NameAndTypeInfo n
47169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                = (NameAndTypeInfo)getItem(minfo.nameAndTypeIndex);
47269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            if(n == null)
47369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                return null;
47469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            else
47569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                return getUtf8Info(n.memberName);
47669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
47769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
47869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
47969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
48069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Reads the <code>descriptor_index</code> field of the
48169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_NameAndType_info</code> structure
48269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * indirectly specified by the given index.
48369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
48469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param index     an index to
48569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *                  a <code>CONSTANT_InterfaceMethodref_info</code>.
48669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return  the descriptor of the method.
48769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
48869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public String getInterfaceMethodrefType(int index) {
48969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        InterfaceMethodrefInfo minfo
49069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            = (InterfaceMethodrefInfo)getItem(index);
49169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (minfo == null)
49269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return null;
49369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else {
49469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            NameAndTypeInfo n
49569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                = (NameAndTypeInfo)getItem(minfo.nameAndTypeIndex);
49669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            if(n == null)
49769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                return null;
49869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            else
49969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                return getUtf8Info(n.typeDescriptor);
50069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
50169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
50269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
50369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Reads <code>CONSTANT_Integer_info</code>, <code>_Float_info</code>,
50469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>_Long_info</code>, <code>_Double_info</code>, or
50569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>_String_info</code> structure.
50669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * These are used with the LDC instruction.
50769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
50869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return a <code>String</code> value or a wrapped primitive-type
50969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * value.
51069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
51169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public Object getLdcValue(int index) {
51269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        ConstInfo constInfo = this.getItem(index);
51369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        Object value = null;
51469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (constInfo instanceof StringInfo)
51569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            value = this.getStringInfo(index);
51669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else if (constInfo instanceof FloatInfo)
51769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            value = new Float(getFloatInfo(index));
51869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else if (constInfo instanceof IntegerInfo)
51969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            value = new Integer(getIntegerInfo(index));
52069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else if (constInfo instanceof LongInfo)
52169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            value = new Long(getLongInfo(index));
52269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else if (constInfo instanceof DoubleInfo)
52369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            value = new Double(getDoubleInfo(index));
52469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else
52569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            value = null;
52669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
52769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return value;
52869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
52969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
53069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
53169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Reads <code>CONSTANT_Integer_info</code> structure
53269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * at the given index.
53369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
53469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return the value specified by this entry.
53569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
53669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int getIntegerInfo(int index) {
53769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        IntegerInfo i = (IntegerInfo)getItem(index);
53869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return i.value;
53969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
54069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
54169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
54269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Reads <code>CONSTANT_Float_info</code> structure
54369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * at the given index.
54469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
54569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return the value specified by this entry.
54669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
54769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public float getFloatInfo(int index) {
54869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        FloatInfo i = (FloatInfo)getItem(index);
54969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return i.value;
55069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
55169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
55269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
55369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Reads <code>CONSTANT_Long_info</code> structure
55469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * at the given index.
55569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
55669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return the value specified by this entry.
55769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
55869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public long getLongInfo(int index) {
55969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        LongInfo i = (LongInfo)getItem(index);
56069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return i.value;
56169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
56269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
56369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
56469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Reads <code>CONSTANT_Double_info</code> structure
56569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * at the given index.
56669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
56769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return the value specified by this entry.
56869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
56969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public double getDoubleInfo(int index) {
57069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        DoubleInfo i = (DoubleInfo)getItem(index);
57169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return i.value;
57269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
57369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
57469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
57569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Reads <code>CONSTANT_String_info</code> structure
57669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * at the given index.
57769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
57869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return the string specified by <code>string_index</code>.
57969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
58069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public String getStringInfo(int index) {
58169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        StringInfo si = (StringInfo)getItem(index);
58269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return getUtf8Info(si.string);
58369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
58469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
58569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
58669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Reads <code>CONSTANT_utf8_info</code> structure
58769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * at the given index.
58869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
58969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return the string specified by this entry.
59069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
59169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public String getUtf8Info(int index) {
59269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        Utf8Info utf = (Utf8Info)getItem(index);
59369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return utf.string;
59469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
59569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
59669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
59769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Determines whether <code>CONSTANT_Methodref_info</code>
59869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * structure at the given index represents the constructor
59969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * of the given class.
60069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
60169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return          the <code>descriptor_index</code> specifying
60269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *                  the type descriptor of the that constructor.
60369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *                  If it is not that constructor,
60469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *                  <code>isConstructor()</code> returns 0.
60569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
60669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int isConstructor(String classname, int index) {
60769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return isMember(classname, MethodInfo.nameInit, index);
60869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
60969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
61069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
61169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Determines whether <code>CONSTANT_Methodref_info</code>,
61269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_Fieldref_info</code>, or
61369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_InterfaceMethodref_info</code> structure
61469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * at the given index represents the member with the specified
61569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * name and declaring class.
61669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
61769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param classname         the class declaring the member
61869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param membername        the member name
61969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param index             the index into the constant pool table
62069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
62169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return          the <code>descriptor_index</code> specifying
62269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *                  the type descriptor of that member.
62369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *                  If it is not that member,
62469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *                  <code>isMember()</code> returns 0.
62569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
62669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int isMember(String classname, String membername, int index) {
62769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        MemberrefInfo minfo = (MemberrefInfo)getItem(index);
62869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (getClassInfo(minfo.classIndex).equals(classname)) {
62969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            NameAndTypeInfo ntinfo
63069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                = (NameAndTypeInfo)getItem(minfo.nameAndTypeIndex);
63169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            if (getUtf8Info(ntinfo.memberName).equals(membername))
63269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                return ntinfo.typeDescriptor;
63369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
63469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
63569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return 0;       // false
63669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
63769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
63869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
63969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Determines whether <code>CONSTANT_Methodref_info</code>,
64069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_Fieldref_info</code>, or
64169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <code>CONSTANT_InterfaceMethodref_info</code> structure
64269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * at the given index has the name and the descriptor
64369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * given as the arguments.
64469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
64569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param membername        the member name
64669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param desc              the descriptor of the member.
64769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param index             the index into the constant pool table
64869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
64969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return          the name of the target class specified by
65069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *                  the <code>..._info</code> structure
65169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *                  at <code>index</code>.
65269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *                  Otherwise, null if that structure does not
65369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *                  match the given member name and descriptor.
65469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
65569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public String eqMember(String membername, String desc, int index) {
65669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        MemberrefInfo minfo = (MemberrefInfo)getItem(index);
65769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        NameAndTypeInfo ntinfo
65869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                = (NameAndTypeInfo)getItem(minfo.nameAndTypeIndex);
65969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (getUtf8Info(ntinfo.memberName).equals(membername)
66069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            && getUtf8Info(ntinfo.typeDescriptor).equals(desc))
66169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return getClassInfo(minfo.classIndex);
66269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else
66369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return null;       // false
66469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
66569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
66669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    private int addItem(ConstInfo info) {
66769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        items.addElement(info);
66869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return numOfItems++;
66969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
67069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
67169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
67269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Copies the n-th item in this ConstPool object into the destination
67369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * ConstPool object.
67469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * The class names that the item refers to are renamed according
67569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * to the given map.
67669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
67769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param n                 the <i>n</i>-th item
67869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param dest              destination constant pool table
67969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param classnames        the map or null.
68069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return the index of the copied item into the destination ClassPool.
68169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
68269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int copy(int n, ConstPool dest, Map classnames) {
68369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (n == 0)
68469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return 0;
68569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
68669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        ConstInfo info = getItem(n);
68769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return info.copy(this, dest, classnames);
68869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
68969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
69069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    int addConstInfoPadding() {
69169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return addItem(new ConstInfoPadding());
69269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
69369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
69469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
69569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Adds a new <code>CONSTANT_Class_info</code> structure.
69669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
69769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <p>This also adds a <code>CONSTANT_Utf8_info</code> structure
69869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * for storing the class name.
69969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
70069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return          the index of the added entry.
70169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
70269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int addClassInfo(CtClass c) {
70369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (c == THIS)
70469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return thisClassInfo;
70569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else if (!c.isArray())
70669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return addClassInfo(c.getName());
70769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else {
70869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            // an array type is recorded in the hashtable with
70969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            // the key "[L<classname>;" instead of "<classname>".
71069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            //
71169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            // note: toJvmName(toJvmName(c)) is equal to toJvmName(c).
71269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
71369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return addClassInfo(Descriptor.toJvmName(c));
71469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
71569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
71669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
71769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
71869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Adds a new <code>CONSTANT_Class_info</code> structure.
71969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
72069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <p>This also adds a <code>CONSTANT_Utf8_info</code> structure
72169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * for storing the class name.
72269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
72369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param qname     a fully-qualified class name
72469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *                  (or the JVM-internal representation of that name).
72569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return          the index of the added entry.
72669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
72769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int addClassInfo(String qname) {
72869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        ClassInfo info = (ClassInfo)classes.get(qname);
72969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (info != null)
73069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return info.index;
73169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else {
73269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            int utf8 = addUtf8Info(Descriptor.toJvmName(qname));
73369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            info = new ClassInfo(utf8, numOfItems);
73469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            classes.put(qname, info);
73569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return addItem(info);
73669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
73769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
73869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
73969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
74069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Adds a new <code>CONSTANT_NameAndType_info</code> structure.
74169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
74269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <p>This also adds <code>CONSTANT_Utf8_info</code> structures.
74369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
74469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param name      <code>name_index</code>
74569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param type      <code>descriptor_index</code>
74669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return          the index of the added entry.
74769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
74869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int addNameAndTypeInfo(String name, String type) {
74969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return addNameAndTypeInfo(addUtf8Info(name), addUtf8Info(type));
75069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
75169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
75269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
75369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Adds a new <code>CONSTANT_NameAndType_info</code> structure.
75469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
75569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param name      <code>name_index</code>
75669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param type      <code>descriptor_index</code>
75769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return          the index of the added entry.
75869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
75969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int addNameAndTypeInfo(int name, int type) {
76069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        int h = hashFunc(name, type);
76169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        ConstInfo ci = constInfoCache[h];
76269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (ci != null && ci instanceof NameAndTypeInfo && ci.hashCheck(name, type))
76369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return constInfoIndexCache[h];
76469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else {
76569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            NameAndTypeInfo item = new NameAndTypeInfo(name, type);
76669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            constInfoCache[h] = item;
76769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            int i = addItem(item);
76869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            constInfoIndexCache[h] = i;
76969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return i;
77069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
77169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
77269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
77369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
77469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Adds a new <code>CONSTANT_Fieldref_info</code> structure.
77569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
77669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <p>This also adds a new <code>CONSTANT_NameAndType_info</code>
77769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * structure.
77869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
77969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param classInfo         <code>class_index</code>
78069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param name              <code>name_index</code>
78169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *                          of <code>CONSTANT_NameAndType_info</code>.
78269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param type              <code>descriptor_index</code>
78369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *                          of <code>CONSTANT_NameAndType_info</code>.
78469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return          the index of the added entry.
78569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
78669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int addFieldrefInfo(int classInfo, String name, String type) {
78769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        int nt = addNameAndTypeInfo(name, type);
78869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return addFieldrefInfo(classInfo, nt);
78969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
79069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
79169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
79269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Adds a new <code>CONSTANT_Fieldref_info</code> structure.
79369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
79469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param classInfo         <code>class_index</code>
79569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param nameAndTypeInfo   <code>name_and_type_index</code>.
79669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return          the index of the added entry.
79769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
79869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int addFieldrefInfo(int classInfo, int nameAndTypeInfo) {
79969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        int h = hashFunc(classInfo, nameAndTypeInfo);
80069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        ConstInfo ci = constInfoCache[h];
80169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (ci != null && ci instanceof FieldrefInfo && ci.hashCheck(classInfo, nameAndTypeInfo))
80269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return constInfoIndexCache[h];
80369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else {
80469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            FieldrefInfo item = new FieldrefInfo(classInfo, nameAndTypeInfo);
80569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            constInfoCache[h] = item;
80669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            int i = addItem(item);
80769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            constInfoIndexCache[h] = i;
80869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return i;
80969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
81069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
81169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
81269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
81369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Adds a new <code>CONSTANT_Methodref_info</code> structure.
81469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
81569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <p>This also adds a new <code>CONSTANT_NameAndType_info</code>
81669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * structure.
81769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
81869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param classInfo         <code>class_index</code>
81969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param name              <code>name_index</code>
82069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *                          of <code>CONSTANT_NameAndType_info</code>.
82169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param type              <code>descriptor_index</code>
82269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *                          of <code>CONSTANT_NameAndType_info</code>.
82369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return          the index of the added entry.
82469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
82569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int addMethodrefInfo(int classInfo, String name, String type) {
82669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        int nt = addNameAndTypeInfo(name, type);
82769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return addMethodrefInfo(classInfo, nt);
82869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
82969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
83069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
83169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Adds a new <code>CONSTANT_Methodref_info</code> structure.
83269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
83369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param classInfo         <code>class_index</code>
83469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param nameAndTypeInfo   <code>name_and_type_index</code>.
83569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return          the index of the added entry.
83669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
83769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int addMethodrefInfo(int classInfo, int nameAndTypeInfo) {
83869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        int h = hashFunc(classInfo, nameAndTypeInfo);
83969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        ConstInfo ci = constInfoCache[h];
84069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (ci != null && ci instanceof MethodrefInfo && ci.hashCheck(classInfo, nameAndTypeInfo))
84169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return constInfoIndexCache[h];
84269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else {
84369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            MethodrefInfo item = new MethodrefInfo(classInfo, nameAndTypeInfo);
84469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            constInfoCache[h] = item;
84569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            int i = addItem(item);
84669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            constInfoIndexCache[h] = i;
84769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return i;
84869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
84969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
85069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
85169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
85269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Adds a new <code>CONSTANT_InterfaceMethodref_info</code>
85369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * structure.
85469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
85569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <p>This also adds a new <code>CONSTANT_NameAndType_info</code>
85669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * structure.
85769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
85869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param classInfo         <code>class_index</code>
85969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param name              <code>name_index</code>
86069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *                          of <code>CONSTANT_NameAndType_info</code>.
86169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param type              <code>descriptor_index</code>
86269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *                          of <code>CONSTANT_NameAndType_info</code>.
86369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return          the index of the added entry.
86469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
86569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int addInterfaceMethodrefInfo(int classInfo, String name,
86669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                                         String type) {
86769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        int nt = addNameAndTypeInfo(name, type);
86869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return addInterfaceMethodrefInfo(classInfo, nt);
86969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
87069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
87169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
87269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Adds a new <code>CONSTANT_InterfaceMethodref_info</code>
87369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * structure.
87469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
87569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param classInfo         <code>class_index</code>
87669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param nameAndTypeInfo   <code>name_and_type_index</code>.
87769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return          the index of the added entry.
87869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
87969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int addInterfaceMethodrefInfo(int classInfo,
88069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                                         int nameAndTypeInfo) {
88169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        int h = hashFunc(classInfo, nameAndTypeInfo);
88269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        ConstInfo ci = constInfoCache[h];
88369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (ci != null && ci instanceof InterfaceMethodrefInfo && ci.hashCheck(classInfo, nameAndTypeInfo))
88469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return constInfoIndexCache[h];
88569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else {
88669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            InterfaceMethodrefInfo item =new InterfaceMethodrefInfo(classInfo, nameAndTypeInfo);
88769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            constInfoCache[h] = item;
88869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            int i = addItem(item);
88969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            constInfoIndexCache[h] = i;
89069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return i;
89169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
89269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
89369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
89469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
89569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Adds a new <code>CONSTANT_String_info</code>
89669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * structure.
89769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
89869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <p>This also adds a new <code>CONSTANT_Utf8_info</code>
89969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * structure.
90069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
90169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return          the index of the added entry.
90269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
90369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int addStringInfo(String str) {
90469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return addItem(new StringInfo(addUtf8Info(str)));
90569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
90669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
90769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
90869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Adds a new <code>CONSTANT_Integer_info</code>
90969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * structure.
91069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
91169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return          the index of the added entry.
91269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
91369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int addIntegerInfo(int i) {
91469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return addItem(new IntegerInfo(i));
91569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
91669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
91769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
91869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Adds a new <code>CONSTANT_Float_info</code>
91969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * structure.
92069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
92169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return          the index of the added entry.
92269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
92369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int addFloatInfo(float f) {
92469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return addItem(new FloatInfo(f));
92569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
92669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
92769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
92869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Adds a new <code>CONSTANT_Long_info</code>
92969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * structure.
93069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
93169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return          the index of the added entry.
93269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
93369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int addLongInfo(long l) {
93469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        int i = addItem(new LongInfo(l));
93569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        addItem(new ConstInfoPadding());
93669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return i;
93769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
93869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
93969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
94069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Adds a new <code>CONSTANT_Double_info</code>
94169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * structure.
94269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
94369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return          the index of the added entry.
94469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
94569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int addDoubleInfo(double d) {
94669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        int i = addItem(new DoubleInfo(d));
94769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        addItem(new ConstInfoPadding());
94869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return i;
94969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
95069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
95169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
95269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Adds a new <code>CONSTANT_Utf8_info</code>
95369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * structure.
95469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
95569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * <p>If the given utf8 string has been already recorded in the
95669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * table, then this method does not add a new entry to avoid adding
95769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * a duplicated entry.
95869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Instead, it returns the index of the entry already recorded.
95969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
96069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return          the index of the added entry.
96169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
96269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int addUtf8Info(String utf8) {
96369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        Utf8Info info = (Utf8Info)strings.get(utf8);
96469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (info != null)
96569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return info.index;
96669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else {
96769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            info = new Utf8Info(utf8, numOfItems);
96869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            strings.put(utf8, info);
96969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return addItem(info);
97069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
97169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
97269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
97369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
97469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Get all the class names.
97569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
97669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @return a set of class names
97769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
97869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public Set getClassNames()
97969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    {
98069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        HashSet result = new HashSet();
98169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        LongVector v = items;
98269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        int size = numOfItems;
98369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        for (int i = 1; i < size; ++i) {
98469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            String className = v.elementAt(i).getClassName(this);
98569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            if (className != null)
98669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal               result.add(className);
98769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
98869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return result;
98969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
99069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
99169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
99269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Replaces all occurrences of a class name.
99369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
99469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param oldName           the replaced name (JVM-internal representation).
99569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param newName           the substituted name (JVM-internal representation).
99669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
99769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void renameClass(String oldName, String newName) {
99869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        LongVector v = items;
99969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        int size = numOfItems;
100069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        classes = new HashMap(classes.size() * 2);
100169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        for (int i = 1; i < size; ++i) {
100269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            ConstInfo ci = v.elementAt(i);
100369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            ci.renameClass(this, oldName, newName);
100469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            ci.makeHashtable(this);
100569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
100669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
100769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
100869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
100969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Replaces all occurrences of class names.
101069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
101169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param classnames        specifies pairs of replaced and substituted
101269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *                          name.
101369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
101469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void renameClass(Map classnames) {
101569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        LongVector v = items;
101669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        int size = numOfItems;
101769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        classes = new HashMap(classes.size() * 2);
101869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        for (int i = 1; i < size; ++i) {
101969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            ConstInfo ci = v.elementAt(i);
102069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            ci.renameClass(this, classnames);
102169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            ci.makeHashtable(this);
102269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
102369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
102469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
102569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    private void read(DataInputStream in) throws IOException {
102669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        int n = in.readUnsignedShort();
102769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
102869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        items = new LongVector(n);
102969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        numOfItems = 0;
103069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        addItem(null);          // index 0 is reserved by the JVM.
103169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
103269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        while (--n > 0) {       // index 0 is reserved by JVM
103369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            int tag = readOne(in);
103469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            if ((tag == LongInfo.tag) || (tag == DoubleInfo.tag)) {
103569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                addItem(new ConstInfoPadding());
103669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                --n;
103769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            }
103869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
103969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
104069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        int i = 1;
104169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        while (true) {
104269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            ConstInfo info = items.elementAt(i++);
104369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            if (info == null)
104469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                break;
104569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            else
104669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                info.makeHashtable(this);
104769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
104869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
104969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
105069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    private int readOne(DataInputStream in) throws IOException {
105169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        ConstInfo info;
105269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        int tag = in.readUnsignedByte();
105369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        switch (tag) {
105469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        case Utf8Info.tag :                     // 1
105569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            info = new Utf8Info(in, numOfItems);
105669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            strings.put(((Utf8Info)info).string, info);
105769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            break;
105869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        case IntegerInfo.tag :                  // 3
105969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            info = new IntegerInfo(in);
106069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            break;
106169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        case FloatInfo.tag :                    // 4
106269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            info = new FloatInfo(in);
106369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            break;
106469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        case LongInfo.tag :                     // 5
106569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            info = new LongInfo(in);
106669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            break;
106769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        case DoubleInfo.tag :                   // 6
106869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            info = new DoubleInfo(in);
106969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            break;
107069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        case ClassInfo.tag :                    // 7
107169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            info = new ClassInfo(in, numOfItems);
107269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            // classes.put(<classname>, info);
107369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            break;
107469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        case StringInfo.tag :                   // 8
107569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            info = new StringInfo(in);
107669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            break;
107769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        case FieldrefInfo.tag :                 // 9
107869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            info = new FieldrefInfo(in);
107969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            break;
108069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        case MethodrefInfo.tag :                // 10
108169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            info = new MethodrefInfo(in);
108269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            break;
108369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        case InterfaceMethodrefInfo.tag :       // 11
108469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            info = new InterfaceMethodrefInfo(in);
108569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            break;
108669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        case NameAndTypeInfo.tag :              // 12
108769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            info = new NameAndTypeInfo(in);
108869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            break;
108969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        default :
109069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            throw new IOException("invalid constant type: " + tag);
109169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
109269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
109369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        addItem(info);
109469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return tag;
109569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
109669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
109769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
109869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Writes the contents of the constant pool table.
109969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
110069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void write(DataOutputStream out) throws IOException {
110169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.writeShort(numOfItems);
110269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        LongVector v = items;
110369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        int size = numOfItems;
110469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        for (int i = 1; i < size; ++i)
110569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            v.elementAt(i).write(out);
110669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
110769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
110869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
110969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Prints the contents of the constant pool table.
111069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
111169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void print() {
111269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        print(new PrintWriter(System.out, true));
111369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
111469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
111569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
111669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Prints the contents of the constant pool table.
111769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
111869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void print(PrintWriter out) {
111969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        int size = numOfItems;
112069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        for (int i = 1; i < size; ++i) {
112169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            out.print(i);
112269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            out.print(" ");
112369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            items.elementAt(i).print(out);
112469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
112569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
112669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal}
112769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
112869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalabstract class ConstInfo {
112969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public abstract int getTag();
113069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
113169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public String getClassName(ConstPool cp) { return null; }
113269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void renameClass(ConstPool cp, String oldName, String newName) {}
113369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void renameClass(ConstPool cp, Map classnames) {}
113469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public abstract int copy(ConstPool src, ConstPool dest, Map classnames);
113569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                        // ** classnames is a mapping between JVM names.
113669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
113769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public abstract void write(DataOutputStream out) throws IOException;
113869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public abstract void print(PrintWriter out);
113969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
114069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    void makeHashtable(ConstPool cp) {}     // called after read() finishes in ConstPool.
114169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
114269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    boolean hashCheck(int a, int b) { return false; }
114369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
114469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public String toString() {
114569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        ByteArrayOutputStream bout = new ByteArrayOutputStream();
114669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        PrintWriter out = new PrintWriter(bout);
114769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        print(out);
114869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return bout.toString();
114969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
115069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal}
115169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
115269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal/* padding following DoubleInfo or LongInfo.
115369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */
115469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalclass ConstInfoPadding extends ConstInfo {
115569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int getTag() { return 0; }
115669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
115769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int copy(ConstPool src, ConstPool dest, Map map) {
115869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return dest.addConstInfoPadding();
115969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
116069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
116169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void write(DataOutputStream out) throws IOException {}
116269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
116369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void print(PrintWriter out) {
116469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.println("padding");
116569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
116669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal}
116769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
116869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalclass ClassInfo extends ConstInfo {
116969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    static final int tag = 7;
117069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    int name;
117169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    int index;
117269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
117369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public ClassInfo(int className, int i) {
117469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        name = className;
117569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        index = i;
117669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
117769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
117869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public ClassInfo(DataInputStream in, int i) throws IOException {
117969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        name = in.readUnsignedShort();
118069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        index = i;
118169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
118269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
118369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int getTag() { return tag; }
118469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
118569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public String getClassName(ConstPool cp) {
118669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return cp.getUtf8Info(name);
118769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    };
118869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
118969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void renameClass(ConstPool cp, String oldName, String newName) {
119069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        String nameStr = cp.getUtf8Info(name);
119169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (nameStr.equals(oldName))
119269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            name = cp.addUtf8Info(newName);
119369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else if (nameStr.charAt(0) == '[') {
119469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            String nameStr2 = Descriptor.rename(nameStr, oldName, newName);
119569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            if (nameStr != nameStr2)
119669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                name = cp.addUtf8Info(nameStr2);
119769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
119869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
119969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
120069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void renameClass(ConstPool cp, Map map) {
120169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        String oldName = cp.getUtf8Info(name);
120269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (oldName.charAt(0) == '[') {
120369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            String newName = Descriptor.rename(oldName, map);
120469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            if (oldName != newName)
120569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                name = cp.addUtf8Info(newName);
120669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
120769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else {
120869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            String newName = (String)map.get(oldName);
120969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            if (newName != null && !newName.equals(oldName))
121069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                name = cp.addUtf8Info(newName);
121169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
121269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
121369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
121469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int copy(ConstPool src, ConstPool dest, Map map) {
121569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        String classname = src.getUtf8Info(name);
121669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (map != null) {
121769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            String newname = (String)map.get(classname);
121869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            if (newname != null)
121969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                classname = newname;
122069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
122169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
122269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return dest.addClassInfo(classname);
122369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
122469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
122569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void write(DataOutputStream out) throws IOException {
122669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.writeByte(tag);
122769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.writeShort(name);
122869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
122969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
123069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void print(PrintWriter out) {
123169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.print("Class #");
123269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.println(name);
123369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
123469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
123569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    void makeHashtable(ConstPool cp) {
123669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        String name = Descriptor.toJavaName(getClassName(cp));
123769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        cp.classes.put(name, this);
123869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
123969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal}
124069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
124169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalclass NameAndTypeInfo extends ConstInfo {
124269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    static final int tag = 12;
124369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    int memberName;
124469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    int typeDescriptor;
124569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
124669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public NameAndTypeInfo(int name, int type) {
124769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        memberName = name;
124869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        typeDescriptor = type;
124969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
125069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
125169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public NameAndTypeInfo(DataInputStream in) throws IOException {
125269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        memberName = in.readUnsignedShort();
125369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        typeDescriptor = in.readUnsignedShort();
125469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
125569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
125669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    boolean hashCheck(int a, int b) { return a == memberName && b == typeDescriptor; }
125769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
125869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int getTag() { return tag; }
125969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
126069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void renameClass(ConstPool cp, String oldName, String newName) {
126169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        String type = cp.getUtf8Info(typeDescriptor);
126269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        String type2 = Descriptor.rename(type, oldName, newName);
126369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (type != type2)
126469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            typeDescriptor = cp.addUtf8Info(type2);
126569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
126669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
126769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void renameClass(ConstPool cp, Map map) {
126869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        String type = cp.getUtf8Info(typeDescriptor);
126969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        String type2 = Descriptor.rename(type, map);
127069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (type != type2)
127169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            typeDescriptor = cp.addUtf8Info(type2);
127269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
127369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
127469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int copy(ConstPool src, ConstPool dest, Map map) {
127569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        String mname = src.getUtf8Info(memberName);
127669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        String tdesc = src.getUtf8Info(typeDescriptor);
127769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        tdesc = Descriptor.rename(tdesc, map);
127869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return dest.addNameAndTypeInfo(dest.addUtf8Info(mname),
127969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                                       dest.addUtf8Info(tdesc));
128069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
128169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
128269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void write(DataOutputStream out) throws IOException {
128369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.writeByte(tag);
128469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.writeShort(memberName);
128569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.writeShort(typeDescriptor);
128669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
128769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
128869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void print(PrintWriter out) {
128969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.print("NameAndType #");
129069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.print(memberName);
129169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.print(", type #");
129269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.println(typeDescriptor);
129369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
129469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal}
129569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
129669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalabstract class MemberrefInfo extends ConstInfo {
129769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    int classIndex;
129869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    int nameAndTypeIndex;
129969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
130069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public MemberrefInfo(int cindex, int ntindex) {
130169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        classIndex = cindex;
130269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        nameAndTypeIndex = ntindex;
130369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
130469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
130569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public MemberrefInfo(DataInputStream in) throws IOException {
130669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        classIndex = in.readUnsignedShort();
130769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        nameAndTypeIndex = in.readUnsignedShort();
130869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
130969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
131069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int copy(ConstPool src, ConstPool dest, Map map) {
131169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        int classIndex2 = src.getItem(classIndex).copy(src, dest, map);
131269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        int ntIndex2 = src.getItem(nameAndTypeIndex).copy(src, dest, map);
131369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return copy2(dest, classIndex2, ntIndex2);
131469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
131569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
131669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    boolean hashCheck(int a, int b) { return a == classIndex && b == nameAndTypeIndex; }
131769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
131869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    abstract protected int copy2(ConstPool dest, int cindex, int ntindex);
131969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
132069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void write(DataOutputStream out) throws IOException {
132169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.writeByte(getTag());
132269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.writeShort(classIndex);
132369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.writeShort(nameAndTypeIndex);
132469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
132569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
132669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void print(PrintWriter out) {
132769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.print(getTagName() + " #");
132869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.print(classIndex);
132969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.print(", name&type #");
133069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.println(nameAndTypeIndex);
133169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
133269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
133369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public abstract String getTagName();
133469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal}
133569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
133669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalclass FieldrefInfo extends MemberrefInfo {
133769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    static final int tag = 9;
133869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
133969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public FieldrefInfo(int cindex, int ntindex) {
134069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        super(cindex, ntindex);
134169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
134269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
134369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public FieldrefInfo(DataInputStream in) throws IOException {
134469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        super(in);
134569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
134669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
134769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int getTag() { return tag; }
134869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
134969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public String getTagName() { return "Field"; }
135069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
135169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    protected int copy2(ConstPool dest, int cindex, int ntindex) {
135269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return dest.addFieldrefInfo(cindex, ntindex);
135369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
135469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal}
135569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
135669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalclass MethodrefInfo extends MemberrefInfo {
135769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    static final int tag = 10;
135869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
135969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public MethodrefInfo(int cindex, int ntindex) {
136069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        super(cindex, ntindex);
136169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
136269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
136369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public MethodrefInfo(DataInputStream in) throws IOException {
136469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        super(in);
136569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
136669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
136769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int getTag() { return tag; }
136869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
136969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public String getTagName() { return "Method"; }
137069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
137169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    protected int copy2(ConstPool dest, int cindex, int ntindex) {
137269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return dest.addMethodrefInfo(cindex, ntindex);
137369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
137469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal}
137569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
137669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalclass InterfaceMethodrefInfo extends MemberrefInfo {
137769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    static final int tag = 11;
137869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
137969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public InterfaceMethodrefInfo(int cindex, int ntindex) {
138069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        super(cindex, ntindex);
138169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
138269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
138369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public InterfaceMethodrefInfo(DataInputStream in) throws IOException {
138469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        super(in);
138569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
138669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
138769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int getTag() { return tag; }
138869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
138969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public String getTagName() { return "Interface"; }
139069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
139169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    protected int copy2(ConstPool dest, int cindex, int ntindex) {
139269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return dest.addInterfaceMethodrefInfo(cindex, ntindex);
139369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
139469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal}
139569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
139669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalclass StringInfo extends ConstInfo {
139769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    static final int tag = 8;
139869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    int string;
139969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
140069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public StringInfo(int str) {
140169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        string = str;
140269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
140369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
140469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public StringInfo(DataInputStream in) throws IOException {
140569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        string = in.readUnsignedShort();
140669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
140769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
140869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int getTag() { return tag; }
140969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
141069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int copy(ConstPool src, ConstPool dest, Map map) {
141169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return dest.addStringInfo(src.getUtf8Info(string));
141269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
141369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
141469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void write(DataOutputStream out) throws IOException {
141569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.writeByte(tag);
141669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.writeShort(string);
141769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
141869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
141969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void print(PrintWriter out) {
142069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.print("String #");
142169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.println(string);
142269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
142369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal}
142469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
142569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalclass IntegerInfo extends ConstInfo {
142669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    static final int tag = 3;
142769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    int value;
142869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
142969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public IntegerInfo(int i) {
143069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        value = i;
143169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
143269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
143369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public IntegerInfo(DataInputStream in) throws IOException {
143469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        value = in.readInt();
143569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
143669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
143769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int getTag() { return tag; }
143869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
143969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int copy(ConstPool src, ConstPool dest, Map map) {
144069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return dest.addIntegerInfo(value);
144169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
144269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
144369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void write(DataOutputStream out) throws IOException {
144469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.writeByte(tag);
144569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.writeInt(value);
144669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
144769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
144869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void print(PrintWriter out) {
144969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.print("Integer ");
145069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.println(value);
145169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
145269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal}
145369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
145469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalclass FloatInfo extends ConstInfo {
145569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    static final int tag = 4;
145669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    float value;
145769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
145869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public FloatInfo(float f) {
145969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        value = f;
146069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
146169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
146269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public FloatInfo(DataInputStream in) throws IOException {
146369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        value = in.readFloat();
146469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
146569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
146669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int getTag() { return tag; }
146769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
146869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int copy(ConstPool src, ConstPool dest, Map map) {
146969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return dest.addFloatInfo(value);
147069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
147169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
147269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void write(DataOutputStream out) throws IOException {
147369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.writeByte(tag);
147469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.writeFloat(value);
147569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
147669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
147769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void print(PrintWriter out) {
147869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.print("Float ");
147969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.println(value);
148069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
148169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal}
148269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
148369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalclass LongInfo extends ConstInfo {
148469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    static final int tag = 5;
148569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    long value;
148669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
148769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public LongInfo(long l) {
148869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        value = l;
148969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
149069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
149169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public LongInfo(DataInputStream in) throws IOException {
149269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        value = in.readLong();
149369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
149469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
149569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int getTag() { return tag; }
149669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
149769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int copy(ConstPool src, ConstPool dest, Map map) {
149869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return dest.addLongInfo(value);
149969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
150069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
150169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void write(DataOutputStream out) throws IOException {
150269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.writeByte(tag);
150369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.writeLong(value);
150469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
150569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
150669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void print(PrintWriter out) {
150769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.print("Long ");
150869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.println(value);
150969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
151069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal}
151169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
151269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalclass DoubleInfo extends ConstInfo {
151369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    static final int tag = 6;
151469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    double value;
151569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
151669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public DoubleInfo(double d) {
151769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        value = d;
151869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
151969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
152069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public DoubleInfo(DataInputStream in) throws IOException {
152169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        value = in.readDouble();
152269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
152369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
152469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int getTag() { return tag; }
152569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
152669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int copy(ConstPool src, ConstPool dest, Map map) {
152769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return dest.addDoubleInfo(value);
152869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
152969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
153069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void write(DataOutputStream out) throws IOException {
153169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.writeByte(tag);
153269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.writeDouble(value);
153369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
153469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
153569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void print(PrintWriter out) {
153669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.print("Double ");
153769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.println(value);
153869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
153969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal}
154069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
154169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalclass Utf8Info extends ConstInfo {
154269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    static final int tag = 1;
154369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    String string;
154469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    int index;
154569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
154669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public Utf8Info(String utf8, int i) {
154769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        string = utf8;
154869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        index = i;
154969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
155069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
155169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public Utf8Info(DataInputStream in, int i) throws IOException {
155269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        string = in.readUTF();
155369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        index = i;
155469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
155569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
155669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int getTag() { return tag; }
155769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
155869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public int copy(ConstPool src, ConstPool dest, Map map) {
155969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return dest.addUtf8Info(string);
156069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
156169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
156269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void write(DataOutputStream out) throws IOException {
156369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.writeByte(tag);
156469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.writeUTF(string);
156569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
156669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
156769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void print(PrintWriter out) {
156869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.print("UTF8 \"");
156969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.print(string);
157069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        out.println("\"");
157169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
157269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal}
1573