// Path: src/stone/ast/ClassStmnt.java
// public class ClassStmnt extends ASTList {
//     public ClassStmnt(List<ASTree> c) { super(c); }
//     public String name() { return ((ASTLeaf)child(0)).token().getText(); }
//     public String superClass() {
//         if (numChildren() < 3)
//             return null;
//         else
//             return ((ASTLeaf)child(1)).token().getText();
//     }
//     public ClassBody body() { return (ClassBody)child(numChildren() - 1); }
//     public String toString() {
//         String parent = superClass();
//         if (parent == null)
//             parent = "*";
//         return "(class " + name() + " " + parent + " " + body() + ")";
//     }
// }
// 
// Path: src/stone/ast/DefStmnt.java
// public class DefStmnt extends ASTList {
//     public DefStmnt(List<ASTree> c) { super(c); }
//     public String name() { return ((ASTLeaf)child(0)).token().getText(); }
//     public ParameterList parameters() { return (ParameterList)child(1); }
//     public BlockStmnt body() { return (BlockStmnt)child(2); } 
//     public String toString() {
//         return "(def " + name() + " " + parameters() + " " + body() + ")";
//     }
// }
// 
// Path: src/chap11/Symbols.java
// public class Symbols {
//     public static class Location {
//         public int nest, index;
//         public Location(int nest, int index) {
//             this.nest = nest;
//             this.index = index;
//         }
//     }
//     protected Symbols outer;
//     protected HashMap<String,Integer> table;
//     public Symbols() { this(null); }
//     public Symbols(Symbols outer) {
//         this.outer = outer;
//         this.table = new HashMap<String,Integer>();
//     }
//     public int size() { return table.size(); }
//     public void append(Symbols s) { table.putAll(s.table); }
//     public Integer find(String key) { return table.get(key); }
//     public Location get(String key) { return get(key, 0); }
//     public Location get(String key, int nest) {
//         Integer index = table.get(key);
//         if (index == null)
//             if (outer == null)
//                 return null;
//             else
//                 return outer.get(key, nest + 1);
//         else
//             return new Location(nest, index.intValue());
//     }
//     public int putNew(String key) {
//         Integer i = find(key);
//         if (i == null)
//             return add(key);
//         else
//             return i;
//     }
//     public Location put(String key) {
//         Location loc = get(key, 0);
//         if (loc == null)
//             return new Location(0, add(key));
//         else
//             return loc;
//     }
//     protected int add(String key) {
//         int i = table.size();
//         table.put(key, i);
//         return i;
//     }
// }
// 
// Path: src/chap12/ObjOptimizer.java
// @Reviser public static class DefStmntEx2 extends EnvOptimizer.DefStmntEx {
//     public DefStmntEx2(List<ASTree> c) { super(c); }
//     public int locals() { return size; }
//     public void lookupAsMethod(Symbols syms) {
//         Symbols newSyms = new Symbols(syms);
//         newSyms.putNew(SymbolThis.NAME);
//         ((ParamsEx)parameters()).lookup(newSyms);
//         ((ASTreeOptEx)revise(body())).lookup(newSyms);
//         size = newSyms.size();
//     }
// }
// 
// Path: src/chap6/Environment.java
// public interface Environment {
//     void put(String name, Object value);
//     Object get(String name);
// }
// 
// Path: src/chap9/ClassInfo.java
// public class ClassInfo {
//     protected ClassStmnt definition;
//     protected Environment environment;
//     protected ClassInfo superClass;
//     public ClassInfo(ClassStmnt cs, Environment env) {
//         definition = cs;
//         environment = env;
//         Object obj = env.get(cs.superClass());
//         if (obj == null)
//             superClass = null;
//         else if (obj instanceof ClassInfo)
//             superClass = (ClassInfo)obj;
//         else
//             throw new StoneException("unknown super class: " + cs.superClass(),
//                                      cs);
//     }
//     public String name() { return definition.name(); }
//     public ClassInfo superClass() { return superClass; }
//     public ClassBody body() { return definition.body(); }
//     public Environment environment() { return environment; }
//     @Override public String toString() { return "<class " + name() + ">"; }
// }


import java.util.ArrayList;
import stone.ast.ClassStmnt;
import stone.ast.DefStmnt;
import chap11.Symbols;
import chap12.ObjOptimizer.DefStmntEx2;
import chap6.Environment;
import chap9.ClassInfo;
package chap12;

public class OptClassInfo extends ClassInfo {
    protected Symbols methods, fields;
// Path: src/stone/ast/ClassStmnt.java
// public class ClassStmnt extends ASTList {
//     public ClassStmnt(List<ASTree> c) { super(c); }
//     public String name() { return ((ASTLeaf)child(0)).token().getText(); }
//     public String superClass() {
//         if (numChildren() < 3)
//             return null;
//         else
//             return ((ASTLeaf)child(1)).token().getText();
//     }
//     public ClassBody body() { return (ClassBody)child(numChildren() - 1); }
//     public String toString() {
//         String parent = superClass();
//         if (parent == null)
//             parent = "*";
//         return "(class " + name() + " " + parent + " " + body() + ")";
//     }
// }
// 
// Path: src/stone/ast/DefStmnt.java
// public class DefStmnt extends ASTList {
//     public DefStmnt(List<ASTree> c) { super(c); }
//     public String name() { return ((ASTLeaf)child(0)).token().getText(); }
//     public ParameterList parameters() { return (ParameterList)child(1); }
//     public BlockStmnt body() { return (BlockStmnt)child(2); } 
//     public String toString() {
//         return "(def " + name() + " " + parameters() + " " + body() + ")";
//     }
// }
// 
// Path: src/chap11/Symbols.java
// public class Symbols {
//     public static class Location {
//         public int nest, index;
//         public Location(int nest, int index) {
//             this.nest = nest;
//             this.index = index;
//         }
//     }
//     protected Symbols outer;
//     protected HashMap<String,Integer> table;
//     public Symbols() { this(null); }
//     public Symbols(Symbols outer) {
//         this.outer = outer;
//         this.table = new HashMap<String,Integer>();
//     }
//     public int size() { return table.size(); }
//     public void append(Symbols s) { table.putAll(s.table); }
//     public Integer find(String key) { return table.get(key); }
//     public Location get(String key) { return get(key, 0); }
//     public Location get(String key, int nest) {
//         Integer index = table.get(key);
//         if (index == null)
//             if (outer == null)
//                 return null;
//             else
//                 return outer.get(key, nest + 1);
//         else
//             return new Location(nest, index.intValue());
//     }
//     public int putNew(String key) {
//         Integer i = find(key);
//         if (i == null)
//             return add(key);
//         else
//             return i;
//     }
//     public Location put(String key) {
//         Location loc = get(key, 0);
//         if (loc == null)
//             return new Location(0, add(key));
//         else
//             return loc;
//     }
//     protected int add(String key) {
//         int i = table.size();
//         table.put(key, i);
//         return i;
//     }
// }
// 
// Path: src/chap12/ObjOptimizer.java
// @Reviser public static class DefStmntEx2 extends EnvOptimizer.DefStmntEx {
//     public DefStmntEx2(List<ASTree> c) { super(c); }
//     public int locals() { return size; }
//     public void lookupAsMethod(Symbols syms) {
//         Symbols newSyms = new Symbols(syms);
//         newSyms.putNew(SymbolThis.NAME);
//         ((ParamsEx)parameters()).lookup(newSyms);
//         ((ASTreeOptEx)revise(body())).lookup(newSyms);
//         size = newSyms.size();
//     }
// }
// 
// Path: src/chap6/Environment.java
// public interface Environment {
//     void put(String name, Object value);
//     Object get(String name);
// }
// 
// Path: src/chap9/ClassInfo.java
// public class ClassInfo {
//     protected ClassStmnt definition;
//     protected Environment environment;
//     protected ClassInfo superClass;
//     public ClassInfo(ClassStmnt cs, Environment env) {
//         definition = cs;
//         environment = env;
//         Object obj = env.get(cs.superClass());
//         if (obj == null)
//             superClass = null;
//         else if (obj instanceof ClassInfo)
//             superClass = (ClassInfo)obj;
//         else
//             throw new StoneException("unknown super class: " + cs.superClass(),
//                                      cs);
//     }
//     public String name() { return definition.name(); }
//     public ClassInfo superClass() { return superClass; }
//     public ClassBody body() { return definition.body(); }
//     public Environment environment() { return environment; }
//     @Override public String toString() { return "<class " + name() + ">"; }
// }


// Path: src/chap12/OptClassInfo.java
import java.util.ArrayList;
import stone.ast.ClassStmnt;
import stone.ast.DefStmnt;
import chap11.Symbols;
import chap12.ObjOptimizer.DefStmntEx2;
import chap6.Environment;
import chap9.ClassInfo;

package chap12;

public class OptClassInfo extends ClassInfo {
    protected Symbols methods, fields;
    protected DefStmnt[] methodDefs;