From: Andy B. <an...@in...> - 2009-02-27 12:18:44
|
Hi, I have a problem on one sort of target system, which probably results from passing a mutually wrapped C++ type between two different SWIG-generated Python modules. I say "probably", because all I see as an error is a "TypeError: expected a pointer" printout, resulting from an exception thown in the SWIG module. I'd appreciate if you can collectively either solve the problem or just explain what's happening more clearly than I can currently appreciate! I don't want to burden you with app specific details, but creating pseudonyms for classes would be more likely to generate typos than leaving them unchanged, so please accept that the two SWIG-wrapped C++ classes are * HepMC::GenEvent -> hepmc.GenEvent * Rivet::AnalysisHandler -> rivet::AnalysisHandler These are mapped in two completely distinct packages, i.e. the runs of "swig -c++ -python ... " are totally independent. In the client code, then, there is a routine "analyze" on a rivet.AnalysisHandler object, which takes a hepmc.GenEvent object as its non-"self" argument. On the 32 bit Ubuntu Linux systems I've developed and tested on, this works absolutely fine --- I can pass the hepmc object around between other modules and everything is fine. On a Scientific Linux 64 bit system, though, I get the above-mentioned TypeError when calling myAnalysisHandler.analyze(myGenEvent) Digging a bit into the offending function's definition (in rivet_wrap.cc), I find this in the source code: static PyObject *_wrap_AnalysisHandler_analyze(PyObject *self, PyObject *args) { ... if(!PyArg_ParseTuple(args,( char *)"OO:AnalysisHandler_analyze",&obj0,&obj1)) goto fail; if ((SWIG_ConvertPtr(obj0,(void **) &arg1, SWIGTYPE_p_Rivet__AnalysisHandler, SWIG_POINTER_EXCEPTION | 0 )) == -1) SWIG_fail; if ((SWIG_ConvertPtr(obj1,(void **) &arg2, SWIGTYPE_p_HepMC__GenEvent, SWIG_POINTER_EXCEPTION | 0 )) == -1) SWIG_fail; if (arg2 == NULL) { PyErr_SetString(PyExc_TypeError,"null reference"); SWIG_fail; } (arg1)->analyze((HepMC::GenEvent const &)*arg2); ... } Since one of the SWIG_POINTER_EXCEPTION lines is probably responsible for the Python TypeError, I was interested to find how the SWIGTYPE_...s were defined. In rivet_wrap.cc, it was this: #define SWIGTYPE_p_HepMC__GenEvent swig_types[14] and in hepmc_wrap.cc: #define SWIGTYPE_p_HepMC__GenEvent swig_types[5] I'm now unsure of how it *ever* worked (I admit, I was amazed when this appeared to work automatically in the first place!), since the swig_types indices are completely different. But then, I know nothing of how the type mappings are actually used, and it's hopefully a bit cleverer than just matching indices ;) Can anyone advise on what the expected behaviour is, why the problem is appearing on one sort of system (I'm not sure if it's a 32/64 bit issue), and how I can fix it? Any of the above would be helpful, but the last one more than most! Thanks, Andy |