001 package sysModel.classFile.attributes; 002 003 import sysModel.classFile.attributes.visitors.IAttributeVisitor; 004 import sysModel.classFile.code.instructions.LineNumberTable; 005 import sysModel.classFile.constantPool.AUTFPoolInfo; 006 import sysModel.classFile.constantPool.ConstantPool; 007 import sysModel.classFile.constantPool.visitors.CheckUTFVisitor; 008 import sysModel.classFile.Types; 009 010 /** 011 * Represents the SourceFile attribute in a class file. 012 * 013 * @author Mathias Ricken 014 */ 015 public class SourceFileAttributeInfo extends AAttributeInfo { 016 /** 017 * Constructor. 018 * 019 * @param name attribute name 020 * @param data attribute data 021 * @param cp constant pool 022 * 023 * @throws ClassFormatError 024 */ 025 public SourceFileAttributeInfo(AUTFPoolInfo name, byte[] data, ConstantPool cp) throws ClassFormatError { 026 super(name, data, cp); 027 } 028 029 /** 030 * Return the source file name information. 031 * 032 * @return source file name information 033 * 034 * @throws ClassFormatError 035 */ 036 public AUTFPoolInfo getSourceFileName() throws ClassFormatError { 037 return _constantPool.get(Types.ushortFromBytes(_data, 0)).execute(CheckUTFVisitor.singleton(), null); 038 } 039 040 /** 041 * Set the source file name information. 042 * 043 * @param newFileName constant pool 044 */ 045 public void setSourceFileName(AUTFPoolInfo newFileName) { 046 _data = new byte[2]; 047 Types.bytesFromShort(_constantPool.indexOf(newFileName), _data, 0); 048 } 049 050 /** 051 * Execute a visitor on this attribute. 052 * 053 * @param visitor visitor 054 * @param param visitor-specific parameter 055 * 056 * @return visitor-specific return value 057 */ 058 public <R, D> R execute(IAttributeVisitor<R, D> visitor, D param) { 059 return visitor.sourceFileCase(this, param); 060 } 061 062 /** 063 * Adjust program counter values contained in this attribute, starting at startPC, by adding deltaPC to them. 064 * 065 * @param startPC program counter to start at 066 * @param deltaPC change in program counter values 067 */ 068 public void adjustPC(short startPC, short deltaPC) { 069 // nothing to do 070 } 071 072 /** 073 * Translate the program counter values contained in this attribute from an old line number table to a new one. 074 * 075 * @param index critical point (insertion or deletion point) 076 * @param deltaIndex delta value to add to all old line numbers greater than the critical point 077 * @param oldLnt old line number table 078 * @param newLnt new line number table 079 */ 080 public void translatePC(short index, short deltaIndex, LineNumberTable oldLnt, LineNumberTable newLnt) { 081 // nothing to do 082 } 083 084 /** 085 * Creates and returns a copy of this object. 086 */ 087 public Object clone() throws CloneNotSupportedException { 088 return super.clone(); 089 } 090 091 /** 092 * Return a human-readable version of this attribute. 093 * 094 * @return string 095 */ 096 public String toString() { 097 return "Source File = "+getSourceFileName().toString(); 098 } 099 100 /** 101 * Returns the name of the attribute as it appears in the class file. 102 * 103 * @return name of the attribute. 104 */ 105 public static String getAttributeName() { 106 return "SourceFile"; 107 } 108 }