diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2009-04-15 19:12:42 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2009-04-15 19:12:42 +0400 |
commit | 4e4e8ef98f592c067d3f995077eeeebd83e4a629 (patch) | |
tree | af4da6ad3dc55dd93ac6bff57b5c0680e0d0626a /source/blender/makesrna | |
parent | 8b1207d500a2d38202226c8a9e7f07692863e3fc (diff) |
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.
Diffstat (limited to 'source/blender/makesrna')
-rw-r--r-- | source/blender/makesrna/intern/makesrna.c | 71 | ||||
-rw-r--r-- | 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 { |