001 package serp.bytecode.lowlevel; 002 003 import java.io.*; 004 005 import serp.bytecode.visitor.*; 006 007 /** 008 * Entry containing indexes referencing a name and a descriptor. Used 009 * to describe fields and methods of other classes referenced by opcodes. 010 * 011 * @author Abe White 012 */ 013 public class NameAndTypeEntry extends Entry { 014 private int _nameIndex = 0; 015 private int _descriptorIndex = 0; 016 017 /** 018 * Default constructor. 019 */ 020 public NameAndTypeEntry() { 021 } 022 023 /** 024 * Constructor. 025 * 026 * @param nameIndex the constant pool index of the 027 * {@link UTF8Entry} containing the name of this entity 028 * @param descriptorIndex the constant pool index of the 029 * {@link UTF8Entry} containing the descriptor for this entity 030 */ 031 public NameAndTypeEntry(int nameIndex, int descriptorIndex) { 032 _nameIndex = nameIndex; 033 _descriptorIndex = descriptorIndex; 034 } 035 036 public int getType() { 037 return Entry.NAMEANDTYPE; 038 } 039 040 /** 041 * Return the constant pool index of the {@link UTF8Entry} 042 * containing the name of this entity. 043 */ 044 public int getNameIndex() { 045 return _nameIndex; 046 } 047 048 /** 049 * Set the constant pool index of the {@link UTF8Entry} 050 * containing the name of this entity. 051 */ 052 public void setNameIndex(int nameIndex) { 053 Object key = beforeModify(); 054 _nameIndex = nameIndex; 055 afterModify(key); 056 } 057 058 /** 059 * Return the name's referenced {@link UTF8Entry}. This method can only 060 * be run for entries that have been added to a constant pool. 061 */ 062 public UTF8Entry getNameEntry() { 063 return (UTF8Entry) getPool().getEntry(_nameIndex); 064 } 065 066 /** 067 * Return the constant pool index of the {@link UTF8Entry} 068 * containing the descriptor for this entity. 069 */ 070 public int getDescriptorIndex() { 071 return _descriptorIndex; 072 } 073 074 /** 075 * Set the constant pool index of a {@link UTF8Entry} 076 * containing the descriptor for this entity. 077 */ 078 public void setDescriptorIndex(int descriptorIndex) { 079 Object key = beforeModify(); 080 _descriptorIndex = descriptorIndex; 081 afterModify(key); 082 } 083 084 /** 085 * Return the descriptor's referenced {@link UTF8Entry}. This method 086 * can only be run for entries that have been added to a constant pool. 087 */ 088 public UTF8Entry getDescriptorEntry() { 089 return (UTF8Entry) getPool().getEntry(_descriptorIndex); 090 } 091 092 public void acceptVisit(BCVisitor visit) { 093 visit.enterNameAndTypeEntry(this); 094 visit.exitNameAndTypeEntry(this); 095 } 096 097 void readData(DataInput in) throws IOException { 098 _nameIndex = in.readUnsignedShort(); 099 _descriptorIndex = in.readUnsignedShort(); 100 } 101 102 void writeData(DataOutput out) throws IOException { 103 out.writeShort(_nameIndex); 104 out.writeShort(_descriptorIndex); 105 } 106 }