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())
|
||||
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
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue