[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [34262] trunk/blender/source/blender/ makesrna/intern/makesrna.c: bugfix - collection index lookups was not working correctly when some items were skipped .

Campbell Barton ideasman42 at gmail.com
Tue Jan 11 18:01:12 CET 2011


Revision: 34262
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=34262
Author:   campbellbarton
Date:     2011-01-11 17:01:12 +0000 (Tue, 11 Jan 2011)
Log Message:
-----------
bugfix - collection index lookups was not working correctly when some items were skipped.

Modified Paths:
--------------
    trunk/blender/source/blender/makesrna/intern/makesrna.c

Modified: trunk/blender/source/blender/makesrna/intern/makesrna.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/makesrna.c	2011-01-11 14:39:14 UTC (rev 34261)
+++ trunk/blender/source/blender/makesrna/intern/makesrna.c	2011-01-11 17:01:12 UTC (rev 34262)
@@ -978,7 +978,7 @@
 	fprintf(f, "	CollectionPropertyIterator iter;\n\n");
 
 	fprintf(f, "	%s_%s_begin(&iter, ptr);\n\n", srna->identifier, prop->identifier);
-	fprintf(f, "	{\n");
+	fprintf(f, "	if(iter.valid){\n");
 
 	if(strcmp(nextfunc, "rna_iterator_array_next") == 0) {
 		fprintf(f, "		ArrayIterator *internal= iter.internal;\n");
@@ -990,12 +990,10 @@
 		fprintf(f, "#endif\n");
 		fprintf(f, "		}\n");
 		fprintf(f, "		else if(internal->skip) {\n");
-		fprintf(f, "			while(index-- > 0) {\n");
-		fprintf(f, "				do {\n");
-		fprintf(f, "					internal->ptr += internal->itemsize;\n");
-		fprintf(f, "				} while(internal->skip(&iter, internal->ptr));\n");
+		fprintf(f, "			while(index-- > 0 && iter.valid) {\n");
+		fprintf(f, "				rna_iterator_array_next(&iter);\n");
 		fprintf(f, "			}\n");
-		fprintf(f, "			found= 1;\n");
+		fprintf(f, "			found= (index == -1 && iter.valid);\n");
 		fprintf(f, "		}\n");
 		fprintf(f, "		else {\n");
 		fprintf(f, "			internal->ptr += internal->itemsize*index;\n");
@@ -1005,22 +1003,20 @@
 	else if(strcmp(nextfunc, "rna_iterator_listbase_next") == 0) {
 		fprintf(f, "		ListBaseIterator *internal= iter.internal;\n");
 		fprintf(f, "		if(internal->skip) {\n");
-		fprintf(f, "			while(index-- > 0) {\n");
-		fprintf(f, "				do {\n");
-		fprintf(f, "					internal->link= internal->link->next;\n");
-		fprintf(f, "				} while(internal->skip(&iter, internal->link));\n");
+		fprintf(f, "			while(index-- > 0 && iter.valid) {\n");
+		fprintf(f, "				rna_iterator_listbase_next(&iter);\n");
 		fprintf(f, "			}\n");
+		fprintf(f, "			found= (index == -1 && iter.valid);\n");
 		fprintf(f, "		}\n");
 		fprintf(f, "		else {\n");
 		fprintf(f, "			while(index-- > 0 && internal->link)\n");
 		fprintf(f, "				internal->link= internal->link->next;\n");
+		fprintf(f, "			found= 1;\n");
 		fprintf(f, "		}\n");
-		fprintf(f, "		found= (index == -1);\n");
 	}
 
+	fprintf(f, "		if(found) *r_ptr = %s_%s_get(&iter);\n", srna->identifier, prop->identifier);
 	fprintf(f, "	}\n\n");
-
-	fprintf(f, "	if(found) *r_ptr = %s_%s_get(&iter);\n", srna->identifier, prop->identifier);
 	fprintf(f, "	%s_%s_end(&iter);\n\n", srna->identifier, prop->identifier);
 
 	fprintf(f, "	return found;\n");




More information about the Bf-blender-cvs mailing list