Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2011-01-11 20:01:12 +0300
committerCampbell Barton <ideasman42@gmail.com>2011-01-11 20:01:12 +0300
commit1d4f1d2e41e19f22a14883434aa60f5b706cf04b (patch)
tree0825feff91dfb7f38a1bf7d16678c67ac436a230 /source/blender/makesrna/intern/makesrna.c
parentc603fa9f7d893de2244e45989fd9191a74b02e8b (diff)
bugfix - collection index lookups was not working correctly when some items were skipped.
Diffstat (limited to 'source/blender/makesrna/intern/makesrna.c')
-rw-r--r--source/blender/makesrna/intern/makesrna.c22
1 files changed, 9 insertions, 13 deletions
diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c
index 1e5024b35db..2036833fa37 100644
--- a/source/blender/makesrna/intern/makesrna.c
+++ b/source/blender/makesrna/intern/makesrna.c
@@ -978,7 +978,7 @@ static char *rna_def_property_lookup_int_func(FILE *f, StructRNA *srna, Property
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 @@ static char *rna_def_property_lookup_int_func(FILE *f, StructRNA *srna, Property
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 @@ static char *rna_def_property_lookup_int_func(FILE *f, StructRNA *srna, Property
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");