/* --- Copyright (c) Chris Rathman 1999. All rights reserved. -----------------
> File: jasper/Attribute_Collection.java
> Purpose: Collection of attributes for class, fields, methods, and code
> Author: Chris Rathman, 12 June 1999
> Version: 1.00
*/
package jasper;
import java.io.*;
import java.lang.reflect.*;
/*
* Note: You may want to break these classes into seperate source files. The java compiler issues
* a warning:
* class jasper.Attribute is defined in Attribute_Collection.java.
* Because it is used outside of its source file, it should be defined
* in a file called "Attribute.java".
* class Code_Collection extends Attribute {
* This is due to the fact that the Code class extends the Attribute class of this file.
* Under JDK1.2, the compilation works (other than issuing a warning) as long as you compile
* the Attribute.java file prior to compiling the Code_Collection.java file.
*/
/*=======================================================================
= Class: Attribute_Collection =
= =
= Desc: attributes for field, methods, code, or class =
= =
= hierarchy of attribute collections =
= .Field =
= ConstantValue =
= Synthetic =
= Deprecated =
= .Method =
= .Code_Collection (Code) =
= LineNumberTable =
= LocalVariableTable =
= Exceptions =
= Synthetic =
= Deprecated =
= .ClassFile =
= SourceFile =
= InnerClasses =
= Synthetic =
= Deprecated =
=======================================================================*/
class Attribute_Collection {
private int count; // number of attributes
private Attribute[] attributes; // attributes declared in this section (field, class, or method)
/*-----------------------------------------------------------------------
- Method: Class Constructor -
- -
- Desc: read in the attribute definitions from input stream -
-----------------------------------------------------------------------*/
Attribute_Collection(DataInputStream ios, Pool_Collection pool) throws IOException {
// get the number of methods
count = ios.readShort();
// read in the attributes - use reflection to dispatch to the appropriate class
attributes = new Attribute[count];
for (int i = 0; i < count; i++) {
// get the attribute name (index into constant pool table)
int attributeIndex = ios.readShort();
try {
Constructor myConstructor;
// get subclass that handles the attribute
Class newClass = getDispatch(pool.toString(attributeIndex));
try {
// for some reason this technique is not working in JDK1.2?
myConstructor = newClass.getConstructor(new Class[]
{ios.getClass(), pool.getClass(), int.class});
} catch (NoSuchMethodException e) {
// since there is only one constructor, we can use this technique if above fails
myConstructor = newClass.getDeclaredConstructors()[0];
}
// read in the attribute
attributes[i] = (Attribute)myConstructor.newInstance(new Object[]
{ios, pool, new Integer(attributeIndex)});
} catch (InstantiationException e) {
throw new IOException("InstantiationException");
} catch (IllegalAccessException e) {
throw new IOException("IllegalAccessException");
} catch (InvocationTargetException e) {
throw new IOException("InvocationTargetException");
}
}
}
/*-----------------------------------------------------------------------
- Method: getDispatch -
- -
- Desc: get the class name that handles the attribute -
-----------------------------------------------------------------------*/
static Class getDispatch(String s) {
// look for a match of the attribute name in the static array
for (int i = 1; i < dispatch.length; i++) {
if (s.equals((String)dispatch[i][0])) return (Class)dispatch[i][1];
}
// if dispatch class not found then use Attribute_Unknown class
return (Class)dispatch[0][1];
}
/*-----------------------------------------------------------------------
- Field: dispatch -
- -
- Desc: array used to dispatch for object instantiation -
- element[i][0] = attribute name in class file -
- element[i][1] = class name that handles attribute -
-----------------------------------------------------------------------*/
private static Object[][] dispatch = {
{"", Attribute_Unknown.class},
{"Code", Code_Collection.class},
{"ConstantValue", Attribute_ConstantValue.class},
{"Deprecated", Attribute_Deprecated.class},
{"Exceptions", Attribute_Exceptions.class},
{"InnerClasses", Attribute_InnerClasses.class},
{"LineNumberTable", Attribute_LineNumberTable.class},
{"LocalVariableTable", Attribute_LocalVariableTable.class},
{"SourceFile", Attribute_SourceFile.class},
{"Synthetic", Attribute_Synthetic.class}
};
/*-----------------------------------------------------------------------
- Method: getLabel -
- -
- Desc: ask attributes if they need any LABELs to be printed -
-----------------------------------------------------------------------*/
void getLabel(Code_Collection code) {
for (int i = 0; i < count; i++) attributes[i].getLabel(code);
}
/*-----------------------------------------------------------------------
- Method: getLineNumberTable -
- -
- Desc: get line numbers from LineNumberTable attribute -
-----------------------------------------------------------------------*/
int[] getLineNumberTable(int pc) {
for (int i = 0; i < count; i++) {
int[] retVal = attributes[i].getLineNumberTable(pc);
if (retVal != null) return retVal;
}
return null;
}
/*-----------------------------------------------------------------------
- Method: jasmin -
- -
- Desc: output to jasmin file (action specific to attribute) -
-----------------------------------------------------------------------*/
void jasmin(PrintStream out) throws IOException {
for (int i = 0; i < count; i++) attributes[i].jasmin(out);
}
/*-----------------------------------------------------------------------
- Method: jasminConstantValue -
- -
- Desc: get constant value from ConstantValue attribute -
-----------------------------------------------------------------------*/
String jasminConstantValue() {
String retVal = "";
for (int i = 0; i < count; i++) retVal += attributes[i].jasminConstantValue();
return retVal;
}
/*-----------------------------------------------------------------------
- Method: jasminSourceFile -
- -
- Desc: get source file name from SourceFile attribute -
-----------------------------------------------------------------------*/
String jasminSourceFile() {
String retVal = "";
for (int i = 0; i < count; i++) retVal += attributes[i].jasminSourceFile();
return retVal;
}
/*-----------------------------------------------------------------------
- Method: browseSourceFile -
- -
- Desc: get source file name from SourceFile attribute -
-----------------------------------------------------------------------*/
String browseSourceFile() {
String retVal = "";
for (int i = 0; i < count; i++) retVal += attributes[i].browseSourceFile();
return retVal;
}
/*-----------------------------------------------------------------------
- Method: browseDeprecated -
- -
- Desc: get 'deprecated' string from Deprecated attribute -
-----------------------------------------------------------------------*/
String browseDeprecated() {
String retVal = "";
for (int i = 0; i < count; i++) retVal += attributes[i].browseDeprecated();
return retVal;
}
/*-----------------------------------------------------------------------
- Method: browseSynthetic -
- -
- Desc: get 'synthetic' string from Synthetic attribute -
-----------------------------------------------------------------------*/
String browseSynthetic() {
String retVal = "";
for (int i = 0; i < count; i++) retVal += attributes[i].browseSynthetic();
return retVal;
}
/*-----------------------------------------------------------------------
- Method: browseConstantValue -
- -
- Desc: get constant value from ConstantValue attribute -
-----------------------------------------------------------------------*/
String browseConstantValue() {
String retVal = "";
for (int i = 0; i < count; i++) retVal += attributes[i].browseConstantValue();
return retVal;
}
/*-----------------------------------------------------------------------
- Method: browseExceptions -
- -
- Desc: get exceptions thrown from Exceptions attribute -
-----------------------------------------------------------------------*/
String[] browseExceptions() {
for (int i = 0; i < count; i++) {
String[] retVal = attributes[i].browseExceptions();
if (retVal != null) return retVal;
}
return new String[0];
}
/*-----------------------------------------------------------------------
- Method: browseInnerClasses -
- -
- Desc: get inner classes from InnerClasses attribute -
-----------------------------------------------------------------------*/
String[][] browseInnerClasses() {
for (int i = 0; i < count; i++) {
String[][] retVal = attributes[i].browseInnerClasses();
if (retVal != null) return retVal;
}
return new String[0][0];
}
/*-----------------------------------------------------------------------
- Method: browseFieldrefs -
- -
- Desc: get fields referenced from Code attribute -
-----------------------------------------------------------------------*/
String[] browseFieldrefs() {
for (int i = 0; i < count; i++) {
String[] retVal = attributes[i].browseFieldrefs();
if (retVal != null) return retVal;
}
return new String[0];
}
/*-----------------------------------------------------------------------
- Method: browseMethodrefs -
- -
- Desc: get methods referenced from Code attribute -
-----------------------------------------------------------------------*/
String[] browseMethodrefs() {
for (int i = 0; i < count; i++) {
String[] retVal = attributes[i].browseMethodrefs();
if (retVal != null) return retVal;
}
return new String[0];
}
/*-----------------------------------------------------------------------
- Method: browseInterfaceMethodrefs -
- -
- Desc: get interface methods referenced from Code attribute -
-----------------------------------------------------------------------*/
String[] browseInterfaceMethodrefs() {
for (int i = 0; i < count; i++) {
String[] retVal = attributes[i].browseInterfaceMethodrefs();
if (retVal != null) return retVal;
}
return new String[0];
}
}
/* --- Copyright (c) Chris Rathman 1999. All rights reserved. -----------------
> File: jasper/Attribute.java
> Purpose: Base abstract class for all attributes
> Author: Chris Rathman, 12 June 1999
> Version: 1.00
*/
//package jasper;
//import java.io.*;
/*=======================================================================
= Class: Attribute =
= =
= Desc: abstract class for attributes (polymorphic behavior) =
=======================================================================*/
abstract class Attribute {
protected Pool_Collection pool; // constant pool table
protected int attributeIndex; // attribute name (index into constant pool table)
protected int length; // length of the attribute in bytes
/*-----------------------------------------------------------------------
- Method: Class Constructor -
- -
- Desc: set the values for the common fields -
-----------------------------------------------------------------------*/
public Attribute(DataInputStream ios, Pool_Collection pool, int attributeIndex) throws IOException {
// set common variables for the attribute
this.pool = pool;
this.attributeIndex = attributeIndex;
// read the length of the attribute
int length = ios.readInt();
}
/*-----------------------------------------------------------------------
- Method: getLabel -
- -
- Desc: default to no labels needed by attribute -
- overridden by subclass: Attribute_LocalVariableTable -
-----------------------------------------------------------------------*/
void getLabel(Code_Collection code) {
}
/*-----------------------------------------------------------------------
- Method: getLineNumberTable -
- -
- Desc: default to no line numbers for attribute -
- overridden by subclass: Attribute_LineNumberTable -
-----------------------------------------------------------------------*/
int[] getLineNumberTable(int pc) {
return null;
}
/*-----------------------------------------------------------------------
- Method: jasmin -
- -
- Desc: default to no output to jasmin assembly file -
- overridden by subclasses: Attribute_SourceFile; -
- Attribute_Exceptions; Attribute_LocalVariableTable;-
- Code_Collection -
-----------------------------------------------------------------------*/
void jasmin(PrintStream out) throws IOException {
}
/*-----------------------------------------------------------------------
- Method: jasminSourceFile -
- -
- Desc: default to no source file name for attribute -
- overridden by subclass: Attribute_SourceFile -
-----------------------------------------------------------------------*/
String jasminSourceFile() {
return "";
}
/*-----------------------------------------------------------------------
- Method: jasminConstantValue -
- -
- Desc: default to no constant value string for attribute -
- overridden by subclass: Attribute_ConstantValue -
-----------------------------------------------------------------------*/
String jasminConstantValue() {
return "";
}
/*-----------------------------------------------------------------------
- Method: browseSourceFile -
- -
- Desc: default to no source file name for attribute -
- overridden by subclass: Attribute_SourceFile -
-----------------------------------------------------------------------*/
String browseSourceFile() {
return "";
}
/*-----------------------------------------------------------------------
- Method: browseDeprecated -
- -
- Desc: default to no deprecated string for attribute -
- overridden by subclass: Attribute_Deprecated -
-----------------------------------------------------------------------*/
String browseDeprecated() {
return "";
}
/*-----------------------------------------------------------------------
- Method: browseSynthetic -
- -
- Desc: default to no synthetic string for attribute -
- overridden by subclass: Attribute_Synthetic -
-----------------------------------------------------------------------*/
String browseSynthetic() {
return "";
}
/*-----------------------------------------------------------------------
- Method: browseConstantValue -
- -
- Desc: default to no constant value string for attribute -
- overridden by subclass: Attribute_ConstantValue -
-----------------------------------------------------------------------*/
String browseConstantValue() {
return "";
}
/*-----------------------------------------------------------------------
- Method: browseExceptions -
- -
- Desc: default to no exception throws for attribute -
- overridden by subclass: Attribute_Exception -
-----------------------------------------------------------------------*/
String[] browseExceptions() {
return null;
}
/*-----------------------------------------------------------------------
- Method: browseInnerClasses -
- -
- Desc: default to no inner classes for attribute -
- overridden by subclass: Attribute_InnerClasses -
-----------------------------------------------------------------------*/
String[][] browseInnerClasses() {
return null;
}
/*-----------------------------------------------------------------------
- Method: browseFieldrefs -
- -
- Desc: default to no fields referenced for attribute -
- overridden by subclass: Code_Collection -
-----------------------------------------------------------------------*/
String[] browseFieldrefs() {
return null;
}
/*-----------------------------------------------------------------------
- Method: browseMethodrefs -
- -
- Desc: default to no methods referenced for attribute -
- overridden by subclass: Code_Collection -
-----------------------------------------------------------------------*/
String[] browseMethodrefs() {
return null;
}
/*-----------------------------------------------------------------------
- Method: browseInterfaceMethodrefs -
- -
- Desc: default to no interfaces referenced for attribute -
- overridden by subclass: Code_Collection -
-----------------------------------------------------------------------*/
String[] browseInterfaceMethodrefs() {
return null;
}
}
/* --- Copyright (c) Chris Rathman 1999. All rights reserved. -----------------
> File: jasper/Attribute_ConstantValue.java
> Purpose: ConstantValue attribute for static final fields
> Author: Chris Rathman, 12 June 1999
> Version: 1.00
*/
//package jasper;
//import java.io.*;
/*=======================================================================
= Class: Attribute_ConstantValue =
= =
= Desc: constant value for static final field =
=======================================================================*/
class Attribute_ConstantValue extends Attribute {
private int constantIndex; // constant value (index into constant pool table)
/*-----------------------------------------------------------------------
- Method: Class Constructor -
- -
- Desc: read the attribute info from the input stream -
-----------------------------------------------------------------------*/
public Attribute_ConstantValue(DataInputStream ios, Pool_Collection pool, int attributeIndex) throws IOException {
// set the common variables
super(ios, pool, attributeIndex);
// get the constant value (index into constant pool table)
constantIndex = ios.readShort();
}
/*-----------------------------------------------------------------------
- Method: jasminConstantValue -
- -
- Desc: set constant value string to complete field declare -
-----------------------------------------------------------------------*/
String jasminConstantValue() {
return " = " + pool.toString(constantIndex);
}
/*-----------------------------------------------------------------------
- Method: browseConstantValue -
- -
- Desc: set constant value string to complete field declare -
-----------------------------------------------------------------------*/
String browseConstantValue() {
return " = " + pool.browseString(constantIndex);
}
}
/* --- Copyright (c) Chris Rathman 1999. All rights reserved. -----------------
> File: jasper/Attribute_Deprecated.java
> Purpose: Deprecated attribute for class, field or method
> Author: Chris Rathman, 12 June 1999
> Version: 1.00
*/
//package jasper;
//import java.io.*;
/*=======================================================================
= Class: Attribute_Deprecated =
= =
= Desc: deprecated class, field or method =
=======================================================================*/
class Attribute_Deprecated extends Attribute {
/*-----------------------------------------------------------------------
- Method: Class Constructor -
- -
- Desc: read the attribute info from the input stream -
-----------------------------------------------------------------------*/
public Attribute_Deprecated(DataInputStream ios, Pool_Collection pool, int attributeIndex) throws IOException {
// set the common variables
super(ios, pool, attributeIndex);
// deprecated is only a flag with no further bytes needed - skip bytes just in case
ios.skip(length);
}
/*-----------------------------------------------------------------------
- Method: browseDeprecated -
- -
- Desc: set string to indicate deprecate -
-----------------------------------------------------------------------*/
String browseDeprecated() {
return "#deprecated# ";
}
}
/* --- Copyright (c) Chris Rathman 1999. All rights reserved. -----------------
> File: jasper/Attribute_Exceptions.java
> Purpose: Exceptions which are thrown by a method
> Author: Chris Rathman, 12 June 1999
> Version: 1.00
*/
//package jasper;
//import java.io.*;
/*=======================================================================
= Class: Attribute_Exceptions =
= =
= Desc: Exceptions attribute (Method) =
=======================================================================*/
class Attribute_Exceptions extends Attribute {
private int count; // number of exceptions which the method throws
private int[] exceptionIndex; // name of the exception class (index into constant pool table)
/*-----------------------------------------------------------------------
- Method: Class Constructor -
- -
- Desc: read the attribute info from the input stream -
-----------------------------------------------------------------------*/
public Attribute_Exceptions(DataInputStream ios, Pool_Collection pool, int attributeIndex) throws IOException {
// set the common variables
super(ios, pool, attributeIndex);
// get the number of exceptions in the throws clause
count = ios.readShort();
// read in the class names of the exceptions (index into constant pool table)
exceptionIndex = new int[count];
for (int i = 0; i < count; i++) exceptionIndex[i] = ios.readShort();
}
/*-----------------------------------------------------------------------
- Method: jasmin -
- -
- Desc: output the .throws directives to the jasmin file -
-----------------------------------------------------------------------*/
void jasmin(PrintStream out) throws IOException {
for (int i = 0; i < count; i++) {
out.println(ClassFile.pad(" .throws", ClassFile.SPACER) + pool.toString(exceptionIndex[i]));
}
}
/*-----------------------------------------------------------------------
- Method: browseExceptions -
- -
- Desc: return the exceptions which the method throws -
-----------------------------------------------------------------------*/
String[] browseExceptions() {
String[] retVal = new String[count];
for (int i = 0; i < count; i++) retVal[i] = pool.browseString(exceptionIndex[i]);
return retVal;
}
}
/* --- Copyright (c) Chris Rathman 1999. All rights reserved. -----------------
> File: jasper/Attribute_InnerClasses.java
> Purpose: InnerClassses attribute for the class
> Author: Chris Rathman, 12 June 1999
> Version: 1.00
*/
//package jasper;
//import java.io.*;
/*=======================================================================
= Class: Attribute_InnerClasses =
= =
= Desc: InnerClasses attribute (Class) =
=======================================================================*/
class Attribute_InnerClasses extends Attribute {
private int count; // number of inner class entries
private int[] innerIndex; // full class name of inner class
private int[] outerIndex; // the class of which the inner class is a member (current = 0)
private int[] nameIndex; // simple class name of the inner class (anynomous = 0)
private int[] accessFlags; // access permissions for the inner class
/*-----------------------------------------------------------------------
- Method: Class Constructor -
- -
- Desc: read the attribute info from the input stream -
-----------------------------------------------------------------------*/
public Attribute_InnerClasses(DataInputStream ios, Pool_Collection pool, int attributeIndex) throws IOException {
// set the common variables
super(ios, pool, attributeIndex);
// get the number of InnerClasses
count = ios.readShort();
// allocate the arrays to hold the inner class information
innerIndex = new int[count];
outerIndex = new int[count];
nameIndex = new int[count];
accessFlags = new int[count];
for (int i = 0; i < count; i++) {
// get the class name of the inner class
innerIndex[i] = ios.readShort();
// get the class of which the inner class is a member
outerIndex[i] = ios.readShort();
// get the simple class name of the inner class
nameIndex[i] = ios.readShort();
// get the access permissions of the inner class
accessFlags[i] = ios.readShort();
}
}
/*-----------------------------------------------------------------------
- Method: browseInnerClasses -
- -
- Desc: return the inner class information -
-----------------------------------------------------------------------*/
String[][] browseInnerClasses() {
String[][] retVal = new String[count][3];
for (int i = 0; i < count; i++) {
for (int j = 0; j < retVal[i].length; j++) retVal[i][j] = "";
if (innerIndex[i] > 0) retVal[i][0] = pool.browseString(innerIndex[i]);
if (outerIndex[i] > 0) retVal[i][1] = pool.browseString(outerIndex[i]);
if ((accessFlags[i] & 0x0001) > 0) retVal[i][2] += "public ";
if ((accessFlags[i] & 0x0010) > 0) retVal[i][2] += "final ";
if ((accessFlags[i] & 0x0400) > 0) retVal[i][2] += "abstract ";
if (nameIndex[i] > 0) retVal[i][2] += pool.browseString(nameIndex[i]);
}
return retVal;
}
}
/* --- Copyright (c) Chris Rathman 1999. All rights reserved. -----------------
> File: jasper/LineNumberTable.java
> Purpose: LineNumberTable attribute for the code collection
> Author: Chris Rathman, 12 June 1999
> Version: 1.00
*/
//package jasper;
//import java.io.*;
/*=======================================================================
= Class: Attribute_LineNumberTable =
= =
= Desc: LocalVariableTable attribute (Code) =
=======================================================================*/
class Attribute_LineNumberTable extends Attribute {
private int count; // number of entries in the table
private int[] pc; // program counter associated with the source line number
private int[] lineNum; // line number in the java source file
/*-----------------------------------------------------------------------
- Method: Class Constructor -
- -
- Desc: read the attribute info from the input stream -
-----------------------------------------------------------------------*/
public Attribute_LineNumberTable(DataInputStream ios, Pool_Collection pool, int attributeIndex) throws IOException {
// set the common variables
super(ios, pool, attributeIndex);
// get the number of entries
count = ios.readShort();
// allocate the arrays to hold the line number entries
pc = new int[count];
lineNum = new int[count];
for (int i = 0; i < count; i++) {
// get the program counter
pc[i] = ios.readShort();
// get the java source line number
lineNum[i] = ios.readShort();
}
}
/*-----------------------------------------------------------------------
- Method: getLineNumberTable -
- -
- Desc: source line numbers for given program counter -
-----------------------------------------------------------------------*/
int[] getLineNumberTable(int pc) {
// note that more than one source line can be associated with a single pc
int lineCount = 0;
for (int i = 0; i < count; i++) if (this.pc[i] == pc) ++lineCount;
if (lineCount == 0) return null;
int[] lines = new int[lineCount];
for (int i = 0, n = 0; i < count; i++) if (this.pc[i] == pc) lines[n++] = lineNum[i];
return lines;
}
}
/* --- Copyright (c) Chris Rathman 1999. All rights reserved. -----------------
> File: jasper/Attribute_LocalVariableTable.java
> Purpose: LocalVariableTable attribute for the code collection
> Author: Chris Rathman, 12 June 1999
> Version: 1.00
*/
//package jasper;
//import java.io.*;
/*=======================================================================
= Class: Attribute_LocalVariableTable =
= =
= Desc: LocalVariableTable attribute (Code) =
=======================================================================*/
class Attribute_LocalVariableTable extends Attribute {
private int count; // number of entries
private int[] startPC; // program counter start for local variable
private int[] len; // length of local variable usage (relative to startPC)
private int[] nameIndex; // name of the local variable (index into constant pool table)
private int[] descriptorIndex; // type of the local variable (index into constant pool table)
private int[] varIndex; // local variable table index in the java bytecode
/*-----------------------------------------------------------------------
- Method: Class Constructor -
- -
- Desc: read the attribute info from the input stream -
-----------------------------------------------------------------------*/
public Attribute_LocalVariableTable(DataInputStream ios, Pool_Collection pool, int attributeIndex) throws IOException {
// set the common variables
super(ios, pool, attributeIndex);
// get number of entries in this local variable table
count = ios.readShort();
// allocate arrays to hold entries
startPC = new int[count];
len = new int[count];
nameIndex = new int[count];
descriptorIndex = new int[count];
varIndex = new int[count];
for (int i = 0; i < count; i++) {
// get program counter start for local variable
startPC[i] = ios.readShort();
// get length of local variable usage (relative to startPC)
len[i] = ios.readShort();
// get name of the local variable (index into constant pool table)
nameIndex[i] = ios.readShort();
// get type of the local variable (index into constant pool table)
descriptorIndex[i] = ios.readShort();
// get local variable table index in the java bytecode
varIndex[i] = ios.readShort();
}
}
/*-----------------------------------------------------------------------
- Method: getLabel -
- -
- Desc: make sure a LABEL is printed for .local directives -
-----------------------------------------------------------------------*/
void getLabel(Code_Collection code) {
for (int i = 0; i < count; i++) {
// label the position in the code for the start pc for the local
code.setLabel(startPC[i]);
// label the position in the code for the end pc for the local
code.setLabel(startPC[i]+len[i]);
}
}
/*-----------------------------------------------------------------------
- Method: jasmin -
- -
- Desc: output the .local directives to the jasmin file -
-----------------------------------------------------------------------*/
void jasmin(PrintStream out) throws IOException {
for (int i = 0; i < count; i++) {
out.println(ClassFile.pad(" .var " + varIndex[i] + " is ", ClassFile.SPACER) +
pool.toString(nameIndex[i]) + " " + pool.toString(descriptorIndex[i]) +
" from " + Code_Collection.toLabel(startPC[i]) +
" to " + Code_Collection.toLabel(startPC[i] + len[i]));
}
}
}
/* --- Copyright (c) Chris Rathman 1999. All rights reserved. -----------------
> File: jasper/Attribute_SourceFile.java
> Purpose: SourceFile attribute for the class
> Author: Chris Rathman, 12 June 1999
> Version: 1.00
*/
//package jasper;
//import java.io.*;
/*=======================================================================
= Class: Attribute_SourceFile =
= =
= Desc: SourceFile attribute (Class) =
=======================================================================*/
class Attribute_SourceFile extends Attribute {
private int sourceIndex; // source file name (index into the constant pool table)
/*-----------------------------------------------------------------------
- Method: Class Constructor -
- -
- Desc: read the attribute info from the input stream -
-----------------------------------------------------------------------*/
public Attribute_SourceFile(DataInputStream ios, Pool_Collection pool, int attributeIndex) throws IOException {
// set the common variables
super(ios, pool, attributeIndex);
// get the source file name
sourceIndex = ios.readShort();
}
/*-----------------------------------------------------------------------
- Method: jasmin -
- -
- Desc: output the .source directive to the jasmin file -
-----------------------------------------------------------------------*/
void jasmin(PrintStream out) throws IOException {
out.println(ClassFile.pad(".source", ClassFile.SPACER) + jasminSourceFile());
}
/*-----------------------------------------------------------------------
- Method: jasminSourceFile -
- -
- Desc: return the source file name -
-----------------------------------------------------------------------*/
String jasminSourceFile() {
return pool.toString(sourceIndex);
}
/*-----------------------------------------------------------------------
- Method: browseSourceFile -
- -
- Desc: return the source file name -
-----------------------------------------------------------------------*/
String browseSourceFile() {
return pool.browseString(sourceIndex);
}
}
/* --- Copyright (c) Chris Rathman 1999. All rights reserved. -----------------
> File: jasper/Attribute_Synthetic.java
> Purpose: Synthetic attribute of class, field or method
> Author: Chris Rathman, 12 June 1999
> Version: 1.00
*/
//package jasper;
//import java.io.*;
/*=======================================================================
= Class: Attribute_Synthetic =
= =
= Desc: Synthetic attribute (Field, Method, Class) =
=======================================================================*/
class Attribute_Synthetic extends Attribute {
/*-----------------------------------------------------------------------
- Method: Class Constructor -
- -
- Desc: read the attribute info from the input stream -
-----------------------------------------------------------------------*/
public Attribute_Synthetic(DataInputStream ios, Pool_Collection pool, int attributeIndex) throws IOException {
// set the common variables
super(ios, pool, attributeIndex);
// synthetic is only a flag with no further bytes needed - skip bytes just in case
ios.skip(length);
}
/*-----------------------------------------------------------------------
- Method: browseSynthetic -
- -
- Desc: set string to indicate deprecate -
-----------------------------------------------------------------------*/
String browseSynthetic() {
return "#synthetic# ";
}
}
/* --- Copyright (c) Chris Rathman 1999. All rights reserved. -----------------
> File: jasper/Attribute_Unknown.java
> Purpose: Unknown attribute - vendor specific or not yet implemented by jasper
> Author: Chris Rathman, 12 June 1999
> Version: 1.00
*/
//package jasper;
//import java.io.*;
/*=======================================================================
= Class: Attribute_Unknown =
= =
= Desc: Unknown attribute (Field, Method, Code, Class) =
=======================================================================*/
class Attribute_Unknown extends Attribute {
/*-----------------------------------------------------------------------
- Method: Class Constructor -
- -
- Desc: read the attribute info from the input stream -
-----------------------------------------------------------------------*/
public Attribute_Unknown(DataInputStream ios, Pool_Collection pool, int attributeIndex) throws IOException {
// set the common variables
super(ios, pool, attributeIndex);
// echo that jasper doesn't currently handle the attribute
System.out.println("Undefined Attribute (length=" + length + ") (name=" + this.toString() + ")");
// do a hex dump of the attributes (mostly for debugging)
ClassFile.dump(ios, length);
}
}