On Wed, 31 Mar 2010 23:02:49 +0200, Denis Rivière <[email protected]> wrote: > Hi, > Using sip 4.10 or sip 4.10.1, I have crashes when a C++ exception is thrown > > from a C++ class constructor. It happens either if the exception is > declared > in the sip binding or not. > I experienced it on a Linux system (Fedora 12). > > A small example: > > # C++ header: > #ifndef WORD_H > #define WORD_H > > class Word { > public: > char *the_word; > > Word(const char *w); > virtual ~Word(); > > }; > #endif > #-- > > # C++ implementation: > #include "word.h" > #include <string> > #include <stdexcept> > #include <string.h> > #include <stdlib.h> > > using namespace std; > > Word::Word(const char *w) : the_word( strdup( w ) ) > { > if( string( w ) == "exception" ) > throw runtime_error( "exception in constructor" ); > } > > Word::~Word() > { > free( the_word ); > } > #-- > > # sip code: > %Module word 0 > > %Exception std::exception(SIP_Exception) /PyName=StdException/ > { > %TypeHeaderCode > #include <exception> > %End > %RaiseCode > const char *detail = sipExceptionRef.what(); > > SIP_BLOCK_THREADS > PyErr_SetString(sipException_StdException, detail); > SIP_UNBLOCK_THREADS > %End > }; > > > %Exception std::runtime_error(std::exception) /PyName=RuntimeError/ > { > %TypeHeaderCode > #include <stdexcept> > %End > %RaiseCode > const char *detail = sipExceptionRef.what(); > std::cout << "throw/raise runtime_error: " << detail << std::endl; > > SIP_BLOCK_THREADS > PyErr_SetString(sipException_std_runtime_error, detail); > SIP_UNBLOCK_THREADS > %End > }; > > class Word { > > %TypeHeaderCode > #include <word.h> > #include <stdexcept> > %End > > public: > Word(const char *) /* throw( std::runtime_error ) */; > virtual ~Word(); > > }; > #-- > > # test case: > import word > w = word.Word( 'toto' ) # doesn't crash > x = word.Word( 'exception' ) # crashes > # -- > > If I un-comment the throw() on the constructor in the .sip file, it still
> crashes. > It did not crash using older versions of sip (4.7.x at least). > It seems to happen after the sip binding code is executed (after > init_Word(...) in the sip-generated source), when back in the sip.so > module. Fixed in Hg. Thanks for the test case. Phil _______________________________________________ PyQt mailing list [email protected] http://www.riverbankcomputing.com/mailman/listinfo/pyqt
