Revision: 19737
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19737
Author:   blendix
Date:     2009-04-15 17:12:42 +0200 (Wed, 15 Apr 2009)

Log Message:
-----------
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.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/makesrna/intern/makesrna.c
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_internal.h

Modified: branches/blender2.5/blender/source/blender/makesrna/intern/makesrna.c
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/intern/makesrna.c       
2009-04-15 15:10:31 UTC (rev 19736)
+++ branches/blender2.5/blender/source/blender/makesrna/intern/makesrna.c       
2009-04-15 15:12:42 UTC (rev 19737)
@@ -1165,7 +1165,7 @@
 
        fprintf(f, "}\n\n");
 
-       dfunc->call= funcname;
+       dfunc->gencall= funcname;
 }
 
 static void rna_auto_types()
@@ -1345,6 +1345,65 @@
                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 @@
                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 @@
                        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);

Modified: 
branches/blender2.5/blender/source/blender/makesrna/intern/rna_internal.h
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/intern/rna_internal.h   
2009-04-15 15:10:31 UTC (rev 19736)
+++ branches/blender2.5/blender/source/blender/makesrna/intern/rna_internal.h   
2009-04-15 15:12:42 UTC (rev 19737)
@@ -47,6 +47,7 @@
        FunctionRNA *func;
        const char *srna;
        const char *call;
+       const char *gencall;
 } FunctionDefRNA;
 
 typedef struct PropertyDefRNA {


_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to