diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2013-08-26 20:08:03 +0400 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2013-08-26 20:08:03 +0400 |
commit | c93750d893e25a9f2ffd98222aa63cc3852f8a37 (patch) | |
tree | 437951b267c83acd04f6aa7e82de64cc00615b99 /source | |
parent | f157753120b0a0cce61f0f4a4f8a24c2cdd7642a (diff) |
RNA fixes regarding dynamic array properties in functions parameters (reviewed by Brecht, thanks!):
* It was not clear that RNA_parameter_length_get() & co only affected dynamic properties, renamed them to RNA_parameter_dynamic_length_get() and such.
* Fixed RNA_function_find_parameter(), we can't use BLI_findstring() here, need to call RNA_property_identifier()!
* Fixed RNA_parameter_get() and RNA_parameter_set(), which were completely wrong for dynamic properties.
* Fixed RNA_parameter_dynamic_length_get/set_data(), they did not check the property was actually a dynamic one and were using again ugly blackmagic casting intead of ParameterDynAlloc structure!
* makesrna was still using an ugly hackish (and perhaps not always working) code when handling dynamic parameters, now synchronized with RNA_parameter_dynamic_length_get_data and RNA_parameter_get code.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/makesrna/RNA_access.h | 9 | ||||
-rw-r--r-- | source/blender/makesrna/intern/makesrna.c | 7 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_access.c | 76 |
3 files changed, 71 insertions, 21 deletions
diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h index b18d3c83342..0725cea3291 100644 --- a/source/blender/makesrna/RNA_access.h +++ b/source/blender/makesrna/RNA_access.h @@ -1073,10 +1073,11 @@ void RNA_parameter_get(ParameterList *parms, PropertyRNA *parm, void **value); void RNA_parameter_get_lookup(ParameterList *parms, const char *identifier, void **value); void RNA_parameter_set(ParameterList *parms, PropertyRNA *parm, const void *value); void RNA_parameter_set_lookup(ParameterList *parms, const char *identifier, const void *value); -int RNA_parameter_length_get(ParameterList *parms, PropertyRNA *parm); -int RNA_parameter_length_get_data(ParameterList *parms, PropertyRNA *parm, void *data); -void RNA_parameter_length_set(ParameterList *parms, PropertyRNA *parm, int length); -void RNA_parameter_length_set_data(ParameterList *parms, PropertyRNA *parm, void *data, int length); +/* Only for PROP_DYNAMIC properties! */ +int RNA_parameter_dynamic_length_get(ParameterList *parms, PropertyRNA *parm); +int RNA_parameter_dynamic_length_get_data(ParameterList *parms, PropertyRNA *parm, void *data); +void RNA_parameter_dynamic_length_set(ParameterList *parms, PropertyRNA *parm, int length); +void RNA_parameter_dynamic_length_set_data(ParameterList *parms, PropertyRNA *parm, void *data, int length); int RNA_function_call(struct bContext *C, struct ReportList *reports, PointerRNA *ptr, FunctionRNA *func, ParameterList *parms); diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c index c158facca7c..4703e70b369 100644 --- a/source/blender/makesrna/intern/makesrna.c +++ b/source/blender/makesrna/intern/makesrna.c @@ -2273,11 +2273,12 @@ static void rna_def_function_funcs(FILE *f, StructDefRNA *dsrna, FunctionDefRNA valstr = "*"; } - /* this must be kept in sync with RNA_parameter_length_get_data, + /* this must be kept in sync with RNA_parameter_dynamic_length_get_data and RNA_parameter_get, * we could just call the function directly, but this is faster */ if (flag & PROP_DYNAMIC) { - fprintf(f, "\t%s_len = %s((int *)_data);\n", dparm->prop->identifier, pout ? "" : "*"); - data_str = "(&(((char *)_data)[sizeof(void *)]))"; + fprintf(f, "\t%s_len = %s((ParameterDynAlloc *)_data)->array_tot;\n", dparm->prop->identifier, + pout ? "(int *)&" : "(int)"); + data_str = "(&(((ParameterDynAlloc *)_data)->array))"; } else { data_str = "_data"; diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c index 1debcea386b..e935ff285b1 100644 --- a/source/blender/makesrna/intern/rna_access.c +++ b/source/blender/makesrna/intern/rna_access.c @@ -5357,7 +5357,14 @@ PropertyRNA *RNA_function_get_parameter(PointerRNA *UNUSED(ptr), FunctionRNA *fu PropertyRNA *RNA_function_find_parameter(PointerRNA *UNUSED(ptr), FunctionRNA *func, const char *identifier) { - return BLI_findstring(&func->cont.properties, identifier, offsetof(PropertyRNA, identifier)); + PropertyRNA *parm; + + parm = func->cont.properties.first; + for (; parm; parm = parm->next) + if (strcmp(RNA_property_identifier(parm), identifier) == 0) + break; + + return parm; } const ListBase *RNA_function_defined_parameters(FunctionRNA *func) @@ -5529,10 +5536,19 @@ void RNA_parameter_get(ParameterList *parms, PropertyRNA *parm, void **value) if (iter.parm == parm) break; - if (iter.valid) - *value = iter.data; - else + if (iter.valid) { + if (parm->flag & PROP_DYNAMIC) { + /* for dynamic arrays and strings, data is a pointer to an array */ + ParameterDynAlloc *data_alloc = iter.data; + *value = data_alloc->array; + } + else { + *value = iter.data; + } + } + else { *value = NULL; + } RNA_parameter_list_end(&iter); } @@ -5560,8 +5576,35 @@ void RNA_parameter_set(ParameterList *parms, PropertyRNA *parm, const void *valu if (iter.parm == parm) break; - if (iter.valid) - memcpy(iter.data, value, iter.size); + if (iter.valid) { + if (parm->flag & PROP_DYNAMIC) { + /* for dynamic arrays and strings, data is a pointer to an array */ + ParameterDynAlloc *data_alloc = iter.data; + size_t size = 0; + switch (parm->type) { + case PROP_STRING: + size = sizeof(char); + break; + case PROP_INT: + case PROP_BOOLEAN: + size = sizeof(int); + break; + case PROP_FLOAT: + size = sizeof(float); + break; + default: + break; + } + size *= data_alloc->array_tot; + if (data_alloc->array) + MEM_freeN(data_alloc->array); + data_alloc->array = MEM_mallocN(size, AT); + memcpy(data_alloc->array, value, size); + } + else { + memcpy(iter.data, value, iter.size); + } + } RNA_parameter_list_end(&iter); } @@ -5579,7 +5622,7 @@ void RNA_parameter_set_lookup(ParameterList *parms, const char *identifier, cons RNA_parameter_set(parms, parm, value); } -int RNA_parameter_length_get(ParameterList *parms, PropertyRNA *parm) +int RNA_parameter_dynamic_length_get(ParameterList *parms, PropertyRNA *parm) { ParameterIterator iter; int len = 0; @@ -5591,14 +5634,14 @@ int RNA_parameter_length_get(ParameterList *parms, PropertyRNA *parm) break; if (iter.valid) - len = RNA_parameter_length_get_data(parms, parm, iter.data); + len = RNA_parameter_dynamic_length_get_data(parms, parm, iter.data); RNA_parameter_list_end(&iter); return len; } -void RNA_parameter_length_set(ParameterList *parms, PropertyRNA *parm, int length) +void RNA_parameter_dynamic_length_set(ParameterList *parms, PropertyRNA *parm, int length) { ParameterIterator iter; @@ -5609,19 +5652,24 @@ void RNA_parameter_length_set(ParameterList *parms, PropertyRNA *parm, int lengt break; if (iter.valid) - RNA_parameter_length_set_data(parms, parm, iter.data, length); + RNA_parameter_dynamic_length_set_data(parms, parm, iter.data, length); RNA_parameter_list_end(&iter); } -int RNA_parameter_length_get_data(ParameterList *UNUSED(parms), PropertyRNA *UNUSED(parm), void *data) +int RNA_parameter_dynamic_length_get_data(ParameterList *UNUSED(parms), PropertyRNA *parm, void *data) { - return *((int *)((char *)data)); + if (parm->flag & PROP_DYNAMIC) { + return (int)((ParameterDynAlloc *)data)->array_tot; + } + return 0; } -void RNA_parameter_length_set_data(ParameterList *UNUSED(parms), PropertyRNA *UNUSED(parm), void *data, int length) +void RNA_parameter_dynamic_length_set_data(ParameterList *UNUSED(parms), PropertyRNA *parm, void *data, int length) { - *((int *)data) = length; + if (parm->flag & PROP_DYNAMIC) { + ((ParameterDynAlloc *)data)->array_tot = (intptr_t)length; + } } int RNA_function_call(bContext *C, ReportList *reports, PointerRNA *ptr, FunctionRNA *func, ParameterList *parms) |