[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [35207] branches/soc-2008-mxcurioni/source /blender/freestyle/intern/stroke/Operators.cpp: Fixed possible memory leaks due to errors in user-defined style modules.

Tamito Kajiyama rd6t-kjym at asahi-net.or.jp
Sat Feb 26 23:11:41 CET 2011


Revision: 35207
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35207
Author:   kjym3
Date:     2011-02-26 22:11:40 +0000 (Sat, 26 Feb 2011)
Log Message:
-----------
Fixed possible memory leaks due to errors in user-defined style modules.

Error handling in Operators::Chain(), Operators::bidirectionalChain(), and
Operators::create() was improved to release allocated data structures when
errors raised in user-defined predicates, chaining iterators, and shaders.

Modified Paths:
--------------
    branches/soc-2008-mxcurioni/source/blender/freestyle/intern/stroke/Operators.cpp

Modified: branches/soc-2008-mxcurioni/source/blender/freestyle/intern/stroke/Operators.cpp
===================================================================
--- branches/soc-2008-mxcurioni/source/blender/freestyle/intern/stroke/Operators.cpp	2011-02-26 20:21:09 UTC (rev 35206)
+++ branches/soc-2008-mxcurioni/source/blender/freestyle/intern/stroke/Operators.cpp	2011-02-26 22:11:40 UTC (rev 35207)
@@ -78,13 +78,13 @@
 
   unsigned id = 0;
   ViewEdge* edge;
-  //soc unused - Chain* new_chain;
+  I1DContainer new_chains_set;
 
   for (I1DContainer::iterator it_edge = _current_view_edges_set.begin();
        it_edge != _current_view_edges_set.end();
        ++it_edge) {
 	if (pred(**it_edge) < 0)
-	  return -1;
+	  goto error;
 	if (pred.result)
       continue;
 
@@ -97,25 +97,36 @@
       new_chain->push_viewedge_back(*it, it.getOrientation());
 	  if (modifier(**it) < 0) {
 		delete new_chain;
-		return -1;
+		goto error;
 	  }
       ++it;
 	  if (it.isEnd())
 		break;
 	  if (pred(**it) < 0) {
 		delete new_chain;
-		return -1;
+		goto error;
 	  }
 	  if (pred.result)
 	    break;
 	}
-
-    _current_chains_set.push_back(new_chain);
+    new_chains_set.push_back(new_chain);
   }
-
-  if (!_current_chains_set.empty())
+  
+  if (!new_chains_set.empty()) {
+	for (I1DContainer::iterator it = new_chains_set.begin(); it != new_chains_set.end(); ++it) {
+	  _current_chains_set.push_back(*it);
+	}
+	new_chains_set.clear();
     _current_set = &_current_chains_set;
+  }
   return 0;
+
+error:
+  for (I1DContainer::iterator it = new_chains_set.begin(); it != new_chains_set.end(); ++it) {
+	delete (*it);
+  }
+  new_chains_set.clear();
+  return -1;
 }
 
 
@@ -127,19 +138,18 @@
   unsigned id = 0;
   Functions1D::IncrementChainingTimeStampF1D ts;
   Predicates1D::EqualToChainingTimeStampUP1D pred_ts(TimeStamp::instance()->getTimeStamp()+1);
-
   ViewEdge* edge;
-  //soc Chain* new_chain;
+  I1DContainer new_chains_set;
 
   for (I1DContainer::iterator it_edge = _current_view_edges_set.begin();
        it_edge != _current_view_edges_set.end();
        ++it_edge) {
 	if (pred(**it_edge) < 0)
-	  return -1;
+	  goto error;
     if (pred.result)
 	  continue;
 	if (pred_ts(**it_edge) < 0)
-	  return -1;
+	  goto error;
 	if (pred_ts.result)
       continue;
 
@@ -156,24 +166,35 @@
 		break;
 	  if (pred(**it) < 0) {
 		delete new_chain;
-		return -1;
+	    goto error;
 	  }
 	  if (pred.result)
 		break;
 	  if (pred_ts(**it) < 0) {
 		delete new_chain;
-		return -1;
+	    goto error;
 	  }
 	  if (pred_ts.result)
 		break;
 	}
-
-    _current_chains_set.push_back(new_chain);
+    new_chains_set.push_back(new_chain);
   }
-
-  if (!_current_chains_set.empty())
+  
+  if (!new_chains_set.empty()) {
+	for (I1DContainer::iterator it = new_chains_set.begin(); it != new_chains_set.end(); ++it) {
+	  _current_chains_set.push_back(*it);
+	}
+	new_chains_set.clear();
     _current_set = &_current_chains_set;
+  }
   return 0;
+
+error:
+  for (I1DContainer::iterator it = new_chains_set.begin(); it != new_chains_set.end(); ++it) {
+	delete (*it);
+  }
+  new_chains_set.clear();
+  return -1;
 }
 
 
@@ -272,19 +293,18 @@
   unsigned id = 0;
   Functions1D::IncrementChainingTimeStampF1D ts;
   Predicates1D::EqualToChainingTimeStampUP1D pred_ts(TimeStamp::instance()->getTimeStamp()+1);
-  
   ViewEdge* edge;
-  //soc unused - Chain* new_chain;
-  
+  I1DContainer new_chains_set;
+
   for (I1DContainer::iterator it_edge = _current_view_edges_set.begin();
   it_edge != _current_view_edges_set.end();
   ++it_edge) {
 	if (pred(**it_edge) < 0)
-	  return -1;
+	  goto error;
     if (pred.result)
       continue;
 	if (pred_ts(**it_edge) < 0)
-	  return -1;
+	  goto error;
     if (pred_ts.result)
       continue;
     
@@ -294,22 +314,22 @@
     it.setCurrentEdge(edge);
     it.setOrientation(true);
     if (it.init() < 0)
-	  return -1;
+	  goto error;
     
     Chain* new_chain = new Chain(id);++id;
     //ViewEdgeIterator it_back(it);--it_back;//FIXME
     for (;;) {
       new_chain->push_viewedge_back(*it, it.getOrientation());
       ts(**it);
-	  if (it.increment() < 0) { // FIXME
+	  if (it.increment() < 0) {
 	    delete new_chain;
-		return -1;
+	    goto error;
 	  }
 	  if (it.isEnd())
 		break;
 	  if (pred(**it) < 0) {
 	    delete new_chain;
-		return -1;
+	    goto error;
 	  }
 	  if (pred.result)
 		break;
@@ -317,30 +337,42 @@
     it.setBegin(edge);
     it.setCurrentEdge(edge);
     it.setOrientation(true);
-	if (it.decrement() < 0) { // FIXME
+	if (it.decrement() < 0) {
 	  delete new_chain;
-	  return -1;
+	  goto error;
 	}
     while (!it.isEnd()) {
 	  if (pred(**it) < 0) {
 	    delete new_chain;
-		return -1;
+	    goto error;
 	  }
 	  if (pred.result)
 		break;
       new_chain->push_viewedge_front(*it, it.getOrientation());
       ts(**it);
-	  if (it.decrement() < 0) { // FIXME
+	  if (it.decrement() < 0) {
 	    delete new_chain;
-		return -1;
+	    goto error;
 	  }
     }
-    _current_chains_set.push_back(new_chain);
+    new_chains_set.push_back(new_chain);
   }
   
-  if (!_current_chains_set.empty())
+  if (!new_chains_set.empty()) {
+	for (I1DContainer::iterator it = new_chains_set.begin(); it != new_chains_set.end(); ++it) {
+	  _current_chains_set.push_back(*it);
+	}
+	new_chains_set.clear();
     _current_set = &_current_chains_set;
+  }
   return 0;
+
+error:
+  for (I1DContainer::iterator it = new_chains_set.begin(); it != new_chains_set.end(); ++it) {
+	delete (*it);
+  }
+  new_chains_set.clear();
+  return -1;
 }
 
 int Operators::bidirectionalChain(ChainingIterator& it) {
@@ -350,15 +382,14 @@
   unsigned id = 0;
   Functions1D::IncrementChainingTimeStampF1D ts;
   Predicates1D::EqualToChainingTimeStampUP1D pred_ts(TimeStamp::instance()->getTimeStamp()+1);
-  
   ViewEdge* edge;
-  //soc unused - Chain* new_chain;
+  I1DContainer new_chains_set;
   
   for (I1DContainer::iterator it_edge = _current_view_edges_set.begin();
   it_edge != _current_view_edges_set.end();
   ++it_edge) {
     if (pred_ts(**it_edge) < 0)
-	  return -1;
+	  goto error;
 	if (pred_ts.result)
       continue;
     
@@ -368,7 +399,7 @@
     it.setCurrentEdge(edge);
     it.setOrientation(true);
     if (it.init() < 0)
-	  return -1;
+	  goto error;
     
     Chain* new_chain = new Chain(id);++id;
     //ViewEdgeIterator it_back(it);--it_back;//FIXME
@@ -377,7 +408,7 @@
       ts(**it);
 	  if (it.increment() < 0) { // FIXME
 		delete new_chain;
-		return -1;
+	    goto error;
 	  }
     } while (!it.isEnd());
     it.setBegin(edge);
@@ -385,22 +416,34 @@
     it.setOrientation(true);
 	if (it.decrement() < 0) { // FIXME
 	  delete new_chain;
-	  return -1;
+	  goto error;
 	}
     while (!it.isEnd()) {
       new_chain->push_viewedge_front(*it, it.getOrientation());
       ts(**it);
 	  if (it.decrement() < 0) { // FIXME
 		delete new_chain;
-		return -1;
+	    goto error;
 	  }
     }
-    _current_chains_set.push_back(new_chain);
+    new_chains_set.push_back(new_chain);
   }
   
-  if (!_current_chains_set.empty())
+  if (!new_chains_set.empty()) {
+	for (I1DContainer::iterator it = new_chains_set.begin(); it != new_chains_set.end(); ++it) {
+	  _current_chains_set.push_back(*it);
+	}
+	new_chains_set.clear();
     _current_set = &_current_chains_set;
+  }
   return 0;
+
+error:
+  for (I1DContainer::iterator it = new_chains_set.begin(); it != new_chains_set.end(); ++it) {
+	delete (*it);
+  }
+  new_chains_set.clear();
+  return -1;
 }
 
 int Operators::sequentialSplit(UnaryPredicate0D& pred, 
@@ -1060,23 +1103,38 @@
     cerr << "Warning: current set empty" << endl;
     return 0;
   }
+  StrokesContainer new_strokes_set;
   for (Operators::I1DContainer::iterator it = _current_set->begin();
        it != _current_set->end();
        ++it) {
 	if (pred(**it) < 0)
-	  return -1;
+	  goto error;
     if (!pred.result)
       continue;
 	
 	Stroke* stroke = createStroke(**it);
     if (stroke) {
-      if (applyShading(*stroke, shaders) < 0)
-		  return -1;
+	  if (applyShading(*stroke, shaders) < 0) {
+		  delete stroke;
+		  goto error;
+	  }
       //canvas->RenderStroke(stroke);
-      _current_strokes_set.push_back(stroke);
+      new_strokes_set.push_back(stroke);
     }
   }
+  
+  for (StrokesContainer::iterator it = new_strokes_set.begin(); it != new_strokes_set.end(); ++it) {
+    _current_strokes_set.push_back(*it);
+  }
+  new_strokes_set.clear();
   return 0;
+
+error:
+  for (StrokesContainer::iterator it = new_strokes_set.begin(); it != new_strokes_set.end(); ++it) {
+	delete (*it);
+  }
+  new_strokes_set.clear();
+  return -1;
 }
 
 




More information about the Bf-blender-cvs mailing list