[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25666] trunk/blender/source/blender: support for multiple return values from rna functions & support for returning arrays , (no functions are using this yet).

Campbell Barton ideasman42 at gmail.com
Sat Jan 2 11:42:38 CET 2010


Revision: 25666
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25666
Author:   campbellbarton
Date:     2010-01-02 11:42:38 +0100 (Sat, 02 Jan 2010)

Log Message:
-----------
support for multiple return values from rna functions & support for returning arrays, (no functions are using this yet).
patch from Elia Sarti, (vekoon) with some modifications mainly for the python api.

- multiple values are returned as a typle in the order that are defined.
- added support for registered types returning multiple arguments (untested).
- renamed func->ret --> func->c_ret, since this only defines what the C function returns.

Modified Paths:
--------------
    trunk/blender/source/blender/makesrna/RNA_access.h
    trunk/blender/source/blender/makesrna/RNA_define.h
    trunk/blender/source/blender/makesrna/intern/makesrna.c
    trunk/blender/source/blender/makesrna/intern/rna_access.c
    trunk/blender/source/blender/makesrna/intern/rna_define.c
    trunk/blender/source/blender/makesrna/intern/rna_internal_types.h
    trunk/blender/source/blender/python/intern/bpy_rna.c

Modified: trunk/blender/source/blender/makesrna/RNA_access.h
===================================================================
--- trunk/blender/source/blender/makesrna/RNA_access.h	2010-01-02 09:32:32 UTC (rev 25665)
+++ trunk/blender/source/blender/makesrna/RNA_access.h	2010-01-02 10:42:38 UTC (rev 25666)
@@ -854,7 +854,6 @@
 /* Function */
 
 const char *RNA_function_identifier(FunctionRNA *func);
-PropertyRNA *RNA_function_return(FunctionRNA *func);
 const char *RNA_function_ui_description(FunctionRNA *func);
 int RNA_function_flag(FunctionRNA *func);
 int RNA_function_defined(FunctionRNA *func);

Modified: trunk/blender/source/blender/makesrna/RNA_define.h
===================================================================
--- trunk/blender/source/blender/makesrna/RNA_define.h	2010-01-02 09:32:32 UTC (rev 25665)
+++ trunk/blender/source/blender/makesrna/RNA_define.h	2010-01-02 10:42:38 UTC (rev 25666)
@@ -172,6 +172,7 @@
 FunctionRNA *RNA_def_function(StructRNA *srna, const char *identifier, const char *call);
 FunctionRNA *RNA_def_function_runtime(StructRNA *srna, const char *identifier, CallFunc call);
 void RNA_def_function_return(FunctionRNA *func, PropertyRNA *ret);
+void RNA_def_function_return_mark(FunctionRNA *func, PropertyRNA *ret);
 void RNA_def_function_flag(FunctionRNA *func, int flag);
 void RNA_def_function_ui_description(FunctionRNA *func, const char *description);
 

Modified: trunk/blender/source/blender/makesrna/intern/makesrna.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/makesrna.c	2010-01-02 09:32:32 UTC (rev 25665)
+++ trunk/blender/source/blender/makesrna/intern/makesrna.c	2010-01-02 10:42:38 UTC (rev 25666)
@@ -1236,16 +1236,18 @@
 	for(; dparm; dparm= dparm->next) {
 		if(dparm->prop->arraydimension)
 			ptrstr= "*";
-		else if(dparm->prop==func->ret)
+		else if(dparm->prop==func->c_ret)
 			ptrstr= ((dparm->prop->type == PROP_POINTER) && !(dparm->prop->flag & PROP_RNAPTR))? "*": "";
+		else if ((dparm->prop->flag & PROP_RETURN))
+			ptrstr= ((dparm->prop->type == PROP_POINTER) && !(dparm->prop->flag & PROP_RNAPTR))? "**": "*";
 		else
 			ptrstr= (dparm->prop->type == PROP_POINTER)? "*": "";
-			 
+
 		fprintf(f, "\t%s%s %s%s;\n", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), ptrstr, dparm->prop->identifier);
 	}
 
 	fprintf(f, "\tchar *_data");
-	if(func->ret) fprintf(f, ", *_retdata");
+	if(func->c_ret) fprintf(f, ", *_retdata");
 	fprintf(f, ";\n");
 	fprintf(f, "\t\n");
 
@@ -1259,7 +1261,12 @@
 
 	dparm= dfunc->cont.properties.first;
 	for(; dparm; dparm= dparm->next) {
-		if(dparm->prop==func->ret) 
+		if ((dparm->prop->flag & PROP_RETURN))
+			ptrstr= "";
+		else
+			ptrstr= "*";
+
+		if(dparm->prop==func->c_ret)
 			fprintf(f, "\t_retdata= _data;\n");
 		else if(dparm->prop->arraydimension)
 			fprintf(f, "\t%s= ((%s%s*)_data);\n", dparm->prop->identifier, rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop));
@@ -1267,10 +1274,10 @@
 			if(dparm->prop->flag & PROP_RNAPTR)
 				fprintf(f, "\t%s= ((%s%s*)_data);\n", dparm->prop->identifier, rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop));
 			else
-				fprintf(f, "\t%s= *((%s%s**)_data);\n", dparm->prop->identifier, rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop));
+				fprintf(f, "\t%s= %s((%s%s**)_data);\n", dparm->prop->identifier, ptrstr, rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop));
 		}
 		else
-			fprintf(f, "\t%s= *((%s%s*)_data);\n", dparm->prop->identifier, rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop));
+			fprintf(f, "\t%s= %s((%s%s*)_data);\n", dparm->prop->identifier, ptrstr, rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop));
 
 		if(dparm->next)
 			fprintf(f, "\t_data+= %d;\n", rna_parameter_size(dparm->prop));
@@ -1279,7 +1286,7 @@
 	if(dfunc->call) {
 		fprintf(f, "\t\n");
 		fprintf(f, "\t");
-		if(func->ret) fprintf(f, "%s= ", func->ret->identifier);
+		if(func->c_ret) fprintf(f, "%s= ", func->c_ret->identifier);
 		fprintf(f, "%s(", dfunc->call);
 
 		first= 1;
@@ -1303,7 +1310,7 @@
 
 		dparm= dfunc->cont.properties.first;
 		for(; dparm; dparm= dparm->next) {
-			if(dparm->prop==func->ret)
+			if(dparm->prop==func->c_ret)
 				continue;
 
 			if(!first) fprintf(f, ", ");
@@ -1314,10 +1321,10 @@
 
 		fprintf(f, ");\n");
 
-		if(func->ret) {
-			dparm= rna_find_parameter_def(func->ret);
+		if(func->c_ret) {
+			dparm= rna_find_parameter_def(func->c_ret);
 			ptrstr= (((dparm->prop->type == PROP_POINTER) && !(dparm->prop->flag & PROP_RNAPTR)) || (dparm->prop->arraydimension))? "*": "";
-			fprintf(f, "\t*((%s%s%s*)_retdata)= %s;\n", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), ptrstr, func->ret->identifier);
+			fprintf(f, "\t*((%s%s%s*)_retdata)= %s;\n", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), ptrstr, func->c_ret->identifier);
 		}
 	}
 
@@ -1552,13 +1559,14 @@
 	PropertyDefRNA *dparm;
 	StructDefRNA *dsrna;
 	int first;
+	char *ptrstr;
 
 	dsrna= rna_find_struct_def(srna);
 	func= dfunc->func;
 
 	/* return type */
 	for(dparm= dfunc->cont.properties.first; dparm; dparm= dparm->next) {
-		if(dparm->prop==func->ret) {
+		if(dparm->prop==func->c_ret) {
 			if(dparm->prop->arraydimension)
 				fprintf(f, "XXX no array return types yet"); /* XXX not supported */
 			else if(dparm->prop->type == PROP_POINTER && !(dparm->prop->flag & PROP_RNAPTR))
@@ -1600,18 +1608,23 @@
 
 	/* defined parameters */
 	for(dparm= dfunc->cont.properties.first; dparm; dparm= dparm->next) {
-		if(dparm->prop==func->ret)
+		if(dparm->prop==func->c_ret)
 			continue;
 
 		if(!first) fprintf(f, ", ");
 		first= 0;
 
+		if((dparm->prop->flag & PROP_RETURN))
+			ptrstr= "*";
+		else
+			ptrstr= "";
+
 		if(dparm->prop->arraydimension)
 			fprintf(f, "%s%s %s[%d]", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), dparm->prop->identifier, dparm->prop->totarraylength);
 		else if(dparm->prop->type == PROP_POINTER)
-			fprintf(f, "%s%s *%s", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), dparm->prop->identifier);
+			fprintf(f, "%s%s *%s%s", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), (dparm->prop->flag & PROP_RNAPTR) ? "" : ptrstr, dparm->prop->identifier);
 		else
-			fprintf(f, "%s%s %s", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), dparm->prop->identifier);
+			fprintf(f, "%s%s %s%s", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), ptrstr, dparm->prop->identifier);
 	}
 
 	fprintf(f, ");\n");
@@ -1890,8 +1903,8 @@
 		dfunc= rna_find_function_def(func);
 		if(dfunc->gencall) fprintf(f, "\t%s,\n", dfunc->gencall);
 		else fprintf(f, "\tNULL,\n");
-	
-		if(func->ret) fprintf(f, "\t(PropertyRNA*)&rna_%s_%s_%s\n", srna->identifier, func->identifier, func->ret->identifier);
+
+		if(func->c_ret) fprintf(f, "\t(PropertyRNA*)&rna_%s_%s_%s\n", srna->identifier, func->identifier, func->c_ret->identifier);
 		else fprintf(f, "\tNULL\n");
 
 		fprintf(f, "};\n");

Modified: trunk/blender/source/blender/makesrna/intern/rna_access.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_access.c	2010-01-02 09:32:32 UTC (rev 25665)
+++ trunk/blender/source/blender/makesrna/intern/rna_access.c	2010-01-02 10:42:38 UTC (rev 25666)
@@ -3464,11 +3464,6 @@
 	return func->identifier;
 }
 
-PropertyRNA *RNA_function_return(FunctionRNA *func)
-{
-	return func->ret;
-}
-
 const char *RNA_function_ui_description(FunctionRNA *func)
 {
 	return func->description;
@@ -3929,7 +3924,7 @@
 
 	tid= RNA_struct_identifier(ptr->type);
 	fid= RNA_function_identifier(func);
-	pret= RNA_function_return(func);
+	pret= func->c_ret;
 	flen= strlen(format);
 
 	RNA_parameter_list_create(&parms, ptr, func);
@@ -3937,14 +3932,17 @@
 
 	for(i= 0, ofs= 0; iter.valid; RNA_parameter_list_next(&iter), i++) {
 		parm= iter.parm;
+		flag= RNA_property_flag(parm);
 
 		if(parm==pret) {
 			retdata= iter.data;
 			continue;
 		}
+		else if (flag & PROP_RETURN) {
+			continue;
+		}
 
 		pid= RNA_property_identifier(parm);
-		flag= RNA_property_flag(parm);
 
 		if (ofs>=flen || format[ofs]=='N') {
 			if (flag & PROP_REQUIRED) {

Modified: trunk/blender/source/blender/makesrna/intern/rna_define.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_define.c	2010-01-02 09:32:32 UTC (rev 25665)
+++ trunk/blender/source/blender/makesrna/intern/rna_define.c	2010-01-02 10:42:38 UTC (rev 25666)
@@ -2417,9 +2417,16 @@
 	return func;
 }
 
+/* C return value only!, multiple rna returns can be done with RNA_def_function_return_mark */
 void RNA_def_function_return(FunctionRNA *func, PropertyRNA *ret)
 {
-	func->ret= ret;
+	func->c_ret= ret;
+
+	RNA_def_function_return_mark(func, ret);
+}
+
+void RNA_def_function_return_mark(FunctionRNA *func, PropertyRNA *ret)
+{
 	ret->flag|=PROP_RETURN;
 }
 

Modified: trunk/blender/source/blender/makesrna/intern/rna_internal_types.h
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_internal_types.h	2010-01-02 09:32:32 UTC (rev 25665)
+++ trunk/blender/source/blender/makesrna/intern/rna_internal_types.h	2010-01-02 10:42:38 UTC (rev 25666)
@@ -118,8 +118,9 @@
 	/* callback to execute the function */
 	CallFunc call;
 
-	/* parameter for the return value */
-	PropertyRNA *ret;
+	/* parameter for the return value
+	 * note: this is only the C return value, rna functions can have multiple return values */
+	PropertyRNA *c_ret;
 };
 
 struct PropertyRNA {

Modified: trunk/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_rna.c	2010-01-02 09:32:32 UTC (rev 25665)
+++ trunk/blender/source/blender/python/intern/bpy_rna.c	2010-01-02 10:42:38 UTC (rev 25666)
@@ -2564,12 +2564,14 @@
 	PointerRNA funcptr;
 	ParameterList parms;
 	ParameterIterator iter;
-	PropertyRNA *pret, *parm;
+	PropertyRNA *parm;
 	PyObject *ret, *item;
-	int i, args_len, parms_len, flag, err= 0, kw_tot= 0, kw_arg;
+	int i, args_len, parms_len, ret_len, flag, err= 0, kw_tot= 0, kw_arg;
 	const char *parm_id;
-	void *retdata= NULL;
 
+	PropertyRNA *pret_single= NULL;
+	void *retdata_single= NULL;
+

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list