From 5224c7cf675d6c8b2df9b3f4b43f8cd8d4eb8184 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Mon, 4 Jan 2010 09:13:36 +0000 Subject: Bindings: make the binding infrastructure understand GObject-introspections annotations * bindings/bindings.py * bindings/utils.py: add convenience function to treat arguments tuple: (type,name,{annotations}). introduce new argument options, fix that arguments are 3-tuple of the form (type,name,annotations), where annotations is a dictionary. Key of this dictionnary can be: - optional, wheter the argument is necessary, it means it has a default value. - out, means that the pointer is a pointer of pointer, for bindings that can return exceptions, it will be returned instead of the integer error code, the only way to access error codes will be exceptions. - element-type, contained type of a list or an array, - key-type, value-type, type of respectively the key and value of a GHashTable. - transfer, wheter a the callee(for arguments)/caller(for return values) owns the values passed, it can be none,container(if the callee/caller only owns the container not the contained value) or full. doc.parameters is now a 3-tuple of (attribute-name, attribute-description, attribute-annotations) where attribute-annotations is a string of the form '(option1)(option2 option-arguments) etc.'. - add predicates for xml, list and time_t values. improve predicates for cstring and const modifier. * bindings/overrides.xml: 'out' arguments are not well supported for java, so skip functions using them. * bindings/java/lang.py bindings/php5/php_code.py bindings/php5/wrapper_source.py bindings/python/lang.py: - update language specifig binding generators for handling new annotations. - improve python method declaration, handle optional arguments with default values, factorize this chode in two methods, get_python_arg_decl and defval_to_python_value. * bindings/python/tests/Makefile.am bindings/python/tests/idwsf1_tests.py bindings/python/tests/idwsf2_tests.py: make test work with out of source build dir. --- bindings/php5/php_code.py | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) (limited to 'bindings/php5/php_code.py') diff --git a/bindings/php5/php_code.py b/bindings/php5/php_code.py index 76bae23d..64439778 100644 --- a/bindings/php5/php_code.py +++ b/bindings/php5/php_code.py @@ -22,7 +22,7 @@ import re import sys -import utils +from utils import * class PhpCode: def __init__(self, binding_data, fd): @@ -135,7 +135,7 @@ function lassoRegisterIdWsf2DstService($prefix, $href) { print >> self.fd, '' def generate_constructors(self, klass): - method_prefix = utils.format_as_underscored(klass.name) + '_' + method_prefix = format_as_underscored(klass.name) + '_' for m in self.binding_data.functions: if m.name == method_prefix + 'new': php_args = [] @@ -183,7 +183,7 @@ function lassoRegisterIdWsf2DstService($prefix, $href) { for m in klass.members: mtype = m[0] - mname = utils.format_as_camelcase(m[1]) + mname = format_as_camelcase(m[1]) options = m[2] # Getters @@ -253,7 +253,7 @@ function lassoRegisterIdWsf2DstService($prefix, $href) { except IndexError: setter = None mname = re.match(r'lasso_.*_get_(\w+)', meth_name).group(1) - mname =utils.format_as_camelcase(mname) + mname = format_as_camelcase(mname) print >> self.fd, ' /**' print >> self.fd, ' * @return %s' % self.get_docstring_return_type(m.return_type) @@ -278,7 +278,7 @@ function lassoRegisterIdWsf2DstService($prefix, $href) { print >> self.fd, '' # second pass on methods, real methods - method_prefix = utils.format_as_underscored(klass.name) + '_' + method_prefix = format_as_underscored(klass.name) + '_' for m in methods: if m.name.endswith('_new') or m.name.endswith('_new_from_dump') or \ m.name.endswith('_new_full'): @@ -295,9 +295,13 @@ function lassoRegisterIdWsf2DstService($prefix, $href) { mname = mname[len(method_prefix):] php_args = [] c_args = [] + outarg = None for arg in m.args[1:]: arg_type, arg_name, arg_options = arg arg_name = '$' + arg_name + if is_out(arg): + assert not outarg + outarg = arg if arg_options.get('optional'): if arg_options.get('default'): defval = arg_options.get('default') @@ -318,6 +322,11 @@ function lassoRegisterIdWsf2DstService($prefix, $href) { c_args.append(arg_name) else: c_args.append('%s._cptr' % arg_name) + if is_out(arg): + php_args.pop() + php_args.append(arg_name) + c_args.pop() + c_args.append(arg_name) if php_args: php_args = ', '.join(php_args) @@ -331,7 +340,7 @@ function lassoRegisterIdWsf2DstService($prefix, $href) { if m.docstring: print >> self.fd, self.generate_docstring(m, mname, 4) print >> self.fd, ' public function %s(%s) {' % ( - utils.format_underscore_as_camelcase(mname), php_args) + format_underscore_as_camelcase(mname), php_args) if m.return_type == 'void': print >> self.fd, ' %s($this->_cptr%s);' % (cname, c_args) elif m.return_type in ('gint', 'int'): -- cgit