From 36df29ba71df48beb838e60d9a5a2616fb3a8fb3 Mon Sep 17 00:00:00 2001 From: Siu Kwan Lam Date: Tue, 22 Jan 2013 11:49:41 -0600 Subject: [PATCH] Add enum support --- newbinding/binding.py | 46 +++++++++++++++++++++++++++++++++++++++++++ newbinding/gen.py | 8 ++++++++ 2 files changed, 54 insertions(+) diff --git a/newbinding/binding.py b/newbinding/binding.py index 1230813..fa9ce90 100644 --- a/newbinding/binding.py +++ b/newbinding/binding.py @@ -222,6 +222,50 @@ class Wrapper(object): println('if (!%(out)s) return NULL;' % locals()) return out +class Enum(Binding): + def __init__(self, ns, *values): + super(Enum, self).__init__() + self.values = values + self.ns = ns + self.name = None + + def compile(self, name, println): + self.name = self.name or name + + @property + def fullname(self): + return '::'.join([self.ns, self.name]) + +class ClassEnum(Enum): + def __init__(self, cls, *values): + super(ClassEnum, self).__init__(None, *values) + self.cls = cls + self.cls.enums.append(self) + + def compile(self, name, println): + self.ns = self.cls.fullname + super(ClassEnum, self).compile(name, println) + + def wrap(self, println, var): + println2 = indent_println(println) + ret = declare(println, 'PyObject*', NULL) + println('switch(%s) { ' % var) + for v in self.values: + println('case %s::%s:' % (self.ns, v)) + println2('%(ret)s = PyString_FromString("%(v)s");' % locals()) + println2('break;') + else: + println('default:') + println2('PyErr_SetString(PyExc_TypeError, "Invalid enum: %s");' % + v) + println2('return NULL;') + println('}') + return ret + + def unwrap(self, println, var): + pass + + class Class(Binding): def __init__(self, ns): super(Class, self).__init__() @@ -229,6 +273,8 @@ class Class(Binding): self.Ref = Ref(self) self.Pointer = Pointer(self) self.Subclass = lambda: Subclass(self) + self.Enum = lambda *v: ClassEnum(self, *v) + self.enums = [] self.ns = ns self.methods = [] self.name = None diff --git a/newbinding/gen.py b/newbinding/gen.py index c2126ab..87c0697 100644 --- a/newbinding/gen.py +++ b/newbinding/gen.py @@ -115,6 +115,14 @@ class Context(object): println('pass') else: mod = cls.name + # generate class enums + for enum in cls.enums: + println('class %s:' % enum.name) + println2 = indent_println(println) + for v in enum.values: + println2('%(v)s = "%(v)s"' % locals()) + println('') + # generate class methods for method in cls.methods: name = method.name if isinstance(method, StaticMethod):