summaryrefslogtreecommitdiffstats
path: root/bindings/python/lang.py
diff options
context:
space:
mode:
authorBenjamin Dauvergne <bdauvergne@entrouvert.com>2010-01-04 09:16:00 +0000
committerBenjamin Dauvergne <bdauvergne@entrouvert.com>2010-01-04 09:16:00 +0000
commitfcd8739f49ce231f002604d31068087daa6e2fb7 (patch)
treeb5503fe3e7ebe5e336be5553b187e4bceade2902 /bindings/python/lang.py
parent914a176d99e7686cb3d0207a4d1429bf6c944cc5 (diff)
downloadlasso-fcd8739f49ce231f002604d31068087daa6e2fb7.tar.gz
lasso-fcd8739f49ce231f002604d31068087daa6e2fb7.tar.xz
lasso-fcd8739f49ce231f002604d31068087daa6e2fb7.zip
Bindings: simplify GList handling
Diffstat (limited to 'bindings/python/lang.py')
-rw-r--r--bindings/python/lang.py92
1 files changed, 56 insertions, 36 deletions
diff --git a/bindings/python/lang.py b/bindings/python/lang.py
index ff06b746..8b1f18b4 100644
--- a/bindings/python/lang.py
+++ b/bindings/python/lang.py
@@ -275,7 +275,7 @@ if WSF_SUPPORT:
py_args.append(get_python_arg_decl(o))
if self.is_pygobject(arg_type):
- c_args.append('%s._cptr' % arg_name)
+ c_args.append('%s and %s._cptr' % (arg_name, arg_name))
else:
c_args.append(arg_name)
@@ -300,7 +300,7 @@ if WSF_SUPPORT:
py_args.append(get_python_arg_decl(o))
if self.is_pygobject(arg_type):
- c_args.append('%s._cptr' % arg_name)
+ c_args.append('%s and %s._cptr' % (arg_name, arg_name))
else:
c_args.append(arg_name)
c_args = ', '.join(c_args)
@@ -323,7 +323,7 @@ if WSF_SUPPORT:
print >> fd, ' t = _lasso.%s_%s_get(self._cptr)' % (
klassname, mname)
print >> fd, ' return cptrToPy(t)'
- elif m[0] == 'GList*' and options.get('elem_type') not in ('char*', 'xmlNode*'):
+ elif m[0] == 'GList*' and options.get('element-type') not in ('char*', 'xmlNode*'):
print >> fd, ' l = _lasso.%s_%s_get(self._cptr)' % (
klassname, mname)
print >> fd, ' if not l: return l'
@@ -332,7 +332,7 @@ if WSF_SUPPORT:
print >> fd, ' d = _lasso.%s_%s_get(self._cptr)' % (
klassname, mname)
print >> fd, ' if not d: return d'
- if options.get('elem_type') != 'char*':
+ if options.get('element-type') != 'char*':
print >> fd, ' d2 = {}'
print >> fd, ' for k, v in d.items():'
print >> fd, ' d2[k] = cptrToPy(v)'
@@ -345,8 +345,8 @@ if WSF_SUPPORT:
print >> fd, ' def set_%s(self, value):' % mname
if self.is_pygobject(m[0]):
print >> fd, ' if value is not None:'
- print >> fd, ' value = value._cptr'
- elif m[0] == 'GList*' and options.get('elem_type') not in ('char*', 'xmlNode*'):
+ print >> fd, ' value = value and value._cptr'
+ elif m[0] == 'GList*' and options.get('element-type') not in ('char*', 'xmlNode*'):
print >> fd, ' if value is not None:'
print >> fd, ' value = tuple([x._cptr for x in value])'
print >> fd, ' _lasso.%s_%s_set(self._cptr, value)' % (
@@ -376,7 +376,10 @@ if WSF_SUPPORT:
function_name = function_name[6:]
else:
mname = m.name
- mname = re.match(r'lasso_.*_get_(\w+)', mname).group(1)
+ try:
+ mname = re.match(r'lasso_.*_get_(\w+)', mname).group(1)
+ except:
+ raise
mname = format_underscore_as_camelcase(mname)
print >> fd, ' def get_%s(self):' % mname
function_name = m.name[6:]
@@ -430,12 +433,17 @@ if WSF_SUPPORT:
if is_out(o):
c_args.append(outvar)
- elif arg_type in ('char*', 'const char*', 'guchar*', 'const guchar*', 'gchar*', 'const gchar*', 'xmlNode*') or \
- arg_type in ['int', 'gint', 'gboolean', 'const gboolean'] or \
- arg_type in self.binding_data.enums or is_time_t_pointer(o):
+ elif not self.is_pygobject(arg_type):
c_args.append(arg_name)
else:
- c_args.append('%s._cptr' % arg_name)
+ c_args.append('%s and %s._cptr' % (arg_name, arg_name))
+ # check py_args
+ opt = False
+ for x in py_args:
+ if '=' in x:
+ opt = True
+ elif opt:
+ print 'W: non-optional follow optional,', m
if py_args:
py_args = ', ' + ', '.join(py_args)
@@ -567,7 +575,8 @@ if WSF_SUPPORT:
s.append('\n')
- s[-1] = s[-1].rstrip() # remove trailing newline from last line
+ if s:
+ s[-1] = s[-1].rstrip() # remove trailing newline from last line
return '\n'.join([(indent*' ')+x for x in ''.join(s).splitlines()])
@@ -704,10 +713,10 @@ register_constants(PyObject *d)
print >> fd, ' if (this->%s) g_free(this->%s);' % (m[1], m[1])
print >> fd, ' this->%s = g_strdup(value);' % m[1]
elif parse_format == 'O' and arg_type == 'GList*':
- elem_type = m[2].get('elem_type')
- if elem_type == 'char*':
+ element_type = m[2].get('element-type')
+ if element_type == 'char*':
print >> fd, ' set_list_of_strings(&this->%s, cvt_value);' % m[1]
- elif elem_type == 'xmlNode*':
+ elif element_type == 'xmlNode*':
print >> fd, ' set_list_of_xml_nodes(&this->%s, cvt_value);' % m[1]
else:
print >> fd, ' set_list_of_pygobject(&this->%s, cvt_value);' % m[1]
@@ -748,18 +757,18 @@ register_constants(PyObject *d)
print >> fd, ' %s = noneRef();' % return_pyvar_name
print >> fd, ' }'
elif vtype in ('const GList*', 'GList*',):
- elem_type = options.get('elem_type')
- if not elem_type or self.is_pygobject(elem_type):
+ element_type = options.get('element-type')
+ if not element_type or self.is_pygobject(element_type):
print >> fd, ' %s = get_list_of_pygobject(%s);' % (return_pyvar_name, return_var_name)
- elif elem_type == 'char*':
+ elif element_type == 'char*':
print >> fd, ' %s = get_list_of_strings(%s);' % (return_pyvar_name, return_var_name)
- elif elem_type.startswith('xmlNode'):
+ elif element_type.startswith('xmlNode'):
print >> fd, ' %s = get_list_of_xml_nodes(%s);' % (return_pyvar_name, return_var_name)
else:
raise Exception('Should not happen: %s %s ' % (repr(options), vtype))
elif vtype in ('GHashTable*',):
- elem_type = options.get('elem_type')
- if elem_type == 'char*':
+ element_type = options.get('element-type')
+ if element_type == 'char*':
print >> fd, ' %s = get_dict_from_hashtable_of_strings(%s);' % (return_pyvar_name, return_var_name)
else:
print >> fd, ' %s = get_dict_from_hashtable_of_objects(%s);' % (return_pyvar_name, return_var_name)
@@ -798,20 +807,18 @@ register_constants(PyObject *d)
arg_def = None
python_cvt_def = None
defval = None
+ if arg_options.get('optional'):
+ if not '|' in parse_tuple_format:
+ parse_tuple_format.append('|')
if arg_type in ('char*', 'const char*', 'gchar*', 'const gchar*'):
arg_type = arg_type.replace('const ', '')
if arg_options.get('optional'):
- if not '|' in parse_tuple_format:
- parse_tuple_format.append('|')
parse_tuple_format.append('z')
else:
parse_tuple_format.append('s')
parse_tuple_args.append('&%s' % arg_name)
arg_def = ' %s %s = NULL;' % (arg[0], arg[1])
- elif arg_type in ['int', 'gint', 'gboolean', 'const gboolean'] + self.binding_data.enums:
- if arg_options.get('optional'):
- if not '|' in parse_tuple_format:
- parse_tuple_format.append('|')
+ elif arg_type in ['GType', 'int', 'gint', 'gboolean', 'const gboolean'] + self.binding_data.enums:
parse_tuple_format.append('i')
parse_tuple_args.append('&%s' % arg_name)
if arg_options.get('default'):
@@ -857,25 +864,38 @@ register_constants(PyObject *d)
print >> fd, ' if (! PyArg_ParseTuple(args, "%s"%s)) return NULL;' % (
''.join(parse_tuple_format), parse_tuple_args)
- for f, arg in zip(parse_tuple_format, m.args):
+ for f, arg in zip([ x for x in parse_tuple_format if x != '|'], m.args):
if is_out(arg):
continue
if is_list(arg):
- qualifier = arg[2].get('elem_type')
- if qualifier == 'char*':
+ qualifier = element_type(arg)
+ if qualifier == 'char*' or qualifier == 'utf8':
print >> fd, ' set_list_of_strings(&%s, cvt_%s);' % (arg[1], arg[1])
elif qualifier == 'xmlNode*':
print >> fd, ' set_list_of_xml_nodes(&%s, cvt_%s);' % (arg[1], arg[1])
- elif qualifier == 'LassoNode':
+ elif isinstance(qualifier, basestring) and qualifier.startswith('Lasso'):
print >> fd, ' set_list_of_pygobject(&%s, cvt_%s);' % (arg[1], arg[1])
else:
- print >> sys.stderr, 'E: unqualified GList argument in', name
+ print >> sys.stderr, 'E: unqualified GList argument in', name, qualifier, arg
elif is_xml_node(arg):
print >> fd, ' %s = get_xml_node_from_pystring(cvt_%s);' % (arg[1], arg[1])
elif is_time_t_pointer(arg):
print >> fd, ' %s = get_time_t(cvt_%s);' % (arg[1], arg[1])
elif f == 'O':
- print >> fd, ' %s = (%s)cvt_%s->obj;' % (arg[1], arg[0], arg[1])
+ if is_optional(arg):
+ print >> fd, ' if (PyObject_TypeCheck((PyObject*)cvt_%s, &PyGObjectPtrType)) {' % arg[1]
+ print >> fd, ' %s = (%s)cvt_%s->obj;' % (arg[1], arg[0], arg[1])
+ print >> fd, ' } else {'
+ print >> fd, ' %s = NULL;' % arg[1]
+ print >> fd, ' }'
+ else:
+ print >> fd, ' if (PyObject_TypeCheck((PyObject*)cvt_%s, &PyGObjectPtrType)) {' % arg[1]
+ print >> fd, ' %s = (%s)cvt_%s->obj;' % (arg[1], arg[0], arg[1])
+ print >> fd, ' } else {'
+ print >> fd, ' PyErr_SetString(PyExc_TypeError, "value should be a PyGObject");'
+ print >> fd, ' return NULL;'
+ print >> fd, ' }'
+
if m.return_type:
print >> fd, ' return_value =',
@@ -887,10 +907,10 @@ register_constants(PyObject *d)
for f, arg in zip(parse_tuple_format, m.args):
if is_out(arg):
- self.return_value(fd, var_type(arg), {'elem_type': element_type(arg)}, return_var_name = arg[1], return_pyvar_name = 'out_pyvalue')
+ self.return_value(fd, var_type(arg), {'element-type': element_type(arg)}, return_var_name = arg[1], return_pyvar_name = 'out_pyvalue')
print >> fd, ' PyList_SetItem(cvt_%s_out, 0, out_pyvalue);' % arg[1]
elif arg[0] == 'GList*':
- qualifier = arg[2].get('elem_type')
+ qualifier = arg[2].get('element-type')
if qualifier == 'char*':
print >> fd, ' free_list(&%s, (GFunc)g_free);' % arg[1]
elif qualifier == 'xmlNode*':
@@ -905,7 +925,7 @@ register_constants(PyObject *d)
else:
# Constructor so decrease refcount (it was incremented by PyGObjectPtr_New called
# in self.return_value
- self.return_value(fd, m.return_type, {'elem_type': m.return_type_qualifier})
+ self.return_value(fd, m.return_type, {'element-type': m.return_type_qualifier})
if m.return_owner and self.is_pygobject(m.return_type):
print >> fd, ' if (return_value) g_object_unref(return_value);'
print >> fd, ' return return_pyvalue;'