RNA fixes regarding dynamic array properties in functions parameters (reviewed by...
authorBastien Montagne <montagne29@wanadoo.fr>
Mon, 26 Aug 2013 16:08:03 +0000 (16:08 +0000)
committerBastien Montagne <montagne29@wanadoo.fr>
Mon, 26 Aug 2013 16:08:03 +0000 (16:08 +0000)
* 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.

source/blender/makesrna/RNA_access.h
source/blender/makesrna/intern/makesrna.c
source/blender/makesrna/intern/rna_access.c

index b18d3c83342018d245b4510ae649ee5ddde3636a..0725cea32919eee400da381519f497af6ef6c57e 100644 (file)
@@ -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);
index c158facca7cf4512ea37703e664595d66e32ba2e..4703e70b3697a06927b2af34674c2d3620e241e5 100644 (file)
@@ -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";
index 1debcea386b8e8d8be70385c0988a9d4324f8eae..e935ff285b139a77b009ff1cd54f43a9ec994a75 100644 (file)
@@ -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)