001package serp.bytecode;
002
003import serp.bytecode.visitor.*;
004
005/**
006 * Code blocks compiled from source have local variable tables mapping
007 * locals used in opcodes to their names and descriptions.
008 *
009 * @author Abe White
010 */
011public class LocalVariableTable extends LocalTable {
012    LocalVariableTable(int nameIndex, Attributes owner) {
013        super(nameIndex, owner);
014    }
015
016    /**
017     * Return all the locals of this method.
018     */
019    public LocalVariable[] getLocalVariables() {
020        return (LocalVariable[]) getLocals();
021    }
022
023    /**
024     * Return the local with the given locals index, or null if none.
025     */
026    public LocalVariable getLocalVariable(int local) {
027        return (LocalVariable) getLocal(local);
028    }
029
030    /**
031     * Return the local with the given name, or null if none. If multiple
032     * locals have the given name, which is returned is undefined.
033     */
034    public LocalVariable getLocalVariable(String name) {
035        return (LocalVariable) getLocal(name);
036    }
037
038    /**
039     * Return all locals with the given name, or empty array if none.
040     */
041    public LocalVariable[] getLocalVariables(String name) {
042        return (LocalVariable[]) getLocals(name);
043    }
044
045    /**
046     * Import a local from another method/class. Note that
047     * the program counter and length from the given local is copied
048     * directly, and thus will be incorrect unless this method is the same
049     * as the one the local is copied from, or the pc and length are reset.
050     */
051    public LocalVariable addLocalVariable(LocalVariable local) {
052        return (LocalVariable) addLocal(local);
053    }
054
055    /**
056     * Add a local to this table.
057     */
058    public LocalVariable addLocalVariable() {
059        return (LocalVariable) addLocal();
060    }
061
062    /**
063     * Add a local to this table.
064     */
065    public LocalVariable addLocalVariable(String name, String type) {
066        return (LocalVariable) addLocal(name, type);
067    }
068
069    /**
070     * Add a local to this table.
071     */
072    public LocalVariable addLocalVariable(String name, Class type) {
073        String typeName = (type == null) ? null : type.getName();
074        return addLocalVariable(name, typeName);
075    }
076
077    /**
078     * Add a local to this table.
079     */
080    public LocalVariable addLocalVariable(String name, BCClass type) {
081        String typeName = (type == null) ? null : type.getName();
082        return addLocalVariable(name, typeName);
083    }
084
085    public void acceptVisit(BCVisitor visit) {
086        visit.enterLocalVariableTable(this);
087        LocalVariable[] locals = (LocalVariable[]) getLocals();
088        for (int i = 0; i < locals.length; i++)
089            locals[i].acceptVisit(visit);
090        visit.exitLocalVariableTable(this);
091    }
092
093    protected Local newLocal() {
094        return new LocalVariable(this);
095    }
096
097    protected Local[] newLocalArray(int size) {
098        return new LocalVariable[size];
099    }
100}