Fixed a memory leak in the runtime...Print neater text.
[repair.git] / Repair / RepairCompiler / MCC / IR / SumExpr.java
1 package MCC.IR;
2
3 import java.util.*;
4
5 public class SumExpr extends Expr {
6
7     SetDescriptor sd;
8     RelationDescriptor rd;
9
10
11     public SumExpr(SetDescriptor sd, RelationDescriptor rd) {
12         if (sd == null||rd==null) {
13             throw new NullPointerException();
14         }
15         this.sd=sd;
16         this.rd=rd;
17     }
18
19     public String name() {
20         return "sum("+sd.toString()+"."+rd.toString()+")";
21     }
22
23     public boolean equals(Map remap, Expr e) {
24         if (e==null||!(e instanceof SumExpr))
25             return false;
26         SumExpr se=(SumExpr)e;
27         return (se.sd==sd)&&(se.rd==rd);
28     }
29
30     public boolean usesDescriptor(Descriptor d) {
31         return (sd==d)||(rd==d);
32     }
33
34     public Set useDescriptor(Descriptor d) {
35         HashSet newset=new HashSet();
36         if ((d==sd)||(d==rd))
37             newset.add(this);
38         return newset;
39     }
40
41     public Descriptor getDescriptor() {
42         throw new Error("Sum shouldn't appear on left hand side!");
43     }
44
45     public boolean inverted() {
46         return false;
47     }
48
49     public Set getRequiredDescriptors() {
50         HashSet v=new HashSet();
51         v.add(sd);
52         v.add(rd);
53         return v;
54     }
55
56     public void generate(CodeWriter writer, VarDescriptor dest) {
57         writer.addDeclaration("int",dest.getSafeSymbol());
58         writer.outputline(dest.getSafeSymbol()+"=0;");
59
60
61         VarDescriptor itvd=VarDescriptor.makeNew("iterator");
62         writer.addDeclaration("struct SimpleIterator",itvd.getSafeSymbol());
63         writer.outputline("SimpleHashiterator("+sd.getSafeSymbol()+"_hash , &"+itvd.getSafeSymbol()+");");
64         writer.outputline("while (hasNext(&"+itvd.getSafeSymbol()+")) {");
65         VarDescriptor keyvd=VarDescriptor.makeNew("key");
66         writer.addDeclaration("int",keyvd.getSafeSymbol());
67         writer.outputline(keyvd.getSafeSymbol()+"=next(&"+itvd.getSafeSymbol()+");");
68         VarDescriptor tmpvar=VarDescriptor.makeNew("tmp");
69         writer.addDeclaration("int",tmpvar.getSafeSymbol());
70         writer.outputline("SimpleHashget("+rd.getSafeSymbol()+"_hash, "+keyvd.getSafeSymbol()+", &"+tmpvar.getSafeSymbol()+");");
71         writer.outputline(dest.getSafeSymbol()+"+="+tmpvar.getSafeSymbol()+";");
72         writer.outputline("}");
73     }
74
75     public void prettyPrint(PrettyPrinter pp) {
76         pp.output("sum(");
77         pp.output(sd.toString());
78         pp.output(".");
79         pp.output(rd.toString());
80         pp.output(")");
81     }
82
83     public TypeDescriptor typecheck(SemanticAnalyzer sa) {
84         this.td = ReservedTypeDescriptor.INT;
85         return this.td;
86     }
87
88     public Set getInversedRelations() {
89         return new HashSet();
90     }
91
92 }