[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59531] trunk/blender/source/blender/ makesrna: RNA fixes regarding dynamic array properties in functions parameters ( reviewed by Brecht, thanks!):

Bastien Montagne montagne29 at wanadoo.fr
Mon Aug 26 18:08:04 CEST 2013


Revision: 59531
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59531
Author:   mont29
Date:     2013-08-26 16:08:03 +0000 (Mon, 26 Aug 2013)
Log Message:
-----------
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.

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

Modified: trunk/blender/source/blender/makesrna/RNA_access.h
===================================================================
--- trunk/blender/source/blender/makesrna/RNA_access.h	2013-08-26 15:43:34 UTC (rev 59530)
+++ trunk/blender/source/blender/makesrna/RNA_access.h	2013-08-26 16:08:03 UTC (rev 59531)
@@ -1073,10 +1073,11 @@
 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);

Modified: trunk/blender/source/blender/makesrna/intern/makesrna.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/makesrna.c	2013-08-26 15:43:34 UTC (rev 59530)
+++ trunk/blender/source/blender/makesrna/intern/makesrna.c	2013-08-26 16:08:03 UTC (rev 59531)
@@ -2273,11 +2273,12 @@
 				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";

Modified: trunk/blender/source/blender/makesrna/intern/rna_access.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_access.c	2013-08-26 15:43:34 UTC (rev 59530)
+++ trunk/blender/source/blender/makesrna/intern/rna_access.c	2013-08-26 16:08:03 UTC (rev 59531)
@@ -5357,7 +5357,14 @@
 
 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 @@
 		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 @@
 		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 @@
 		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 @@
 			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 @@
 			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)




More information about the Bf-blender-cvs mailing list