|
Scala example source code file (JLocalVariableTableAttribute.java)
The Scala JLocalVariableTableAttribute.java source code
/* FJBG -- Fast Java Bytecode Generator
* Copyright 2002-2011 LAMP/EPFL
* @author Michel Schinz
*/
package ch.epfl.lamp.fjbg;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.LinkedList;
import ch.epfl.lamp.fjbg.JConstantPool.*;
/**
* Attribute storing local variables.
*
* @author Stephane Micheloud
* @version 1.0
*/
public class JLocalVariableTableAttribute extends JAttribute {
/** Constant pool of the current classfile. */
private JConstantPool pool;
protected final LinkedList/*<Entry>*/ entries = new LinkedList();
protected int localVariableIndex = 0;
public JLocalVariableTableAttribute(FJBGContext context,
JClass clazz,
JCode code) {
super(context, clazz);
this.pool = clazz.pool;
assert code.getOwner().getOwner() == clazz;
}
public JLocalVariableTableAttribute(FJBGContext context,
JClass clazz,
Object owner,
String name,
int size,
DataInputStream stream)
throws IOException {
super(context, clazz, name);
this.pool = clazz.pool;
int count = stream.readShort();
for (int i = 0; i < count; ++i) {
int startPc = stream.readShort();
int length = stream.readShort();
int nameIndex = stream.readShort();
int descIndex = stream.readShort();
int index = stream.readShort();
addEntry(startPc, length, nameIndex, descIndex, index);
}
assert name.equals(getName());
}
public void addEntry(int startPc, int length, int nameIndex,
int descIndex, int index) {
entries.add(new Entry(startPc, length, nameIndex, descIndex, index));
}
public void addEntry(int startPc, int length, String name,
String desc, int index) {
Entry e = new Entry(startPc, length, name, desc, index);
Entry other = getEntry(index);
if (other != null) {
assert other.nameIndex == e.nameIndex && other.descIndex == e.descIndex
: e + " already declared as " + other;
} else
entries.add(e);
}
public void addEntry(int startPc, int length, String name, String desc) {
entries.add(new Entry(startPc, length, name, desc));
}
public String getName() { return "LocalVariableTable"; }
// Follows javap output format for LocalVariableTable attribute.
/*@Override*/ public String toString() {
StringBuffer buf = new StringBuffer(" LocalVariableTable: ");
buf.append("\n Start Length Slot Name Signature");
for (Iterator it = entries.iterator(); it.hasNext(); ) {
buf.append("\n ");
Entry e = (Entry)it.next();
Utf8Entry name = (Utf8Entry)pool.lookupEntry(e.nameIndex);
Utf8Entry sig = (Utf8Entry)pool.lookupEntry(e.descIndex);
buf.append(e.startPc);
buf.append(" ");
buf.append(e.length);
buf.append(" ");
buf.append(e.index);
buf.append(" ");
buf.append(name.getValue());
buf.append(" ");
buf.append(sig.getValue());
}
buf.append("\n");
return buf.toString();
}
public int getMaxLocals() {
return localVariableIndex;
}
public int getSize() {
return 2 + entries.size() * 10;
}
protected void writeContentsTo(DataOutputStream stream) throws IOException {
stream.writeShort(entries.size());
for (Iterator it = entries.iterator(); it.hasNext(); ) {
Entry e = (Entry)it.next();
stream.writeShort(e.startPc);
stream.writeShort(e.length);
stream.writeShort(e.nameIndex);
stream.writeShort(e.descIndex);
stream.writeShort(e.index);
}
}
private Entry getEntry(int index) {
Entry e = null;
try { e = (Entry)entries.get(index); } catch (Exception ex) {}
return e;
}
private class Entry {
int startPc;
int length;
int nameIndex;
int descIndex;
int index;
public Entry(int startPc, int length, int nameIndex, int descIndex, int index) {
this.startPc = startPc;
this.length = length;
this.nameIndex = nameIndex;
this.descIndex = descIndex;
this.index = index;
localVariableIndex += length;
}
public Entry(int startPc, int length, String name, String desc, int index) {
this(startPc, length, pool.addUtf8(name), pool.addUtf8(desc), index);
}
public Entry(int startPc, int length, String name, String desc) {
this(startPc, length, pool.addUtf8(name), pool.addUtf8(desc), localVariableIndex);
}
/** Two entries are equal if they refer to the same index.
*/
public boolean equals(Object other) {
if (other instanceof Entry) {
Entry otherEntry = (Entry) other;
return otherEntry.index == this.index;
}
return false;
}
}
}
Other Scala examples (source code examples)Here is a short list of links related to this Scala JLocalVariableTableAttribute.java source code file: |
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.