* 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.
This commit is contained in:
2009-04-15 15:12:42 +00:00
parent 8b1207d500
commit 4e4e8ef98f
2 changed files with 68 additions and 4 deletions

View File

@@ -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);

View File

@@ -47,6 +47,7 @@ typedef struct FunctionDefRNA {
FunctionRNA *func;
const char *srna;
const char *call;
const char *gencall;
} FunctionDefRNA;
typedef struct PropertyDefRNA {