Bugs:
[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         SetDescriptor usedblock=(SetDescriptor)state.stSets.get("UsedBlock");
14         SetDescriptor usedinode=(SetDescriptor)state.stSets.get("UsedInode");
15
16         if (usedblock!=null&&usedblock.isSubset(sd))
17             return true;
18         if (usedinode!=null&&usedinode.isSubset(sd))
19             return true;
20
21         return false;
22     }
23     public boolean allocSource(SetDescriptor sd) {
24         return !setSource(sd);
25     }
26     public SetDescriptor getSourceSet(SetDescriptor sd) {
27         SetDescriptor usedblock=(SetDescriptor)state.stSets.get("UsedBlock");
28         SetDescriptor usedinode=(SetDescriptor)state.stSets.get("UsedInode");
29
30         if (usedblock!=null&&usedblock.isSubset(sd))
31             return (SetDescriptor)state.stSets.get("FreeBlock");
32         if (usedinode!=null&&usedinode.isSubset(sd))
33             return (SetDescriptor)state.stSets.get("FreeInode");
34
35         return null;
36     }
37
38     public void generateSourceAlloc(CodeWriter cr,VarDescriptor vd, SetDescriptor sd) {
39         TypeDescriptor td=sd.getType();
40         Expr e=td.getSizeExpr();
41         VarDescriptor size=VarDescriptor.makeNew("size");
42         cr.pushSymbolTable(state.stGlobals);
43         e.generate(cr, size);
44         cr.popSymbolTable();
45         cr.outputline(td.getGenerateType().getSafeSymbol()+" "+vd.getSafeSymbol()+"=("+td.getGenerateType().getSafeSymbol()+") malloc("+size.getSafeSymbol()+");");
46     }
47
48     public boolean relsetSource(RelationDescriptor rd, boolean domain) {
49         if (domain)
50             return setSource(rd.getDomain());
51         else return setSource(rd.getRange());
52     }
53     public boolean relallocSource(RelationDescriptor rd, boolean domain) {
54         if (domain)
55             return allocSource(rd.getDomain());
56         else return allocSource(rd.getRange());
57     }
58     
59     public SetDescriptor relgetSourceSet(RelationDescriptor rd, boolean domain) {
60         if (domain)
61             return getSourceSet(rd.getDomain());
62         else return getSourceSet(rd.getRange());
63     }
64     public void relgenerateSourceAlloc(CodeWriter cr,VarDescriptor vd, RelationDescriptor rd, boolean domain) {
65         SetDescriptor sd=null;
66         if (domain)
67             sd=rd.getDomain();
68         else
69             sd=rd.getRange();
70         TypeDescriptor td=sd.getType();
71         Expr e=td.getSizeExpr();
72         VarDescriptor size=VarDescriptor.makeNew("size");
73         cr.pushSymbolTable(state.stGlobals);
74         e.generate(cr, size);
75         cr.popSymbolTable();
76         cr.outputline(td.getGenerateType().getSafeSymbol()+" "+vd.getSafeSymbol()+"=("+td.getGenerateType().getSafeSymbol()+") malloc("+size.getSafeSymbol()+");");
77     }
78
79 }