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