diff options
author | Benjamin Dauvergne <bdauvergne@entrouvert.com> | 2010-01-28 15:31:21 +0000 |
---|---|---|
committer | Benjamin Dauvergne <bdauvergne@entrouvert.com> | 2010-01-28 15:31:21 +0000 |
commit | 8864adfcd01981b5cc55170169d046b50de814a1 (patch) | |
tree | bffdb76e1ecc6e7b2fb73312e4ce8770d4d1d1b7 /bindings/perl | |
parent | 1e581e05b75241c915b2505bcc6216027f51091a (diff) | |
download | lasso-8864adfcd01981b5cc55170169d046b50de814a1.tar.gz lasso-8864adfcd01981b5cc55170169d046b50de814a1.tar.xz lasso-8864adfcd01981b5cc55170169d046b50de814a1.zip |
Binding perl: update to binding
* change extension of typemap files because if conflicts with existing
* support constant list of strings and gobjects, add input rule for
list of gobjects
* fix setter for GList fields
Diffstat (limited to 'bindings/perl')
-rw-r--r-- | bindings/perl/Makefile.am | 4 | ||||
-rw-r--r-- | bindings/perl/lang.py | 41 | ||||
-rw-r--r-- | bindings/perl/typemap-in (renamed from bindings/perl/typemap.in) | 5 | ||||
-rw-r--r-- | bindings/perl/typemap-out (renamed from bindings/perl/typemap.out) | 0 |
4 files changed, 40 insertions, 10 deletions
diff --git a/bindings/perl/Makefile.am b/bindings/perl/Makefile.am index 9a691612..dc354bcf 100644 --- a/bindings/perl/Makefile.am +++ b/bindings/perl/Makefile.am @@ -13,7 +13,7 @@ INCLUDES = \ all: Lasso.so -EXTRA_DIST=gobject_handling.c glist_handling.c typemap.in typemap.out lang.py Makefile.PL LassoNode.xs __init__.py test.pl test.sh t +EXTRA_DIST=gobject_handling.c glist_handling.c typemap-in typemap-out lang.py Makefile.PL LassoNode.xs __init__.py test.pl test.sh t if WSF_ENABLED EXTRA_ARGS = --enable-id-wsf @@ -28,7 +28,7 @@ Makefile.perl: $(srcdir)/Makefile.PL Lasso.xs Lasso.pm chmod -R u+rwx t test.pl Makefile.PL LassoNode.xs; \ fi -Lasso.xs Lasso.pm: lang.py typemap.in typemap.out +Lasso.xs Lasso.pm: lang.py typemap-in typemap-out $(PYTHON) $(top_srcdir)/bindings/bindings.py -l perl --src-dir=$(top_srcdir)/lasso/ $(EXTRA_ARGS) Lasso.so: Lasso.xs Lasso.pm Makefile.perl gobject_handling.c LassoNode.xs glist_handling.c diff --git a/bindings/perl/lang.py b/bindings/perl/lang.py index f562533b..06ca9bbc 100644 --- a/bindings/perl/lang.py +++ b/bindings/perl/lang.py @@ -98,9 +98,12 @@ gchar *\tT_PV gboolean\tT_IV const LassoProvider *\tT_GOBJECT_WRAPPER xmlNode*\tT_XMLNODE +const xmlNode*\tT_XMLNODE GList_string\tT_GLIST_STRING GList_xmlnode\tT_GLIST_XMLNODE GList_gobject\tT_GLIST_GOBJECT +GList_string_const\tT_GLIST_STRING +GList_gobject_const\tT_GLIST_GOBJECT const GList*\tT_GLIST_STRING GHashTable*\tT_PTRREF @@ -115,8 +118,8 @@ GHashTable*\tT_PTRREF self.typemap.pn('const %-30s T_GOBJECT_WRAPPER' % (clss.name + '*')) # Create INPUT & OUTPUT maps - self.typemap.p(self.file_content('typemap.in')) - self.typemap.p(self.file_content('typemap.out')) + self.typemap.p(self.file_content('typemap-in')) + self.typemap.p(self.file_content('typemap-out')) def generate_pm_header(self): # Lasso.pm @@ -144,6 +147,8 @@ GHashTable*\tT_PTRREF typedef GList* GList_string; typedef GList* GList_gobject; typedef GList* GList_xmlnode; +typedef const GList* GList_string_const; +typedef const GList* GList_gobject_const; /* #include "ppport.h" */''') for h in self.binding_data.headers: @@ -217,7 +222,14 @@ INCLUDE: LassoNode.xs if 'get_nameIden' in name: return self.xs.pn() - self.xs.pn(func.return_type or 'void') + if not func.return_type or not is_glist(func.return_arg): + self.xs.pn(func.return_type or 'void') + elif is_glist(func.return_arg): + try: + self.xs.pn(self.glist_type(func.return_arg)) + except: + print >>sys.stderr, 'failed', func.return_arg, func + raise self.xs.p(name + '(') arg_list = [] for arg in func.args: @@ -289,7 +301,7 @@ INCLUDE: LassoNode.xs %(release)s for (; i < items; i++) { %(el_type)s data; - data = (%(el_type)s) %(convert)s; + data = (%(el_type)s)%(convert)s; %(push)s(obj->%(field)s, data); } XSRETURN(0); @@ -302,7 +314,7 @@ INCLUDE: LassoNode.xs ''' % { 'rtype': self.glist_type(member), 'field': name, 'clss': struct.name, - 'el_type': self.starify(element_type(member)), + 'el_type': self.element_type2real_type(element_type(member)), 'push': self.push_macro(member), 'convert': self.convert_function('ST(i)', member), 'release': self.release_list('obj', member), @@ -317,7 +329,10 @@ INCLUDE: LassoNode.xs return str + '*' def glist_type(self, member): - return self.element_type_lookup(member, { 'string': 'GList_string', 'xml_node': 'GList_xmlnode', 'gobject': 'GList_gobject'}) + x = self.element_type_lookup(member, { 'string': 'GList_string', 'xml_node': 'GList_xmlnode', 'gobject': 'GList_gobject'}) + if is_const(member): + return x + '_const' + return x def element_type_lookup(self, member, lookup_table): if not is_glist(member): @@ -425,7 +440,11 @@ INCLUDE: LassoNode.xs if arg_type(member) == 'void*': print 'Skipping %s' % member continue - self.generate_xs_getter_setter(struct, member) + try: + self.generate_xs_getter_setter(struct, member) + except: + print 'failed', struct, member + raise def generate_wrapper(self): pass @@ -436,3 +455,11 @@ INCLUDE: LassoNode.xs def return_value(self, vtype, options): pass + def element_type2real_type(self, type): + if is_cstring(type): + if is_const(type): + return 'const char*' + else: + return 'char*' + else: + return type + '*' diff --git a/bindings/perl/typemap.in b/bindings/perl/typemap-in index ee029372..b98c4295 100644 --- a/bindings/perl/typemap.in +++ b/bindings/perl/typemap-in @@ -7,4 +7,7 @@ T_XMLNODE $var = pv_to_xmlnode($arg); T_GLIST_STRING - $var = array_to_glist_string((AV*)$arg); + $var = array_to_glist_string((AV*)SvRV($arg)); + +T_GLIST_GOBJECT + $var = array_to_glist_gobject((AV*)SvRV($arg)); diff --git a/bindings/perl/typemap.out b/bindings/perl/typemap-out index 6327b6ad..6327b6ad 100644 --- a/bindings/perl/typemap.out +++ b/bindings/perl/typemap-out |