From: SourceForge.net <no...@so...> - 2008-01-17 03:30:57
|
Bugs item #1844386, was opened at 2007-12-04 21:02 Message generated for change (Comment added) made by olly You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101645&aid=1844386&group_id=1645 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: code generation (general) Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Loux (loux_thefuture) Assigned to: Nobody/Anonymous (nobody) Summary: amd64: .cpp generate file don't compile Initial Comment: i use swig from a while now and every thing is fine, except that i compile now on nocona and the same files don't compile now :( here is a sample (i cut everything else from .cpp generate from .i: #include <stdio.h> void function() { void *argp4 ; va_list arg4 ; if (!argp4) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_psSystemMessage" "', argument " "4"" of type '" "va_list""'"); } else { va_list * temp = reinterpret_cast< va_list * >(argp4); arg4 = *temp; if (SWIG_IsNewObj(res4)) delete temp; } } int main(int argc, char *argv[]) { function(); return 0; } on a x86 this code compile well (gcc-4.1.2) but on a amd64 this code don't compile :( i got ISO C++ interdit l'affectation de tableaux could someone look at that please ? i'll be glade to give more details if need ---------------------------------------------------------------------- >Comment By: Olly Betts (olly) Date: 2008-01-17 03:30 Message: Logged In: YES user_id=14972 Originator: NO We don't have a va_list to copy here though, so va_copy is no help. We're converting parameters from the scripting language (Python in your case) to C++, so what we need to do is convert the trailing Python parameters to a va_list. But we can't build a va_list directly - all we can do is to specify what the "..." can be (as the manual describes), and essentially generate wrappers for this set of overloaded functions. The current generated code you are getting is just wrong - it's SWIG's generic parameter conversion, applied to va_list. Even if that compiles, it isn't going to work (at least not in a useful way). ---------------------------------------------------------------------- Comment By: Felipe Sateler Perez (fsateler) Date: 2008-01-17 02:11 Message: Logged In: YES user_id=876207 Originator: NO Note that C99 specifies a va_copy macro that fits exactly this purpose. Don't know what the status of C99 acceptance in compilers, though (or in C++ compilers, for that matter). ---------------------------------------------------------------------- Comment By: Olly Betts (olly) Date: 2008-01-17 01:19 Message: Logged In: YES user_id=14972 Originator: NO I don't think this is specific to Python, so marking as "general code gen". Wrapping a function taking va_list isn't currently possible with SWIG - see: http://www.swig.org/Doc1.3/Varargs.html#Varargs_nn8 I think the text there is a bit pessimistic though - I think we should be able to automatically generate a C/C++ function with varargs (i.e. ... in the prototype) in place of the va_list which just sets up a va_list and then calls the va_list function. Then we can wrap the automatically generated function instead. But we don't currently do that (and I don't have plans to work on it myself in the foreseeable future). For now at least, you should be able to use %extend to write such a wrapper for yourself (and wrap it as the manual explains), and then use %ignore to ignore the va_list version. Or if the API being wrapped already has a "..." equivalent, just %ignore the va_list variant. ---------------------------------------------------------------------- Comment By: Felipe Sateler Perez (fsateler) Date: 2008-01-16 12:59 Message: Logged In: YES user_id=876207 Originator: NO I have created a small testcase (copied below, how does one attach things here?). This is the result on amd64: % swig -c++ -classic -python a.i % g++ -c -fPIC a.cpp a_wrap.cxx -I/usr/include/python2.4 a_wrap.cxx: In function ‘PyObject* _wrap_vararg_vfunction(PyObject*, PyObject*)’: a_wrap.cxx:2789: error: invalid array assignment --- a.cpp #include <stdio.h> #include <stdarg.h> void vararg_vfunction( int n_args, va_list list) { int i; for( i = 0; i < n_args; i++ ) { printf("%d ", va_arg(list, int) ); } } void vararg_function(int n_args, ...) { va_list list; va_start(list,n_args); vararg_vfunction( n_args, list ); va_end(list); } --- a.i %module a %{ void vararg_function(int n_args, ...); void vararg_vfunction(int n_args, va_list list); %} void vararg_function(int n_args, ...); void vararg_vfunction(int n_args, va_list list); ---------------------------------------------------------------------- Comment By: William Fulton (wsfulton) Date: 2007-12-09 12:53 Message: Logged In: YES user_id=242951 Originator: NO Please supply a small standalone interface file showing the problem. Supplying the generated code without the source makes hunting for the bug a guessing game. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=101645&aid=1844386&group_id=1645 |