PASS_BY_VALUE = 1
PASS_BY_REFERENCE = 2
+DIR_NONE = 0
+DIR_IN = 1
+DIR_OUT = 2
+DIR_BOTH = 3
+
class Type(object):
def __init__(self, typename, **kwargs):
self.comment = kwargs.setdefault('comment', None)
self.namespace = kwargs.setdefault('namespace', "libxl_")
+ self.dir = kwargs.setdefault('dir', DIR_BOTH)
+ if self.dir not in [DIR_NONE, DIR_IN, DIR_OUT, DIR_BOTH]:
+ raise ValueError
self.passby = kwargs.setdefault('passby', PASS_BY_VALUE)
if self.passby not in [PASS_BY_VALUE, PASS_BY_REFERENCE]:
self.autogenerate_destructor = kwargs.setdefault('autogenerate_destructor', True)
+ def marshal_in(self):
+ return self.dir in [DIR_IN, DIR_BOTH]
+ def marshal_out(self):
+ return self.dir in [DIR_OUT, DIR_BOTH]
+
class Builtin(Type):
"""Builtin type"""
def __init__(self, typename, **kwargs):
globs[n] = t
elif isinstance(t,type(object)) and issubclass(t, Type):
globs[n] = t
- elif n in ['PASS_BY_REFERENCE', 'PASS_BY_VALUE']:
+ elif n in ['PASS_BY_REFERENCE', 'PASS_BY_VALUE',
+ 'DIR_NONE', 'DIR_IN', 'DIR_OUT', 'DIR_BOTH']:
globs[n] = t
try:
for f in ty.fields:
if py_type(f.type) is not None:
continue
- l.append('_hidden PyObject *attrib__%s_get(%s *%s);'%(\
- fsanitize(f.type.typename), f.type.typename, f.name))
- l.append('_hidden int attrib__%s_set(PyObject *v, %s *%s);'%(\
- fsanitize(f.type.typename), f.type.typename, f.name))
+ if ty.marshal_out():
+ l.append('_hidden PyObject *attrib__%s_get(%s *%s);'%(\
+ fsanitize(f.type.typename), f.type.typename, f.name))
+ if ty.marshal_in():
+ l.append('_hidden int attrib__%s_set(PyObject *v, %s *%s);'%(\
+ fsanitize(f.type.typename), f.type.typename, f.name))
return '\n'.join(l) + "\n"
def py_attrib_get(ty, f):
l.append('static PyGetSetDef Py%s_getset[] = {'%ty.rawname)
for f in ty.fields:
l.append(' { .name = "%s", '%f.name)
- l.append(' .get = (getter)py_%s_%s_get, '%(ty.rawname, f.name))
- l.append(' .set = (setter)py_%s_%s_set },'%(ty.rawname, f.name))
+ if ty.marshal_out():
+ l.append(' .get = (getter)py_%s_%s_get, '%(ty.rawname, f.name))
+ else:
+ l.append(' .get = (getter)NULL, ')
+ if ty.marshal_in():
+ l.append(' .set = (setter)py_%s_%s_set,'%(ty.rawname, f.name))
+ else:
+ l.append(' .set = (setter)NULL,')
+ l.append(' },')
l.append(' { .name = NULL }')
l.append('};')
struct="""
if isinstance(ty, libxltypes.Aggregate):
f.write('/* Attribute get/set functions for %s */\n'%ty.typename)
for a in ty.fields:
- f.write(py_attrib_get(ty,a))
- f.write(py_attrib_set(ty,a))
+ if ty.marshal_out():
+ f.write(py_attrib_get(ty,a))
+ if ty.marshal_in():
+ f.write(py_attrib_set(ty,a))
f.write(py_object_def(ty))
f.write(py_initfuncs(types))
f.close()