diff options
author | Campbell Barton <ideasman42@gmail.com> | 2011-01-11 20:01:12 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2011-01-11 20:01:12 +0300 |
commit | 1d4f1d2e41e19f22a14883434aa60f5b706cf04b (patch) | |
tree | 0825feff91dfb7f38a1bf7d16678c67ac436a230 /source/blender/makesrna | |
parent | c603fa9f7d893de2244e45989fd9191a74b02e8b (diff) |
bugfix - collection index lookups was not working correctly when some items were skipped.
Diffstat (limited to 'source/blender/makesrna')
-rw-r--r-- | source/blender/makesrna/intern/makesrna.c | 22 |
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"); |