001: /**
002: * JavaGuard -- an obfuscation package for Java classfiles.
003: *
004: * Copyright (c) 1999 Mark Welsh (markw@retrologic.com)
005: * Copyright (c) 2002 Thorsten Heit (theit@gmx.de)
006: *
007: * This library is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU Lesser General Public
009: * License as published by the Free Software Foundation; either
010: * version 2 of the License, or (at your option) any later version.
011: *
012: * This library is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this library; if not, write to the Free Software
019: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
020: *
021: * The author may be contacted at theit@gmx.de.
022: *
023: *
024: * $Id: NameAndTypeCpInfo.java,v 1.3 2002/05/11 19:11:19 glurk Exp $
025: */package net.sf.javaguard.classfile;
026:
027: import java.io.*;
028:
029: /** Representation of a 'nameandtype' entry in the ConstantPool.
030: *
031: * @author <a href="mailto:theit@gmx.de">Thorsten Heit</a>
032: * @author <a href="mailto:markw@retrologic.com">Mark Welsh</a>
033: */
034: public class NameAndTypeCpInfo extends CpInfo implements Cloneable {
035: /** Holds the name index, stored in a 2-byte array in the class file. */
036: private int nameIndex;
037: /** Holds the descriptor name index, stored in a 2-byte array in the class
038: * file. */
039: private int descriptorIndex;
040:
041: /** Default constructor that creates a new NameAndTypeCpInfo object.
042: */
043: protected NameAndTypeCpInfo() {
044: super (CONSTANT_NameAndType);
045: }
046:
047: /** Clone the entry.
048: * @return a duplicate of the entry
049: */
050: public Object clone() {
051: NameAndTypeCpInfo cloneInfo = new NameAndTypeCpInfo();
052: cloneInfo.setNameIndex(getNameIndex());
053: cloneInfo.setDescriptorIndex(getDescriptorIndex());
054: cloneInfo.resetRefCount();
055: return cloneInfo;
056: }
057:
058: /** Return the name index into the constant pool.
059: * @return index into the constant pool
060: * @see #setNameIndex
061: */
062: protected int getNameIndex() {
063: return nameIndex;
064: }
065:
066: /** Set the name index into the constant pool.
067: * @param index the index into the constant pool
068: * @see #getNameIndex
069: */
070: protected void setNameIndex(int index) {
071: nameIndex = index;
072: }
073:
074: /** Return the descriptor index.
075: * @return index into the constant pool
076: * @see #setDescriptorIndex
077: */
078: protected int getDescriptorIndex() {
079: return descriptorIndex;
080: }
081:
082: /** Set the descriptor index.
083: * @param index the index into the constant pool
084: * @see #getDescriptorIndex
085: */
086: protected void setDescriptorIndex(int index) {
087: descriptorIndex = index;
088: }
089:
090: /** Check for Utf8 references to constant pool and mark them.
091: * @param pool the constant pool the element belongs to
092: */
093: protected void markUtf8Refs(ConstantPool pool) {
094: pool.incRefCount(getNameIndex());
095: pool.incRefCount(getDescriptorIndex());
096: }
097:
098: /** Read the 'info' data (the two short values) following the u1tag byte.
099: * @param din the input stream
100: * @throws IOException if an I/O error occurs
101: */
102: protected void readInfo(DataInput din) throws IOException {
103: setNameIndex(din.readUnsignedShort());
104: setDescriptorIndex(din.readUnsignedShort());
105: }
106:
107: /** Write the 'info' data (the two short values) following the u1tag byte.
108: * @param dout the output stream
109: * @throws IOException if an I/O error occurs
110: */
111: protected void writeInfo(DataOutput dout) throws IOException {
112: dout.writeShort(getNameIndex());
113: dout.writeShort(getDescriptorIndex());
114: }
115:
116: /** Dump the content of the entry to the specified file (used for debugging).
117: * @param pw the print writer
118: * @param cf the class file the element belongs to
119: * @param index the index in the constant pool
120: */
121: public void dump(PrintWriter pw, ClassFile cf, int index) {
122: pw.print('[');
123: pw.print(index);
124: pw.println("]: NameAndTypeCpInfo");
125: pw.print(" -> name index: ");
126: pw.println(getNameIndex());
127: pw.print(" name: '");
128: pw.print(((Utf8CpInfo) cf.getCpEntry(getNameIndex()))
129: .getString());
130: pw.println('\'');
131: pw.print(" -> descriptor index: ");
132: pw.println(getDescriptorIndex());
133: pw.print(" descriptor: '");
134: pw.print(((Utf8CpInfo) cf.getCpEntry(getDescriptorIndex()))
135: .getString());
136: pw.println('\'');
137: }
138: }
|