@@ -310,7 +310,8 @@ def __init__(self, name, decl=None):
310
310
if not customname and self .wname .startswith ("Cv" ):
311
311
self .wname = self .wname [2 :]
312
312
313
- def gen_map_code (self , all_classes ):
313
+ def gen_map_code (self , codegen ):
314
+ all_classes = codegen .classes
314
315
code = "static bool pyopencv_to(PyObject* src, %s& dst, const char* name)\n {\n PyObject* tmp;\n bool ok;\n " % (self .cname )
315
316
code += "" .join ([gen_template_set_prop_from_map .substitute (propname = p .name ,proptype = p .tp ) for p in self .props ])
316
317
if self .base :
@@ -319,9 +320,10 @@ def gen_map_code(self, all_classes):
319
320
code += "\n return true;\n }\n "
320
321
return code
321
322
322
- def gen_code (self , all_classes ):
323
+ def gen_code (self , codegen ):
324
+ all_classes = codegen .classes
323
325
if self .ismap :
324
- return self .gen_map_code (all_classes )
326
+ return self .gen_map_code (codegen )
325
327
326
328
getset_code = StringIO ()
327
329
getset_inits = StringIO ()
@@ -354,10 +356,10 @@ def gen_code(self, all_classes):
354
356
sorted_methods .sort ()
355
357
356
358
if self .constructor is not None :
357
- methods_code .write (self .constructor .gen_code (all_classes ))
359
+ methods_code .write (self .constructor .gen_code (codegen ))
358
360
359
361
for mname , m in sorted_methods :
360
- methods_code .write (m .gen_code (all_classes ))
362
+ methods_code .write (m .gen_code (codegen ))
361
363
methods_inits .write (m .get_tab_entry ())
362
364
363
365
baseptr = "NULL"
@@ -516,6 +518,8 @@ def init_pyproto(self):
516
518
else :
517
519
outstr = "None"
518
520
521
+ self .py_arg_str = argstr
522
+ self .py_return_str = outstr
519
523
self .py_prototype = "%s(%s) -> %s" % (self .wname , argstr , outstr )
520
524
self .py_noptargs = noptargs
521
525
self .py_arglist = arglist
@@ -554,11 +558,11 @@ def get_wrapper_name(self):
554
558
555
559
return "pyopencv_" + self .namespace .replace ('.' ,'_' ) + '_' + classname + name
556
560
557
- def get_wrapper_prototype (self , all_classes ):
561
+ def get_wrapper_prototype (self , codegen ):
558
562
full_fname = self .get_wrapper_name ()
559
563
if self .isconstructor :
560
564
return "static int {fn_name}(pyopencv_{type_name}_t* self, PyObject* args, PyObject* kw)" .format (
561
- fn_name = full_fname , type_name = all_classes [self .classname ].name )
565
+ fn_name = full_fname , type_name = codegen . classes [self .classname ].name )
562
566
563
567
if self .classname :
564
568
self_arg = "self"
@@ -615,8 +619,9 @@ def get_tab_entry(self):
615
619
).substitute (py_funcname = self .variants [0 ].wname , wrap_funcname = self .get_wrapper_name (),
616
620
flags = " | " .join (flags ), py_docstring = full_docstring )
617
621
618
- def gen_code (self , all_classes ):
619
- proto = self .get_wrapper_prototype (all_classes )
622
+ def gen_code (self , codegen ):
623
+ all_classes = codegen .classes
624
+ proto = self .get_wrapper_prototype (codegen )
620
625
code = "%s\n {\n " % (proto ,)
621
626
code += " using namespace %s;\n \n " % self .namespace .replace ('.' , '::' )
622
627
@@ -799,6 +804,20 @@ def gen_code(self, all_classes):
799
804
if self .isconstructor :
800
805
def_ret = "-1"
801
806
code += "\n return %s;\n }\n \n " % def_ret
807
+
808
+ cname = self .cname
809
+ if self .classname :
810
+ classinfo = all_classes [self .classname ]
811
+ cname = classinfo .cname + '::' + cname
812
+ py_signatures = codegen .py_signatures .setdefault (cname , [])
813
+ for v in self .variants :
814
+ s = dict (name = v .name , arg = v .py_arg_str , ret = v .py_return_str )
815
+ for old in py_signatures :
816
+ if s == old :
817
+ break
818
+ else :
819
+ py_signatures .append (s )
820
+
802
821
return code
803
822
804
823
@@ -822,6 +841,7 @@ def clear(self):
822
841
self .code_type_reg = StringIO ()
823
842
self .code_ns_reg = StringIO ()
824
843
self .code_type_publish = StringIO ()
844
+ self .py_signatures = dict ()
825
845
self .class_idx = 0
826
846
827
847
def add_class (self , stype , name , decl ):
@@ -931,9 +951,13 @@ def gen_namespaces_reg(self):
931
951
932
952
933
953
def save (self , path , name , buf ):
934
- f = open (path + "/" + name , "wt" )
935
- f .write (buf .getvalue ())
936
- f .close ()
954
+ with open (path + "/" + name , "wt" ) as f :
955
+ f .write (buf .getvalue ())
956
+
957
+ def save_json (self , path , name , value ):
958
+ import json
959
+ with open (path + "/" + name , "wt" ) as f :
960
+ json .dump (value , f )
937
961
938
962
def gen (self , srcfiles , output_path ):
939
963
self .clear ()
@@ -996,7 +1020,7 @@ def gen(self, srcfiles, output_path):
996
1020
classlist1 .sort ()
997
1021
998
1022
for decl_idx , name , classinfo in classlist1 :
999
- code = classinfo .gen_code (self . classes )
1023
+ code = classinfo .gen_code (self )
1000
1024
self .code_types .write (code )
1001
1025
if not classinfo .ismap :
1002
1026
self .code_type_reg .write ("MKTYPE2(%s);\n " % (classinfo .name ,) )
@@ -1009,7 +1033,7 @@ def gen(self, srcfiles, output_path):
1009
1033
for name , func in sorted (ns .funcs .items ()):
1010
1034
if func .isconstructor :
1011
1035
continue
1012
- code = func .gen_code (self . classes )
1036
+ code = func .gen_code (self )
1013
1037
self .code_funcs .write (code )
1014
1038
self .gen_namespace (ns_name )
1015
1039
self .gen_namespaces_reg ()
@@ -1027,6 +1051,7 @@ def gen(self, srcfiles, output_path):
1027
1051
self .save (output_path , "pyopencv_generated_type_reg.h" , self .code_type_reg )
1028
1052
self .save (output_path , "pyopencv_generated_ns_reg.h" , self .code_ns_reg )
1029
1053
self .save (output_path , "pyopencv_generated_type_publish.h" , self .code_type_publish )
1054
+ self .save_json (output_path , "pyopencv_signatures.json" , self .py_signatures )
1030
1055
1031
1056
if __name__ == "__main__" :
1032
1057
srcfiles = hdr_parser .opencv_hdr_list
0 commit comments