@@ -20,12 +20,14 @@ public: \
2020 virtual bool SetArg (PyObject*, Parameter&, CallContext* = nullptr ); \
2121 virtual PyObject* FromMemory (void *); \
2222 virtual bool ToMemory (PyObject*, void *, PyObject* = nullptr ); \
23+ virtual std::string GetFailureMsg () { return " [" #name " Converter]" ; } \
2324}; \
2425 \
2526class Const ##name##RefConverter : public Converter { \
2627public: \
2728 virtual bool SetArg (PyObject*, Parameter&, CallContext* = nullptr ); \
2829 virtual PyObject* FromMemory (void *); \
30+ virtual std::string GetFailureMsg () { return " [Const" #name " RefConverter]" ; }\
2931}
3032
3133
@@ -34,19 +36,22 @@ class name##Converter : public base##Converter { \
3436public: \
3537 virtual PyObject* FromMemory (void *); \
3638 virtual bool ToMemory (PyObject*, void *, PyObject* = nullptr ); \
39+ virtual std::string GetFailureMsg () { return " [" #name " Converter]" ; } \
3740}; \
3841 \
3942class Const ##name##RefConverter : public Converter { \
4043public: \
4144 virtual bool SetArg (PyObject*, Parameter&, CallContext* = nullptr ); \
4245 virtual PyObject* FromMemory (void *); \
46+ virtual std::string GetFailureMsg () { return " [Const" #name " RefConverter]" ; }\
4347}
4448
4549#define CPPYY_DECLARE_REFCONVERTER (name ) \
4650class name ##RefConverter : public Converter { \
4751public: \
4852 virtual bool SetArg (PyObject*, Parameter&, CallContext* = nullptr ); \
4953 virtual PyObject* FromMemory (void *); \
54+ virtual std::string GetFailureMsg () { return " [" #name " RefConverter]" ; }\
5055};
5156
5257#define CPPYY_DECLARE_ARRAY_CONVERTER (name ) \
@@ -59,6 +64,7 @@ public: \
5964 virtual PyObject* FromMemory (void *); \
6065 virtual bool ToMemory (PyObject*, void *, PyObject* = nullptr ); \
6166 virtual bool HasState () { return true ; } \
67+ virtual std::string GetFailureMsg () { return " [" #name " ArrayConverter]" ; }\
6268protected: \
6369 dims_t fShape ; \
6470 bool fIsFixed ; \
@@ -126,6 +132,7 @@ class CStringConverter : public Converter {
126132 virtual PyObject* FromMemory (void * address);
127133 virtual bool ToMemory (PyObject* value, void * address, PyObject* = nullptr );
128134 virtual bool HasState () { return true ; }
135+ virtual std::string GetFailureMsg () { return " [CStringConverter]" ; }
129136
130137protected:
131138 std::string fBuffer ;
@@ -139,6 +146,7 @@ class NonConstCStringConverter : public CStringConverter {
139146public:
140147 virtual bool SetArg (PyObject*, Parameter&, CallContext* = nullptr );
141148 virtual PyObject* FromMemory (void * address);
149+ virtual std::string GetFailureMsg () { return " [NonConstCStringConverter]" ; }
142150};
143151
144152class WCStringConverter : public Converter {
@@ -154,6 +162,7 @@ class WCStringConverter : public Converter {
154162 virtual PyObject* FromMemory (void * address);
155163 virtual bool ToMemory (PyObject* value, void * address, PyObject* = nullptr );
156164 virtual bool HasState () { return true ; }
165+ virtual std::string GetFailureMsg () { return " [WCStringConverter]" ; };
157166
158167protected:
159168 wchar_t * fBuffer ;
@@ -173,6 +182,7 @@ class CString16Converter : public Converter {
173182 virtual PyObject* FromMemory (void * address);
174183 virtual bool ToMemory (PyObject* value, void * address, PyObject* = nullptr );
175184 virtual bool HasState () { return true ; }
185+ virtual std::string GetFailureMsg () { return " [CString16Converter]" ; };
176186
177187protected:
178188 char16_t * fBuffer ;
@@ -192,6 +202,7 @@ class CString32Converter : public Converter {
192202 virtual PyObject* FromMemory (void * address);
193203 virtual bool ToMemory (PyObject* value, void * address, PyObject* = nullptr );
194204 virtual bool HasState () { return true ; }
205+ virtual std::string GetFailureMsg () { return " [CString32Converter]" ; };
195206
196207protected:
197208 char32_t * fBuffer ;
@@ -224,6 +235,7 @@ class CStringArrayConverter : public SCharArrayConverter {
224235 using SCharArrayConverter::SCharArrayConverter;
225236 virtual bool SetArg (PyObject*, Parameter&, CallContext* = nullptr );
226237 virtual PyObject* FromMemory (void * address);
238+ virtual std::string GetFailureMsg () { return " [CStringArrayConverter]" ; };
227239
228240private:
229241 std::vector<const char *> fBuffer ;
@@ -233,6 +245,7 @@ class NonConstCStringArrayConverter : public CStringArrayConverter {
233245public:
234246 using CStringArrayConverter::CStringArrayConverter;
235247 virtual PyObject* FromMemory (void * address);
248+ virtual std::string GetFailureMsg () { return " [NonConstCStringArrayConverter]" ; };
236249};
237250
238251// converters for special cases
@@ -247,6 +260,7 @@ class InstanceConverter : public StrictInstancePtrConverter {
247260 virtual bool SetArg (PyObject*, Parameter&, CallContext* = nullptr );
248261 virtual PyObject* FromMemory (void *);
249262 virtual bool ToMemory (PyObject*, void *, PyObject* = nullptr );
263+ virtual std::string GetFailureMsg () { return " [InstanceConverter]" ; };
250264};
251265
252266class InstanceRefConverter : public Converter {
@@ -258,6 +272,7 @@ class InstanceRefConverter : public Converter {
258272 virtual bool SetArg (PyObject*, Parameter&, CallContext* = nullptr );
259273 virtual PyObject* FromMemory (void * address);
260274 virtual bool HasState () { return true ; }
275+ virtual std::string GetFailureMsg () { return " [InstanceRefConverter]" ; };
261276
262277protected:
263278 Cppyy::TCppType_t fClass ;
@@ -268,6 +283,7 @@ class InstanceMoveConverter : public InstanceRefConverter {
268283public:
269284 InstanceMoveConverter (Cppyy::TCppType_t klass) : InstanceRefConverter(klass, true ) {}
270285 virtual bool SetArg (PyObject*, Parameter&, CallContext* = nullptr );
286+ virtual std::string GetFailureMsg () { return " [InstanceMoveConverter]" ; };
271287};
272288
273289template <bool ISREFERENCE>
@@ -279,6 +295,7 @@ class InstancePtrPtrConverter : public InstancePtrConverter<false> {
279295 virtual bool SetArg (PyObject*, Parameter&, CallContext* = nullptr );
280296 virtual PyObject* FromMemory (void * address);
281297 virtual bool ToMemory (PyObject* value, void * address, PyObject* = nullptr );
298+ virtual std::string GetFailureMsg () { return " [InstancePtrPtrConverter]" ; };
282299};
283300
284301class InstanceArrayConverter : public InstancePtrConverter <false > {
@@ -292,6 +309,7 @@ class InstanceArrayConverter : public InstancePtrConverter<false> {
292309 virtual bool SetArg (PyObject*, Parameter&, CallContext* = nullptr );
293310 virtual PyObject* FromMemory (void * address);
294311 virtual bool ToMemory (PyObject* value, void * address, PyObject* = nullptr );
312+ virtual std::string GetFailureMsg () { return " [InstanceArrayConverter]" ; };
295313
296314protected:
297315 dims_t fShape ;
@@ -307,6 +325,7 @@ class ComplexDConverter: public InstanceConverter {
307325 virtual PyObject* FromMemory (void * address);
308326 virtual bool ToMemory (PyObject* value, void * address, PyObject* = nullptr );
309327 virtual bool HasState () { return true ; }
328+ virtual std::string GetFailureMsg () { return " [ComplexDConverter]" ; };
310329
311330private:
312331 std::complex <double > fBuffer ;
@@ -318,25 +337,29 @@ class ComplexDConverter: public InstanceConverter {
318337class STLIteratorConverter : public Converter {
319338public:
320339 virtual bool SetArg (PyObject*, Parameter&, CallContext* = nullptr );
340+ virtual std::string GetFailureMsg () { return " [STLIteratorConverter]" ; };
321341};
322342// -- END CLING WORKAROUND
323343
324344
325345class VoidPtrRefConverter : public Converter {
326346public:
327347 virtual bool SetArg (PyObject*, Parameter&, CallContext* = nullptr );
348+ virtual std::string GetFailureMsg () { return " [VoidPtrRefConverter]" ; };
328349};
329350
330351class VoidPtrPtrConverter : public Converter {
331352public:
332- VoidPtrPtrConverter (cdims_t dims);
353+ VoidPtrPtrConverter (cdims_t dims, const std::string &failureMsg = std::string() );
333354 virtual bool SetArg (PyObject*, Parameter&, CallContext* = nullptr );
334355 virtual PyObject* FromMemory (void * address);
335356 virtual bool HasState () { return true ; }
357+ virtual std::string GetFailureMsg () { return " [VoidPtrPtrConverter] " + fFailureMsg ; }
336358
337359protected:
338360 dims_t fShape ;
339361 bool fIsFixed ;
362+ const std::string fFailureMsg ;
340363};
341364
342365CPPYY_DECLARE_BASIC_CONVERTER (PyObject);
@@ -351,6 +374,7 @@ public: \
351374 virtual PyObject* FromMemory (void * address); \
352375 virtual bool ToMemory (PyObject*, void *, PyObject* = nullptr ); \
353376 virtual bool HasState () { return true ; } \
377+ virtual std::string GetFailureMsg () { return " [" #name " Converter]" ; }; \
354378protected: \
355379 strtype fBuffer ; \
356380}
@@ -371,6 +395,7 @@ class STLStringMoveConverter : public STLStringConverter {
371395
372396public:
373397 virtual bool SetArg (PyObject*, Parameter&, CallContext* = nullptr );
398+ virtual std::string GetFailureMsg () { return " [STLStringMoveConverter]" ; };
374399};
375400
376401
@@ -385,6 +410,7 @@ class FunctionPointerConverter : public Converter {
385410 virtual PyObject* FromMemory (void * address);
386411 virtual bool ToMemory (PyObject*, void *, PyObject* = nullptr );
387412 virtual bool HasState () { return true ; }
413+ virtual std::string GetFailureMsg () { return " [FunctionPointerConverter]" ; };
388414
389415protected:
390416 std::string fRetType ;
@@ -404,6 +430,7 @@ class StdFunctionConverter : public FunctionPointerConverter {
404430 virtual bool SetArg (PyObject*, Parameter&, CallContext* = nullptr );
405431 virtual PyObject* FromMemory (void * address);
406432 virtual bool ToMemory (PyObject* value, void * address, PyObject* = nullptr );
433+ virtual std::string GetFailureMsg () { return " [StdFunctionConverter]" ; };
407434
408435protected:
409436 Converter* fConverter ;
@@ -425,6 +452,7 @@ class SmartPtrConverter : public Converter {
425452 virtual PyObject* FromMemory (void * address);
426453 // virtual bool ToMemory(PyObject*, void*, PyObject* = nullptr);
427454 virtual bool HasState () { return true ; }
455+ virtual std::string GetFailureMsg () { return " [SmartPtrConverter]" ; };
428456
429457protected:
430458 virtual bool GetAddressSpecialCase (PyObject*, void *&) { return false ; }
@@ -449,6 +477,7 @@ class InitializerListConverter : public InstanceConverter {
449477public:
450478 virtual bool SetArg (PyObject*, Parameter&, CallContext* = nullptr );
451479 virtual bool HasState () { return true ; }
480+ virtual std::string GetFailureMsg () { return " [FunctionPointerConverter]" ; };
452481
453482protected:
454483 void Clear ();
@@ -464,7 +493,11 @@ class InitializerListConverter : public InstanceConverter {
464493// raising converter to take out overloads
465494class NotImplementedConverter : public Converter {
466495public:
496+ NotImplementedConverter (const std::string &failureMsg = std::string()) : fFailureMsg {failureMsg} {}
467497 virtual bool SetArg (PyObject*, Parameter&, CallContext* = nullptr );
498+ virtual std::string GetFailureMsg () { return " [NotImplementedConverter] " + fFailureMsg ; }
499+ protected:
500+ const std::string fFailureMsg ;
468501};
469502
470503} // unnamed namespace
0 commit comments