From 4e4e8ef98f592c067d3f995077eeeebd83e4a629 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 15 Apr 2009 15:12:42 +0000 Subject: [PATCH] RNA: * For RNA wrapped functions, the prototypes of the original function being wrapped is now generated as well. This is an extra check to ensure that the function is correctly wrapped. It's printed after the function is used to still get proper warnings in case the #include for it is missing. --- source/blender/makesrna/intern/makesrna.c | 71 +++++++++++++++++-- source/blender/makesrna/intern/rna_internal.h | 1 + 2 files changed, 68 insertions(+), 4 deletions(-) diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c index 5eceb62f897..c66d938448e 100644 --- a/source/blender/makesrna/intern/makesrna.c +++ b/source/blender/makesrna/intern/makesrna.c @@ -1165,7 +1165,7 @@ static void rna_def_function_funcs(FILE *f, StructDefRNA *dsrna, FunctionDefRNA fprintf(f, "}\n\n"); - dfunc->call= funcname; + dfunc->gencall= funcname; } static void rna_auto_types() @@ -1345,6 +1345,65 @@ static void rna_generate_function_prototypes(BlenderRNA *brna, StructRNA *srna, fprintf(f, "\n"); } +static void rna_generate_static_parameter_prototypes(BlenderRNA *brna, StructRNA *srna, FunctionDefRNA *dfunc, FILE *f) +{ + FunctionRNA *func; + PropertyDefRNA *dparm; + StructDefRNA *dsrna; + + dsrna= rna_find_struct_def(srna); + func= dfunc->func; + + for(dparm= dfunc->cont.properties.first; dparm; dparm= dparm->next) { + if(dparm->prop==func->ret) { + if(dparm->prop->arraylength) + fprintf(f, "XXX no array return types yet"); /* XXX not supported */ + else if(dparm->prop->type == PROP_POINTER) + fprintf(f, "%s%s *", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop)); + else + fprintf(f, "%s%s ", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop)); + + break; + } + } + + if(!dparm) + fprintf(f, "void "); + + fprintf(f, "%s(", dfunc->call); + + if(dsrna->dnaname) fprintf(f, "struct %s *_self", dsrna->dnaname); + else fprintf(f, "struct %s *_self", srna->identifier); + + for(dparm= dfunc->cont.properties.first; dparm; dparm= dparm->next) { + if(dparm->prop==func->ret) ; + else if(dparm->prop->arraylength) + fprintf(f, ", %s%s %s[%d]", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), dparm->prop->identifier, dparm->prop->arraylength); + 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); + else + fprintf(f, ", %s%s %s", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), dparm->prop->identifier); + } + + fprintf(f, ");\n"); +} + +static void rna_generate_static_function_prototypes(BlenderRNA *brna, StructRNA *srna, FILE *f) +{ + FunctionRNA *func; + FunctionDefRNA *dfunc; + + fprintf(f, "/* Repeated prototypes to detect errors */\n\n"); + + for(func= srna->functions.first; func; func= func->cont.next) { + dfunc= rna_find_function_def(func); + if(dfunc->call) + rna_generate_static_parameter_prototypes(brna, srna, dfunc, f); + } + + fprintf(f, "\n"); +} + static void rna_generate_property(FILE *f, StructRNA *srna, const char *nest, PropertyRNA *prop) { char *strnest= "", *errnest= ""; @@ -1580,7 +1639,7 @@ static void rna_generate_struct(BlenderRNA *brna, StructRNA *srna, FILE *f) rna_print_c_string(f, func->description); fprintf(f, ",\n"); dfunc= rna_find_function_def(func); - if(dfunc->call) fprintf(f, "\t%s,\n", dfunc->call); + 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); @@ -1750,11 +1809,15 @@ static void rna_generate(BlenderRNA *brna, FILE *f, char *filename) for(dp=ds->cont.properties.first; dp; dp=dp->next) rna_def_property_funcs(f, ds->srna, dp); - for(ds=DefRNA.structs.first; ds; ds=ds->cont.next) - if(!filename || ds->filename == filename) + for(ds=DefRNA.structs.first; ds; ds=ds->cont.next) { + if(!filename || ds->filename == filename) { for(dfunc=ds->functions.first; dfunc; dfunc= dfunc->cont.next) rna_def_function_funcs(f, ds, dfunc); + rna_generate_static_function_prototypes(brna, ds->srna, f); + } + } + for(ds=DefRNA.structs.first; ds; ds=ds->cont.next) if(!filename || ds->filename == filename) rna_generate_struct(brna, ds->srna, f); diff --git a/source/blender/makesrna/intern/rna_internal.h b/source/blender/makesrna/intern/rna_internal.h index d0aa60dc390..fbdde596a59 100644 --- a/source/blender/makesrna/intern/rna_internal.h +++ b/source/blender/makesrna/intern/rna_internal.h @@ -47,6 +47,7 @@ typedef struct FunctionDefRNA { FunctionRNA *func; const char *srna; const char *call; + const char *gencall; } FunctionDefRNA; typedef struct PropertyDefRNA {