001 package serp.bytecode;
002
003 import 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 */
011 public 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 }