Add enum support
This commit is contained in:
parent
d0935fe533
commit
36df29ba71
2 changed files with 54 additions and 0 deletions
|
|
@ -222,6 +222,50 @@ class Wrapper(object):
|
||||||
println('if (!%(out)s) return NULL;' % locals())
|
println('if (!%(out)s) return NULL;' % locals())
|
||||||
return out
|
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):
|
class Class(Binding):
|
||||||
def __init__(self, ns):
|
def __init__(self, ns):
|
||||||
super(Class, self).__init__()
|
super(Class, self).__init__()
|
||||||
|
|
@ -229,6 +273,8 @@ class Class(Binding):
|
||||||
self.Ref = Ref(self)
|
self.Ref = Ref(self)
|
||||||
self.Pointer = Pointer(self)
|
self.Pointer = Pointer(self)
|
||||||
self.Subclass = lambda: Subclass(self)
|
self.Subclass = lambda: Subclass(self)
|
||||||
|
self.Enum = lambda *v: ClassEnum(self, *v)
|
||||||
|
self.enums = []
|
||||||
self.ns = ns
|
self.ns = ns
|
||||||
self.methods = []
|
self.methods = []
|
||||||
self.name = None
|
self.name = None
|
||||||
|
|
|
||||||
|
|
@ -115,6 +115,14 @@ class Context(object):
|
||||||
println('pass')
|
println('pass')
|
||||||
else:
|
else:
|
||||||
mod = cls.name
|
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:
|
for method in cls.methods:
|
||||||
name = method.name
|
name = method.name
|
||||||
if isinstance(method, StaticMethod):
|
if isinstance(method, StaticMethod):
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue