e119936aef078f8345fcaa5016efbecba5de5b20
[repair.git] / Repair / RepairCompiler / MCC / IR / Sources.java
1 package MCC.IR;
2
3 import MCC.State;
4
5 public class Sources {
6     State state;
7
8     public Sources(State s) {
9         this.state=s;
10     }
11
12     public boolean setSource(SetDescriptor sd) {
13         if (sd.getSymbol().equals("InodeBitmapBlock"))
14             return true;
15         if (sd.getSymbol().equals("InodeTableBlock"))
16             return true;
17         if (sd.getSymbol().equals("RootDirectoryInode"))
18             return true;
19
20         return false;
21     }
22     public boolean allocSource(SetDescriptor sd) {
23         return !setSource(sd);
24     }
25     public SetDescriptor getSourceSet(SetDescriptor sd) {
26         if (sd.getSymbol().equals("InodeBitmapBlock"))
27             return (SetDescriptor)state.stSets.get("FreeBlock");
28         if (sd.getSymbol().equals("InodeTableBlock"))
29             return (SetDescriptor)state.stSets.get("FreeBlock");
30         if (sd.getSymbol().equals("RootDirectoryInode"))
31             return (SetDescriptor)state.stSets.get("FreeInode");
32         return null;
33     }
34
35     public void generateSourceAlloc(CodeWriter cr,VarDescriptor vd, SetDescriptor sd) {
36         TypeDescriptor td=sd.getType();
37         Expr e=td.getSizeExpr();
38         VarDescriptor size=VarDescriptor.makeNew("size");
39         cr.pushSymbolTable(state.stGlobals);
40         e.generate(cr, size);
41         cr.popSymbolTable();
42         cr.outputline(td.getGenerateType().getSafeSymbol()+" "+vd.getSafeSymbol()+"=("+td.getGenerateType().getSafeSymbol()+") malloc("+size.getSafeSymbol()+");");
43     }
44
45     public boolean relsetSource(RelationDescriptor rd, boolean domain) {
46         if (domain)
47             return setSource(rd.getDomain());
48         else return setSource(rd.getRange());
49     }
50     public boolean relallocSource(RelationDescriptor rd, boolean domain) {
51         if (domain)
52             return allocSource(rd.getDomain());
53         else return allocSource(rd.getRange());
54     }
55     
56     public SetDescriptor relgetSourceSet(RelationDescriptor rd, boolean domain) {
57         if (domain)
58             return getSourceSet(rd.getDomain());
59         else return getSourceSet(rd.getRange());
60     }
61     public void relgenerateSourceAlloc(CodeWriter cr,VarDescriptor vd, RelationDescriptor rd, boolean domain) {
62         SetDescriptor sd=null;
63         if (domain)
64             sd=rd.getDomain();
65         else
66             sd=rd.getRange();
67         TypeDescriptor td=sd.getType();
68         Expr e=td.getSizeExpr();
69         VarDescriptor size=VarDescriptor.makeNew("size");
70         cr.pushSymbolTable(state.stGlobals);
71         e.generate(cr, size);
72         cr.popSymbolTable();
73         cr.outputline(td.getGenerateType().getSafeSymbol()+" "+vd.getSafeSymbol()+"=("+td.getGenerateType().getSafeSymbol()+") malloc("+size.getSafeSymbol()+");");
74     }
75
76 }