1 package edu.berkeley.fleet.interpreter;
2 import edu.berkeley.fleet.api.*;
3 import edu.berkeley.fleet.api.Instruction;
11 private static int max_allocated_descriptor = 1;
12 private static HashMap<Integer,CodeBag> codeBagsByDescriptor = new HashMap<Integer,CodeBag>();
14 public static CodeBag getCodeBagByDescriptor(int descriptor) {
15 return codeBagsByDescriptor.get(descriptor);
18 private final int descriptor;
19 private final CodeBag parent;
20 private final String name;
21 private ArrayList<Instruction> dispatchables = new ArrayList<Instruction>();
22 private HashMap<String,CodeBag> codeBags = new HashMap<String,CodeBag>();
24 public CodeBag(CodeBag parent, String name) {
27 this.descriptor = max_allocated_descriptor++;
28 codeBagsByDescriptor.put(descriptor, this);
29 if (parent != null && name != null)
30 parent.add(name, this);
33 public void dispatch(Fleet fleet) {
35 for(Instruction d : dispatchables) {
37 ((Interpreter)fleet).dispatch(d);
40 throw new RuntimeException();
43 public void add(Instruction instr) {
44 dispatchables.add(instr);
47 public void add(String name, CodeBag instr) {
48 codeBags.put(name, instr);
51 public int getDescriptor() {
55 public CodeBag getCodeBag(String name) {
56 CodeBag ret = codeBags.get(name);
57 if (ret != null) return ret;
58 if (parent==null) return null;
59 return parent.getCodeBag(name);
62 public void dump(Fleet fleet) throws Exception {
63 DataOutputStream os = new DataOutputStream(new FileOutputStream("fleet.bin"));
64 for(Instruction i : dispatchables)
65 fleet.writeInstruction(os, i);
70 public String toString() {
71 if (name != null) return name;
72 StringBuffer ret = new StringBuffer();
73 for(Instruction d : dispatchables) {
77 for(String n : codeBags.keySet()) {
79 ret.append(codeBags.get(n));
82 return "{\n "+Log.indent(ret.toString(), " ")+"\n}";