mirror of
https://github.com/opencv/opencv.git
synced 2025-06-10 11:03:03 +08:00
Python binding: METH_STATIC instead of METH_CLASS for static functions
This commit is contained in:
parent
335e61dc47
commit
d4ac4fcde1
@ -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…
Reference in New Issue
Block a user