separated interpreter from assembler
[fleet.git] / src / edu / berkeley / fleet / interpreter / CodeBag.java
1 package edu.berkeley.fleet.interpreter;
2 import edu.berkeley.fleet.api.*;
3 import edu.berkeley.fleet.api.Instruction;
4
5 import java.util.*;
6 import java.io.*;
7
8 /** a codebag */
9 public class CodeBag {
10
11     private static int max_allocated_descriptor = 1;
12     private static HashMap<Integer,CodeBag> codeBagsByDescriptor = new HashMap<Integer,CodeBag>();
13
14     public static CodeBag getCodeBagByDescriptor(int descriptor) {
15         return codeBagsByDescriptor.get(descriptor);
16     }
17
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>();
23
24     public CodeBag(CodeBag parent, String name) {
25         this.parent = parent;
26         this.name = name;
27         this.descriptor = max_allocated_descriptor++;
28         codeBagsByDescriptor.put(descriptor, this);
29         if (parent != null && name != null)
30             parent.add(name, this);
31     }
32
33     public void dispatch(Fleet fleet) {
34         /*
35         for(Instruction d : dispatchables) {
36             Log.dispatch(d);
37             ((Interpreter)fleet).dispatch(d);
38         }
39         */
40         throw new RuntimeException();
41     }
42
43     public void add(Instruction instr) {
44         dispatchables.add(instr);
45     }
46
47     public void add(String name, CodeBag instr) {
48         codeBags.put(name, instr);
49     }
50
51     public int getDescriptor() {
52         return descriptor;
53     }
54
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);
60     }
61
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);
66         os.flush();
67         os.close();
68     }
69
70     public String toString() {
71         if (name != null) return name;
72         StringBuffer ret = new StringBuffer();
73         for(Instruction d : dispatchables) {
74             ret.append(d);
75             ret.append("\n");
76         }
77         for(String n : codeBags.keySet()) {
78             ret.append(n + ": ");
79             ret.append(codeBags.get(n));
80             ret.append("\n");
81         }
82         return "{\n  "+Log.indent(ret.toString(), "  ")+"\n}";
83     }
84
85
86 }