Python binding: METH_STATIC instead of METH_CLASS for static functions

pull/12234/head
Hamdi Sahloul 7 years ago
parent 335e61dc47
commit d4ac4fcde1
  1. 28
      modules/python/src2/gen2.py

@ -534,13 +534,13 @@ class FuncVariant(object):
class FuncInfo(object): class FuncInfo(object):
def __init__(self, classname, name, cname, isconstructor, namespace, isclassmethod): def __init__(self, classname, name, cname, isconstructor, namespace, is_static):
self.classname = classname self.classname = classname
self.name = name self.name = name
self.cname = cname self.cname = cname
self.isconstructor = isconstructor self.isconstructor = isconstructor
self.namespace = namespace self.namespace = namespace
self.isclassmethod = isclassmethod self.is_static = is_static
self.variants = [] self.variants = []
def add_variant(self, decl, isphantom=False): def add_variant(self, decl, isphantom=False):
@ -555,8 +555,8 @@ class FuncInfo(object):
else: else:
classname = "" classname = ""
if self.isclassmethod: if self.is_static:
name += "_cls" name += "_static"
return "pyopencv_" + self.namespace.replace('.','_') + '_' + classname + name return "pyopencv_" + self.namespace.replace('.','_') + '_' + classname + name
@ -615,7 +615,7 @@ class FuncInfo(object):
return Template(' {"$py_funcname", CV_PY_FN_WITH_KW_($wrap_funcname, $flags), "$py_docstring"},\n' return Template(' {"$py_funcname", CV_PY_FN_WITH_KW_($wrap_funcname, $flags), "$py_docstring"},\n'
).substitute(py_funcname = self.variants[0].wname, wrap_funcname=self.get_wrapper_name(), ).substitute(py_funcname = self.variants[0].wname, wrap_funcname=self.get_wrapper_name(),
flags = 'METH_CLASS' if self.isclassmethod else '0', py_docstring = full_docstring) flags = 'METH_STATIC' if self.is_static else '0', py_docstring = full_docstring)
def gen_code(self, codegen): def gen_code(self, codegen):
all_classes = codegen.classes all_classes = codegen.classes
@ -632,7 +632,7 @@ class FuncInfo(object):
selfinfo = all_classes[self.classname] selfinfo = all_classes[self.classname]
if not self.isconstructor: if not self.isconstructor:
amp = "&" if selfinfo.issimple else "" amp = "&" if selfinfo.issimple else ""
if self.isclassmethod: if self.is_static:
pass pass
elif selfinfo.isalgorithm: elif selfinfo.isalgorithm:
code += gen_template_check_self_algo.substitute(name=selfinfo.name, cname=selfinfo.cname, amp=amp) code += gen_template_check_self_algo.substitute(name=selfinfo.name, cname=selfinfo.cname, amp=amp)
@ -652,7 +652,7 @@ class FuncInfo(object):
all_cargs = [] all_cargs = []
parse_arglist = [] parse_arglist = []
if v.isphantom and ismethod and not self.isclassmethod: if v.isphantom and ismethod and not self.is_static:
code_args += "_self_" code_args += "_self_"
# declare all the C function arguments, # declare all the C function arguments,
@ -740,7 +740,7 @@ class FuncInfo(object):
if v.rettype: if v.rettype:
code_decl += " " + v.rettype + " retval;\n" code_decl += " " + v.rettype + " retval;\n"
code_fcall += "retval = " code_fcall += "retval = "
if ismethod and not self.isclassmethod: if ismethod and not self.is_static:
code_fcall += "_self_->" + self.cname code_fcall += "_self_->" + self.cname
else: else:
code_fcall += self.cname code_fcall += self.cname
@ -821,7 +821,7 @@ class FuncInfo(object):
#if dump: pprint(vars(classinfo)) #if dump: pprint(vars(classinfo))
if self.isconstructor: if self.isconstructor:
py_name = 'cv.' + classinfo.wname py_name = 'cv.' + classinfo.wname
elif self.isclassmethod: elif self.is_static:
py_name = '.'.join([self.namespace, classinfo.sname + '_' + self.variants[0].wname]) py_name = '.'.join([self.namespace, classinfo.sname + '_' + self.variants[0].wname])
else: else:
cname = classinfo.cname + '::' + cname cname = classinfo.cname + '::' + cname
@ -929,12 +929,12 @@ class PythonWrapperGenerator(object):
namespace = '.'.join(namespace) namespace = '.'.join(namespace)
isconstructor = name == bareclassname isconstructor = name == bareclassname
isclassmethod = False is_static = False
isphantom = False isphantom = False
mappable = None mappable = None
for m in decl[2]: for m in decl[2]:
if m == "/S": if m == "/S":
isclassmethod = True is_static = True
elif m == "/phantom": elif m == "/phantom":
isphantom = True isphantom = True
cname = cname.replace("::", "_") cname = cname.replace("::", "_")
@ -948,10 +948,10 @@ class PythonWrapperGenerator(object):
if isconstructor: if isconstructor:
name = "_".join(classes[:-1]+[name]) name = "_".join(classes[:-1]+[name])
if isclassmethod: if is_static:
# Add it as a method to the class # Add it as a method to the class
func_map = self.classes[classname].methods func_map = self.classes[classname].methods
func = func_map.setdefault(name, FuncInfo(classname, name, cname, isconstructor, namespace, isclassmethod)) func = func_map.setdefault(name, FuncInfo(classname, name, cname, isconstructor, namespace, is_static))
func.add_variant(decl, isphantom) func.add_variant(decl, isphantom)
# Add it as global function # Add it as global function
@ -966,7 +966,7 @@ class PythonWrapperGenerator(object):
else: else:
func_map = self.namespaces.setdefault(namespace, Namespace()).funcs func_map = self.namespaces.setdefault(namespace, Namespace()).funcs
func = func_map.setdefault(name, FuncInfo(classname, name, cname, isconstructor, namespace, isclassmethod)) func = func_map.setdefault(name, FuncInfo(classname, name, cname, isconstructor, namespace, is_static))
func.add_variant(decl, isphantom) func.add_variant(decl, isphantom)
if classname and isconstructor: if classname and isconstructor:

Loading…
Cancel
Save