[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