[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54908] trunk/blender/source/blender: Bug fix #34436

Ton Roosendaal ton at blender.org
Wed Feb 27 15:25:40 CET 2013


Revision: 54908
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54908
Author:   ton
Date:     2013-02-27 14:25:39 +0000 (Wed, 27 Feb 2013)
Log Message:
-----------
Bug fix #34436

Two example files that crashed texture nodes. 
- On delete texture nodes, it should free the exec cache (because this cache
  stores the node pointer.
- On redo, nodes can exist can exist without typeinfo set. Exec (free) code
  was not checking for that. Don't ask me why this happens... tex nodes are weird.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/node.c
    trunk/blender/source/blender/nodes/intern/node_exec.c

Modified: trunk/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/node.c	2013-02-27 14:19:44 UTC (rev 54907)
+++ trunk/blender/source/blender/blenkernel/intern/node.c	2013-02-27 14:25:39 UTC (rev 54908)
@@ -991,6 +991,12 @@
 
 		if (treetype->free_node_cache)
 			treetype->free_node_cache(ntree, node);
+		
+		/* texture node has bad habit of keeping exec data around */
+		if (ntree->type == NTREE_TEXTURE && ntree->execdata) {
+			ntreeTexEndExecTree(ntree->execdata, 1);
+			ntree->execdata = NULL;
+		}
 	}
 	
 	/* since it is called while free database, node->id is undefined */
@@ -1040,6 +1046,7 @@
 				break;
 			case NTREE_TEXTURE:
 				ntreeTexEndExecTree(ntree->execdata, 1);
+				ntree->execdata = NULL;
 				break;
 		}
 	}

Modified: trunk/blender/source/blender/nodes/intern/node_exec.c
===================================================================
--- trunk/blender/source/blender/nodes/intern/node_exec.c	2013-02-27 14:19:44 UTC (rev 54907)
+++ trunk/blender/source/blender/nodes/intern/node_exec.c	2013-02-27 14:25:39 UTC (rev 54908)
@@ -248,8 +248,9 @@
 		MEM_freeN(exec->stack);
 	
 	for (n=0, nodeexec= exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) {
-		if (nodeexec->node->typeinfo->freeexecfunc)
-			nodeexec->node->typeinfo->freeexecfunc(nodeexec->node, nodeexec->data);
+		if (nodeexec->node->typeinfo)
+			if (nodeexec->node->typeinfo->freeexecfunc)
+				nodeexec->node->typeinfo->freeexecfunc(nodeexec->node, nodeexec->data);
 	}
 	
 	if (exec->nodeexec)




More information about the Bf-blender-cvs mailing list