Support enum arguments for Python binding
authorHamdi Sahloul <hamdisahloul@hotmail.com>
Mon, 27 Aug 2018 19:38:26 +0000 (04:38 +0900)
committerHamdi Sahloul <hamdisahloul@hotmail.com>
Sat, 1 Sep 2018 06:04:55 +0000 (15:04 +0900)
modules/python/src2/gen2.py

index c717ad7..8dcce91 100755 (executable)
@@ -680,7 +680,7 @@ class FuncInfo(object):
                         defval0 = "0"
                         tp1 = tp.replace("*", "_ptr")
                 tp_candidates = [a.tp, normalize_class_name(self.namespace + "." + a.tp)]
-                if any(tp in codegen.enum_types for tp in tp_candidates):
+                if any(tp in codegen.enumTypes for tp in tp_candidates):
                     defval0 = "static_cast<%s>(%d)" % (a.tp, 0)
 
                 amapping = simple_argtype_mapping.get(tp, (tp, "O", defval0))
@@ -855,7 +855,7 @@ class PythonWrapperGenerator(object):
         self.classes = {}
         self.namespaces = {}
         self.consts = {}
-        self.enum_types = []
+        self.enumTypes = []
         self.code_include = StringIO()
         self.code_types = StringIO()
         self.code_funcs = StringIO()
@@ -914,8 +914,11 @@ class PythonWrapperGenerator(object):
         #print(cname + ' => ' + str(py_name) + ' (value=' + value + ')')
 
     def add_enum(self, name, decl):
-        enumname = normalize_class_name(name)
-        self.enum_types.append(enumname)
+        enumType = normalize_class_name(name)
+        if enumType.endswith("<unnamed>"):
+            enumType = None
+        else:
+            self.enumTypes.append(enumType)
         const_decls = decl[3]
 
         for decl in const_decls:
@@ -992,10 +995,10 @@ class PythonWrapperGenerator(object):
 
         self.code_ns_reg.write('static ConstDef consts_%s[] = {\n'%wname)
         for name, cname in sorted(ns.consts.items()):
-            self.code_ns_reg.write('    {"%s", %s},\n'%(name, cname))
+            self.code_ns_reg.write('    {"%s", static_cast<long>(%s)},\n'%(name, cname))
             compat_name = re.sub(r"([a-z])([A-Z])", r"\1_\2", name).upper()
             if name != compat_name:
-                self.code_ns_reg.write('    {"%s", %s},\n'%(compat_name, cname))
+                self.code_ns_reg.write('    {"%s", static_cast<long>(%s)},\n'%(compat_name, cname))
         self.code_ns_reg.write('    {NULL, 0}\n};\n\n')
 
     def gen_namespaces_reg(self):
@@ -1040,7 +1043,7 @@ class PythonWrapperGenerator(object):
                     self.add_const(name.replace("const ", "").strip(), decl)
                 elif name.startswith("enum"):
                     # enum
-                    self.add_enum(name.replace("enum ", "").strip(), decl)
+                    self.add_enum(name.rsplit(" ", 1)[1], decl)
                 else:
                     # function
                     self.add_func(decl)