Dan was leaking memory via iterators... This leak is fixed now (stack allocation...
authorbdemsky <bdemsky>
Fri, 27 Feb 2004 08:22:55 +0000 (08:22 +0000)
committerbdemsky <bdemsky>
Fri, 27 Feb 2004 08:22:55 +0000 (08:22 +0000)
Repair/RepairCompiler/MCC/IR/RelationQuantifier.java
Repair/RepairCompiler/MCC/IR/SetQuantifier.java
Repair/RepairCompiler/MCC/SimpleHash.cc
Repair/RepairCompiler/MCC/SimpleHash.h

index 66b79f52141e0e1d3b578dbf012ae12eeeda7820..0b92f2e86d73bcbd8058c847ea1f899afd3d6b40 100755 (executable)
@@ -33,11 +33,12 @@ public class RelationQuantifier extends Quantifier {
     }
 
     public void generate_open(CodeWriter writer) {
-        writer.outputline("for (SimpleIterator* " + x.getSafeSymbol() + "_iterator = " + relation.getSafeSymbol() + "_hash->iterator(); " + x.getSafeSymbol() + "_iterator->hasNext(); )");
+       writer.outputline("SimpleIterator "+x.getSafeSymbol()+"_iterator;");
+        writer.outputline("for ("+relation.getSafeSymbol() + "_hash->iterator(&"+x.getSafeSymbol()+"_iterator); " + x.getSafeSymbol() + "_iterator.hasNext(); )");
         writer.startblock();
-        writer.outputline(y.getType().getGenerateType() + " " + y.getSafeSymbol() + " = (" + y.getType().getGenerateType() + ") " + x.getSafeSymbol() + "_iterator->next();");        
+        writer.outputline(y.getType().getGenerateType() + " " + y.getSafeSymbol() + " = (" + y.getType().getGenerateType() + ") " + x.getSafeSymbol() + "_iterator.next();");        
         // #ATTN#: key is called second because next() forwards ptr and key does not! 
-        writer.outputline(x.getType().getGenerateType() + " " + x.getSafeSymbol() + " = (" + x.getType().getGenerateType() + ") " + x.getSafeSymbol() + "_iterator->key();");
+        writer.outputline(x.getType().getGenerateType() + " " + x.getSafeSymbol() + " = (" + x.getType().getGenerateType() + ") " + x.getSafeSymbol() + "_iterator.key();");
     }
 
     public void generate_open(CodeWriter writer, String type,int number, String left,String right) {
index 9d03c8a16bba0cdd603de5c50db8864cae6dbb01..0cba1d1ac97ab0a94d89c1d1788fa96bc533ea7a 100755 (executable)
@@ -38,19 +38,21 @@ public class SetQuantifier extends Quantifier {
     }
 
     public void generate_open(CodeWriter writer) {
-        writer.outputline("for (SimpleIterator* " + var.getSafeSymbol() + "_iterator = " + set.getSafeSymbol() + "_hash->iterator(); " + var.getSafeSymbol() + "_iterator->hasNext(); )");
+       writer.outputline("SimpleIterator "+var.getSafeSymbol()+"_iterator;");
+        writer.outputline("for (" + set.getSafeSymbol() + "_hash->iterator(&"+var.getSafeSymbol()+"_iterator); " + var.getSafeSymbol() + "_iterator.hasNext(); )");
         writer.startblock();
-        writer.outputline(var.getType().getGenerateType() + " " + var.getSafeSymbol() + " = (" + var.getType().getGenerateType() + ") " + var.getSafeSymbol() + "_iterator->next();");
+        writer.outputline(var.getType().getGenerateType() + " " + var.getSafeSymbol() + " = (" + var.getType().getGenerateType() + ") " + var.getSafeSymbol() + "_iterator.next();");
     }
   
     public void generate_open(CodeWriter writer, String type,int number, String left,String right) {
        VarDescriptor tmp=VarDescriptor.makeNew("flag");
-        writer.outputline("SimpleIterator* " + var.getSafeSymbol() + "_iterator = " + set.getSafeSymbol() + "_hash->iterator();");
+       writer.outputline("SimpleIterator "+var.getSafeSymbol()+"_iterator;");
+        writer.outputline(set.getSafeSymbol() + "_hash->iterator("+var.getSafeSymbol()+"_iterator);");
        writer.outputline("int "+tmp.getSafeSymbol()+"=0;");
        writer.outputline("if ("+type+"=="+number+")");
        writer.outputline(tmp.getSafeSymbol()+"=1;");
 
-       writer.outputline("while("+tmp.getSafeSymbol()+"||(("+type+"!="+number+")&&"+var.getSafeSymbol() + "_iterator->hasNext()))");
+       writer.outputline("while("+tmp.getSafeSymbol()+"||(("+type+"!="+number+")&&"+var.getSafeSymbol() + "_iterator.hasNext()))");
         writer.startblock();
         writer.outputline(var.getType().getGenerateType() + " " + var.getSafeSymbol() + ";");
        writer.outputline("if ("+type+"=="+number+")");
@@ -59,7 +61,7 @@ public class SetQuantifier extends Quantifier {
         writer.outputline(var.getSafeSymbol() + " = (" + var.getType().getGenerateType() + ") " + left + ";");
        writer.endblock();
        writer.outputline("else");
-        writer.outputline(var.getSafeSymbol() + " = (" + var.getType().getGenerateType() + ") " + var.getSafeSymbol() + "_iterator->next();");
+        writer.outputline(var.getSafeSymbol() + " = (" + var.getType().getGenerateType() + ") " + var.getSafeSymbol() + "_iterator.next();");
     }
   
     public int generate_worklistload(CodeWriter writer, int offset) {        
index c3e21654c368e6de4bee528a605a692ff7e5949d..72065716343abc24a4d92343a1098531671dc25f 100755 (executable)
@@ -138,6 +138,12 @@ SimpleIterator* SimpleHash::iterator() {
   return new SimpleIterator(listhead,this);
 }
 
+void SimpleHash::iterator(SimpleIterator & it) {
+  it.table=this;
+  it.cur=listhead;
+  it.index=0;
+}
+
 SimpleHash::SimpleHash(int size) {
     if (size <= 0) {
         throw SimpleHashException();
index 82b2821ea7fabe280a871f120e7970ee26bf345f..50020d87d2d59328f4456a40974b5f7a4fd31a59 100755 (executable)
@@ -89,6 +89,7 @@ public:
     void addParent(SimpleHash* parent);
     int firstkey();
     SimpleIterator* iterator();
+    void iterator(SimpleIterator & it);
     inline int count() {
         return numelements;
     }
@@ -116,13 +117,12 @@ struct ArraySimple {
 
 
 class SimpleIterator {
-
-private:
+ public:
 
   struct ArraySimple *cur;
   int index;
   SimpleHash * table;
-public:
+  inline SimpleIterator() {}
 
   inline SimpleIterator(struct ArraySimple *start, SimpleHash *t) {
     cur = start;