From baccdba75cb95174f6ca791ba7177beb7208a6f1 Mon Sep 17 00:00:00 2001 From: Dave Abrahams Date: Sun, 14 Jul 2002 18:44:28 +0000 Subject: [PATCH] Better error reporting [SVN r14456] --- src/converter/callback.cpp | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/converter/callback.cpp b/src/converter/callback.cpp index f6bdcbd1..827d1e07 100644 --- a/src/converter/callback.cpp +++ b/src/converter/callback.cpp @@ -68,12 +68,12 @@ namespace detail void* result = get_lvalue_from_python(source, converters); if (!result) { - handle<> repr(PyObject_Repr(source)); handle<> msg( ::PyString_FromFormat( - "No registered converter was able to convert %s to a C++ lvalue of type %s" - , PyString_AS_STRING(repr.get()) - , converters.target_type.name())); + "No registered converter was able to extract a a C++ lvalue of type %s from this Python object of type %s" + , converters.target_type.name() + , source->ob_type->tp_name + )); PyErr_SetObject(PyExc_TypeError, msg.get()); @@ -106,20 +106,29 @@ namespace detail { handle<> holder(src); - void const* converters = data.convertible; - data = rvalue_from_python_stage1( - src, *static_cast(converters)); + void const* converters_ = data.convertible; + registration const& converters = *static_cast(converters_); + data = rvalue_from_python_stage1(src, converters); if (!data.convertible) { - PyErr_SetString( - PyExc_TypeError - , const_cast("no registered from_python lvalue or rvalue converter was able to convert object")); + handle<> msg( + ::PyString_FromFormat( + "No registered converter was able to produce a C++ lvalue of type %s from this Python object of type %s" + , converters.target_type.name() + , src->ob_type->tp_name + )); + + PyErr_SetObject(PyExc_TypeError, msg.get()); throw_error_already_set(); } + + // If a construct function was registered (i.e. we found an + // rvalue conversion), call it now. if (data.construct != 0) data.construct(src, &data); - + + // Return the address of the resulting C++ object return data.convertible; }