From: bdemsky Date: Fri, 27 Feb 2004 08:22:55 +0000 (+0000) Subject: Dan was leaking memory via iterators... This leak is fixed now (stack allocation... X-Git-Url: http://plrg.eecs.uci.edu/git/?p=repair.git;a=commitdiff_plain;h=cdbeae72f42e602f49dcec462214274ad764e94e Dan was leaking memory via iterators... This leak is fixed now (stack allocation of iterators). --- diff --git a/Repair/RepairCompiler/MCC/IR/RelationQuantifier.java b/Repair/RepairCompiler/MCC/IR/RelationQuantifier.java index 66b79f5..0b92f2e 100755 --- a/Repair/RepairCompiler/MCC/IR/RelationQuantifier.java +++ b/Repair/RepairCompiler/MCC/IR/RelationQuantifier.java @@ -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) { diff --git a/Repair/RepairCompiler/MCC/IR/SetQuantifier.java b/Repair/RepairCompiler/MCC/IR/SetQuantifier.java index 9d03c8a..0cba1d1 100755 --- a/Repair/RepairCompiler/MCC/IR/SetQuantifier.java +++ b/Repair/RepairCompiler/MCC/IR/SetQuantifier.java @@ -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) { diff --git a/Repair/RepairCompiler/MCC/SimpleHash.cc b/Repair/RepairCompiler/MCC/SimpleHash.cc index c3e2165..7206571 100755 --- a/Repair/RepairCompiler/MCC/SimpleHash.cc +++ b/Repair/RepairCompiler/MCC/SimpleHash.cc @@ -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(); diff --git a/Repair/RepairCompiler/MCC/SimpleHash.h b/Repair/RepairCompiler/MCC/SimpleHash.h index 82b2821..50020d8 100755 --- a/Repair/RepairCompiler/MCC/SimpleHash.h +++ b/Repair/RepairCompiler/MCC/SimpleHash.h @@ -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;