TypeError: No registered converter was able to extract a C++ pointer to type char from this Python object of type str

= {<boost::less_than_comparable1<boost::python::type_info,boost::equality_comparable1<boost::python::type_info, boost::detail::empty_base<boost::python::type_info> > >> = {<boost::equality_comparable1<boost::python::type_info,boost::detail::empty_base<boost::python::type_info> = {<boost::detail::empty_base<boost::python::type_info>> = {<No data fields>}, <No data fields>}, <No data fields>}, <No data fields>}, <No data fields>}, m_base_type = 0x7fff885a066c "c"}, null_shared_ptr_only=false) at libs/python/src/object/class.cpp:485 485 if (Py_TYPE(Py_TYPE(inst)) != &class_metatype_object) (gdb) 490 for (instance_holder* match = self->objects; match != 0; match = match->next()) (gdb) 497 } (gdb) boost::python::converter::get_lvalue_from_python (source=0x1005cb1e0, converters=@0x100409500) at
::construct () at /usr/include/c++/4.2.1/ext/new_allocator.h:107 107 { ::new(__p) _Tp(__val); } (gdb) std::vector<std::pair<char const*, char const*>, std::allocator<std::pair<char const*, char const*> > >::_M_insert_aux (this=0x1001bfd40, __position={_M_current = 0x0}, __x=@0x7fff5fbff5a0) at vector.tcc:280 280 ++__new_finish; (gdb) 281 __new_finish = (gdb) __uninitialized_copy_a<std::pair<const char*, const char*>*, std::pair<const char*, const char*>*, std::pair<const char*, const char*> > [inlined] () at /usr/include/c++/4.2.1/bits/stl_uninitialized.h:114 114 _Is_POD()); (gdb) __uninitialized_copy_aux<std::pair<const char*, const char*>*, std::pair<const char*, const char*>*> [inlined] () at stl_uninitialized.h:254 254 { return std::uninitialized_copy(__first, __last, __result); } (gdb) uninitialized_copy<std::pair<const char*, const char*>*, std::pair<const char*, const char*>*> [inlined] () at stl_uninitialized.h:254 254 { return std::uninitialized_copy(__first, __last, __result); } (gdb) std::vector<std::pair<char const*, char const*>, std::allocator<std::pair<char const*, char const*> > >::_M_insert_aux (this=0x1001bfd40, __position={_M_current = 0x0}, __x=<value temporarily unavailable, due to optimizations>) at vector.tcc:293 293 std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish, (gdb) 295 _M_deallocate(this->_M_impl._M_start, (gdb) std::_Vector_base<std::pair<char const*, char const*>, std::allocator<std::pair<char const*, char const*> > >::_M_deallocate () at /usr/include/c++/4.2.1/bits/stl_vector.h:135 136 if (__p) (gdb) std::vector<std::pair<char const*, char const*>, std::allocator<std::pair<char const*, char const*> > >::_M_insert_aux (this=0x1001bfd40, __position={_M_current = 0x0}, __x=<value temporarily unavailable, due to optimizations>) at vector.tcc:298 298 this->_M_impl._M_start = __new_start; (gdb) 299 this->_M_impl._M_finish = __new_finish; (gdb) 300 this->_M_impl._M_end_of_storage = __new_start + __len; (gdb) boost::python::detail::gcc_demangle (mangled=0x7fff885a066c "c") at vector.tcc:103 103 return iterator(this->_M_impl._M_start + __n); (gdb) boost::python::detail::gcc_demangle (mangled=0x7fff885a066c "c") at
Hello: I think I am experience a build problem here but not really sure; nonetheless, below is a simple example that illustrates my problem. Any idea what I might be doing wrong. I am using boost_1_43_0 built with gcc 4.2.1 on i686 running darwin. I am linking to the standard 2.5 python that comes with the distro. Please note that the PyRun_SimpleString("import sys"); does not error at all. The error comes from when the call to import(). I am not sure if this is a clue or not but gdb seems not to know what line it is on. I am guessing it is just confused because of all the inlines. I suspect this is a linking issues of some sort. However I did check that they are all linking to the correct location. Why does it convert the const char * to a str in the first place. Seems to be thrashing around a bit. -- Brian /// contents of boost_python_issue.cpp #include <boost/python.hpp> using namespace boost::python; int main(int argc, char **argv) { Py_Initialize(); try { PyRun_SimpleString("import sys"); // This raises exception object sys = import("sys"); } catch (boost::python::error_already_set) { PyErr_Print(); } Py_Finalize(); } // Compiled with 'g++ -I. -I/usr/include -I/usr/local/include -I../../includes/python2_5_1 -g -L/usr/local/lib boost_python_issue.cpp -lboost_system -lboost_python -lm -lpython2.5 -o boost_python_issue' Output from gdb: (gdb) break main Breakpoint 1 at 0x100001319: file boost_python_issue.cpp, line 9. (gdb) r Starting program: /Project/zephyr/src/Composer/boost_python_issue Reading symbols for shared libraries .++++++++..... done Breakpoint 1, main (argc=1, argv=0x7fff5fbff6d8) at boost_python_issue.cpp:9 9 Py_Initialize(); (gdb) s 11 PyRun_SimpleString("import sys"); (gdb) 13 object sys = import("sys"); (gdb) boost::python::str::str (this=0x7fff5fbff690, s=0x10000169d "sys") at str.hpp:150 150 str(const char* s) : base(s) {} // new str (gdb) boost::python::detail::str_base::str_base (this=0x7fff5fbff690, s=0x10000169d "sys") at libs/python/src/str.cpp:39 39 )) (gdb) object [inlined] () at /Users/bray/sources/boost_1_43_0/boost/python/object_core.hpp:534 Line number 534 out of range; errors.hpp has 55 lines. (gdb) expect_non_null<PyObject> [inlined] () at /Users/bray/sources/boost_1_43_0/boost/python/errors.hpp:43 44 if (x == 0) (gdb) object [inlined] () at /Users/bray/sources/boost_1_43_0/boost/python/object_core.hpp:513 534 : object_base(expect_non_null((PyObject*)p)) (gdb) object_base [inlined] () at /Users/bray/sources/boost_1_43_0/boost/python/object_core.hpp:513 513 : m_ptr(p) (gdb) boost::python::detail::str_base::str_base (this=0x7fff5fbff690, s=<value temporarily unavailable, due to optimizations>) at libs/python/src/str.cpp:40 40 {} (gdb) 0x000000010000154d in boost::python::str::str (this=0x7fff5fbff690, s=0x10000169d "sys") at str.hpp:150 150 str(const char* s) : base(s) {} // new str (gdb) boost::python::import (name=@0x7fff5fbff690) at libs/python/src/import.cpp:19 19 char *n = python::extract<char *>(name); (gdb) extract [inlined] () at /Users/bray/sources/boost_1_43_0/boost/python/extract.hpp:156 156 # else (gdb) boost::python::api::object_base::ptr () at /Users/bray/sources/boost_1_43_0/boost/python/object_core.hpp:542 543 return m_ptr; (gdb) extract [inlined] () at /Users/bray/sources/boost_1_43_0/boost/python/extract.hpp:216 156 : base(o.ptr()) (gdb) extract_pointer [inlined] () at /Users/bray/sources/boost_1_43_0/boost/python/extract.hpp:216 219 ) (gdb) boost::python::converter::get_lvalue_from_python (source=0x1005cb1e0, converters=@0x100409500) at libs/python/src/converter/from_python.cpp:128 128 void* x = objects::find_instance_impl(source, converters.target_type); (gdb) boost::python::objects::find_instance_impl (inst=0x1005cb1e0, type={<boost::totally_ordered<boost::python::type_info,boost::python::type_info,boost::detail::empty_base<boost::python::type_info>,boost::detail::false_t>> = {<boost::totally_ordered1<boost::python::type_info,boost::detail::empty_base<boost::python::type_info> libs/python/src/converter/from_python.cpp:129 129 if (x) (gdb) 132 lvalue_from_python_chain const* chain = converters.lvalue_chain; (gdb) 133 for (;chain != 0; chain = chain->next) (gdb) 135 void* r = chain->convert(source); (gdb) boost::python::converter::(anonymous namespace)::convert_to_cstring (obj=0x1005cb1e0) at libs/python/src/converter/builtin_converters.cpp:46 46 return PyString_Check(obj) ? PyString_AsString(obj) : 0; (gdb) 47 } (gdb) boost::python::converter::get_lvalue_from_python (source=0x1005cb1e0, converters=<value temporarily unavailable, due to optimizations>) at libs/python/src/converter/from_python.cpp:136 136 if (r != 0) (gdb) 132 lvalue_from_python_chain const* chain = converters.lvalue_chain; (gdb) 133 for (;chain != 0; chain = chain->next) (gdb) 140 } (gdb) 0x00000001001a1128 in extract_pointer [inlined] () at /Users/bray/sources/boost_1_43_0/boost/python/extract.hpp:219 219 ) (gdb) boost::python::import (name=<value temporarily unavailable, due to optimizations>) at libs/python/src/import.cpp:19 19 char *n = python::extract<char *>(name); (gdb) boost::python::extract<char*>::operator char* () at /Users/bray/sources/boost_1_43_0/boost/python/extract.hpp:138 138 return (*this)(); (gdb) boost::python::converter::extract_pointer<char*>::operator() () at extract.hpp:231 232 if (m_result == 0 && m_source != Py_None) (gdb) boost::python::converter::extract_pointer<char*>::operator() () at extract.hpp:233 233 (throw_no_pointer_from_python)(m_source, registered_pointee<Ptr>::converters); (gdb) boost::python::converter::throw_no_pointer_from_python (source=0x1005cb1e0, converters=@0x100409500) at libs/python/src/converter/from_python.cpp:256 256 (throw_no_lvalue_from_python)(source, converters, "pointer"); (gdb) 257 } (gdb) boost::python::converter::throw_no_pointer_from_python (source=0x1005cb1e0, converters=@0x100409500) at libs/python/src/converter/from_python.cpp:256 256 (throw_no_lvalue_from_python)(source, converters, "pointer"); (gdb) boost::python::converter::(anonymous namespace)::throw_no_lvalue_from_python (source=0x1005cb1e0, converters=@0x100409500, ref_type=0x1001a8e55 "pointer") at libs/python/src/converter/from_python.cpp:201 201 void throw_no_lvalue_from_python(PyObject* source, registration const& converters, char const* ref_type) (gdb) 215 )); (gdb) boost::python::type_info::name () at /Users/bray/sources/boost_1_43_0/boost/python/type_id.hpp:156 156 { (gdb) boost::python::detail::gcc_demangle (mangled=0x7fff885a066c "c") at libs/python/src/converter/type_id.cpp:116 116 static mangling_map demangler; (gdb) 121 , compare_first_cstring()); (gdb) std::vector<std::pair<char const*, char const*>, std::allocator<std::pair<char const*, char const*> > >::end () at /usr/include/c++/4.2.1/bits/stl_vector.h:349 349 inline bool (gdb) __normal_iterator [inlined] () at /usr/include/c++/4.2.1/bits/stl_iterator.h:654 817 { return __lhs.base() - __rhs.base(); } (gdb) std::vector<std::pair<char const*, char const*>, std::allocator<std::pair<char const*, char const*> > >::end () at /usr/include/c++/4.2.1/bits/stl_vector.h:331 331 { return iterator(this->_M_impl._M_start); } (gdb) boost::python::detail::gcc_demangle (mangled=0x7fff885a066c "c") at libs/python/src/converter/type_id.cpp:121 121 , compare_first_cstring()); (gdb) lower_bound<__gnu_cxx::__normal_iterator<std::pair<const char*, const char*>*, std::vector<std::pair<const char*, const char*>, std::allocator<std::pair<const char*, const char*> > > >, std::pair<const char*, const char*>, boost::python::<unnamed>::compare_first_cstring> [inlined] () at /usr/include/c++/4.2.1/bits/stl_algo.h:98 98 return __last - __first; (gdb) operator-<std::pair<const char*, const char*>*, std::vector<std::pair<const char*, const char*>, std::allocator<std::pair<const char*, const char*> > > > [inlined] () at /usr/include/c++/4.2.1/bits/stl_iterator_base_funcs.h:119 119 std::__iterator_category(__first)); (gdb) __distance<__gnu_cxx::__normal_iterator<std::pair<const char*, const char*>*, std::vector<std::pair<const char*, const char*>, std::allocator<std::pair<const char*, const char*> > > > > [inlined] () at /usr/include/c++/4.2.1/bits/stl_iterator_base_funcs.h:2948 Line number 2948 out of range; stl_iterator_base_funcs.h has 182 lines. (gdb) distance<__gnu_cxx::__normal_iterator<std::pair<const char*, const char*>*, std::vector<std::pair<const char*, const char*>, std::allocator<std::pair<const char*, const char*> > > > > [inlined] () at /usr/include/c++/4.2.1/bits/stl_iterator.h:116 156 __i += __n; (gdb) lower_bound<__gnu_cxx::__normal_iterator<std::pair<const char*, const char*>*, std::vector<std::pair<const char*, const char*>, std::allocator<std::pair<const char*, const char*> > > >, std::pair<const char*, const char*>, boost::python::<unnamed>::compare_first_cstring> [inlined] () at /usr/include/c++/4.2.1/bits/stl_algo.h:2952 2952 while (__len > 0) (gdb) boost::python::detail::gcc_demangle (mangled=0x7fff885a066c "c") at libs/python/src/converter/type_id.cpp:121 121 , compare_first_cstring()); (gdb) 123 if (p == demangler.end() || strcmp(p->first, mangled)) (gdb) 128 ); (gdb) 132 if (status == -1) (gdb) 143 : keeper.p; (gdb) 152 if (cxxabi_cxa_demangle_is_broken() (gdb) cxxabi_cxa_demangle_is_broken [inlined] () at /Users/bray/sources/boost_1_43_0/libs/python/src/converter/type_id.cpp:94 97 if (!was_tested) { (gdb) 99 free_mem keeper(cxxabi::__cxa_demangle("b", 0, 0, &status)); (gdb) 100 was_tested = true; (gdb) 101 if (status == -2 || strcmp(keeper.p, "bool") != 0) { (gdb) 103 } (gdb) ~free_mem [inlined] () at /Users/bray/sources/boost_1_43_0/libs/python/src/converter/type_id.cpp:86 87 std::free(p); (gdb) boost::python::detail::gcc_demangle (mangled=0x7fff885a066c "c") at libs/python/src/converter/type_id.cpp:152 152 if (cxxabi_cxa_demangle_is_broken() (gdb) 183 p = demangler.insert(p, std::make_pair(mangled, demangled)); (gdb) 331 { return iterator(this->_M_impl._M_start); } (gdb) 183 p = demangler.insert(p, std::make_pair(mangled, demangled)); (gdb) std::vector<std::pair<char const*, char const*>, std::allocator<std::pair<char const*, char const*> > >::insert () at /usr/include/c++/4.2.1/bits/vector.tcc:93 95 if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage (gdb) 102 _M_insert_aux(__position, __x); (gdb) std::vector<std::pair<char const*, char const*>, std::allocator<std::pair<char const*, char const*> > >::_M_insert_aux (this=0x1001bfd40, __position={_M_current = 0x0}, __x=@0x7fff5fbff5a0) at vector.tcc:245 245 _M_insert_aux(iterator __position, const _Tp& __x) (gdb) 247 if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage) (gdb) 260 const size_type __old_size = size(); (gdb) std::vector<std::pair<char const*, char const*>, std::allocator<std::pair<char const*, char const*> > >::size () at /usr/include/c++/4.2.1/bits/stl_vector.h:400 400 { return size_type(this->_M_impl._M_finish - this->_M_impl._M_start); } (gdb) std::vector<std::pair<char const*, char const*>, std::allocator<std::pair<char const*, char const*> > >::_M_insert_aux (this=0x1001bfd40, __position={_M_current = 0x0}, __x=@0x7fff5fbff5a0) at vector.tcc:261 261 if (__old_size == this->max_size()) (gdb) 267 size_type __len = __old_size != 0 ? 2 * __old_size : 1; (gdb) 88 if (__builtin_expect(__n > this->max_size(), false)) (gdb) 91 return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp))); (gdb) 275 __new_finish = (gdb) __uninitialized_copy_a<std::pair<const char*, const char*>*, std::pair<const char*, const char*>*, std::pair<const char*, const char*> > [inlined] () at /usr/include/c++/4.2.1/bits/stl_uninitialized.h:114 114 _Is_POD()); (gdb) __uninitialized_copy_aux<std::pair<const char*, const char*>*, std::pair<const char*, const char*>*> [inlined] () at stl_uninitialized.h:254 254 { return std::uninitialized_copy(__first, __last, __result); } (gdb) uninitialized_copy<std::pair<const char*, const char*>*, std::pair<const char*, const char*>*> [inlined] () at stl_uninitialized.h:254 254 { return std::uninitialized_copy(__first, __last, __result); } (gdb) __gnu_cxx::new_allocator<std::pair<char const*, char const*> libs/python/src/converter/type_id.cpp:183 183 p = demangler.insert(p, std::make_pair(mangled, demangled)); (gdb) 185 } (gdb) ~free_mem [inlined] () at /Users/bray/sources/boost_1_43_0/libs/python/src/converter/type_id.cpp:86 87 std::free(p); (gdb) boost::python::detail::gcc_demangle (mangled=0x7fff885a066c "c") at libs/python/src/converter/type_id.cpp:189 189 } (gdb) boost::python::converter::(anonymous namespace)::throw_no_lvalue_from_python (source=<value temporarily unavailable, due to optimizations>, converters=<value temporarily unavailable, due to optimizations>, ref_type=0x1001a8e55 "pointer") at libs/python/src/converter/from_python.cpp:215 215 )); (gdb) handle<PyObject> [inlined] () at /Users/bray/sources/boost_1_43_0/boost/python/handle.hpp:75 75 : m_p( (gdb) boost::python::detail::manage_ptr<_object> (p=0x1005ad6b8) at handle.hpp:55 55 inline T* manage_ptr(T* p, ...) (gdb) 57 return expect_non_null(p); (gdb) expect_non_null<PyObject> [inlined] () at /Users/bray/sources/boost_1_43_0/boost/python/errors.hpp:43 44 if (x == 0) (gdb) 0x000000010018a81d in boost::python::converter::(anonymous namespace)::throw_no_lvalue_from_python (source=<value temporarily unavailable, due to optimizations>, converters=<value temporarily unavailable, due to optimizations>, ref_type=0x1001a8e55 "pointer") at libs/python/src/converter/from_python.cpp:215 215 )); (gdb) boost::python::converter::(anonymous namespace)::throw_no_lvalue_from_python (source=<value temporarily unavailable, due to optimizations>, converters=<value temporarily unavailable, due to optimizations>, ref_type=0x1001a8e55 "pointer") at libs/python/src/converter/from_python.cpp:217 217 PyErr_SetObject(PyExc_TypeError, msg.get()); (gdb) 219 throw_error_already_set(); (gdb) boost::python::throw_error_already_set () at libs/python/src/errors.cpp:61 61 throw error_already_set(); (gdb) error_already_set [inlined] () at /Users/bray/sources/boost_1_43_0/boost/python/errors.hpp:19 19 virtual ~error_already_set(); (gdb) boost::python::throw_error_already_set () at libs/python/src/errors.cpp:61 61 throw error_already_set(); (gdb) TypeError: No registered converter was able to extract a C++ pointer to type char from this Python object of type str Program exited normally.

At Fri, 13 Aug 2010 09:25:22 -0500, Brian Ray wrote:
Hello:
I think I am experience a build problem here but not really sure; nonetheless, below is a simple example that illustrates my problem.
I don't think it's a build issue.
Any idea what I might be doing wrong. I am using boost_1_43_0 built with gcc 4.2.1 on i686 running darwin. I am linking to the standard 2.5 python that comes with the distro.
Please note that the PyRun_SimpleString("import sys"); does not error at all. The error comes from when the call to import(). I am not sure if this is a clue or not but gdb seems not to know what line it is on. I am guessing it is just confused because of all the inlines. I suspect this is a linking issues of some sort. However I did check that they are all linking to the correct location. Why does it convert the const char * to a str in the first place. ^^^^^
So that it can call Python's import function.
Seems to be thrashing around a bit.
-- Brian
/// contents of boost_python_issue.cpp #include <boost/python.hpp> using namespace boost::python;
int main(int argc, char **argv) { Py_Initialize(); try { PyRun_SimpleString("import sys"); // This raises exception object sys = import("sys"); } catch (boost::python::error_already_set) { PyErr_Print(); } Py_Finalize(); }
Hmm, looks simple enough.
Output from gdb:
(gdb) break main Breakpoint 1 at 0x100001319: file boost_python_issue.cpp, line 9. (gdb) r Starting program: /Project/zephyr/src/Composer/boost_python_issue Reading symbols for shared libraries .++++++++..... done
Breakpoint 1, main (argc=1, argv=0x7fff5fbff6d8) at boost_python_issue.cpp:9 9 Py_Initialize(); (gdb) s 11 PyRun_SimpleString("import sys"); (gdb) 13 object sys = import("sys"); (gdb) boost::python::str::str (this=0x7fff5fbff690, s=0x10000169d "sys") at str.hpp:150 150 str(const char* s) : base(s) {} // new str (gdb) boost::python::detail::str_base::str_base (this=0x7fff5fbff690, s=0x10000169d "sys") at libs/python/src/str.cpp:39 39 )) (gdb) object [inlined] () at /Users/bray/sources/boost_1_43_0/boost/python/object_core.hpp:534 Line number 534 out of range; errors.hpp has 55 lines. (gdb) expect_non_null<PyObject> [inlined] () at /Users/bray/sources/boost_1_43_0/boost/python/errors.hpp:43 44 if (x == 0) (gdb) object [inlined] () at /Users/bray/sources/boost_1_43_0/boost/python/object_core.hpp:513 534 : object_base(expect_non_null((PyObject*)p)) (gdb) object_base [inlined] () at /Users/bray/sources/boost_1_43_0/boost/python/object_core.hpp:513 513 : m_ptr(p) (gdb) boost::python::detail::str_base::str_base (this=0x7fff5fbff690, s=<value temporarily unavailable, due to optimizations>) at libs/python/src/str.cpp:40 40 {} (gdb) 0x000000010000154d in boost::python::str::str (this=0x7fff5fbff690, s=0x10000169d "sys") at str.hpp:150 150 str(const char* s) : base(s) {} // new str (gdb) boost::python::import (name=@0x7fff5fbff690) at libs/python/src/import.cpp:19 19 char *n = python::extract<char *>(name);
This is where the bug is (in Boost.Python). One should never try to extract a pointer to non-const char from a str. Could you try the enclosed patch and see if your problem is fixed? -- Dave Abrahams BoostPro Computing http://www.boostpro.com

On Sat, Aug 14, 2010 at 4:51 PM, David Abrahams <dave@boostpro.com> wrote:
At Fri, 13 Aug 2010 09:25:22 -0500, Brian Ray wrote:
that they are all linking to the correct location. Why does it convert the const char * to a str in the first place. ^^^^^
So that it can call Python's import function.
Seems to be thrashing around a bit.
-- Brian
/// contents of boost_python_issue.cpp #include <boost/python.hpp> using namespace boost::python;
int main(int argc, char **argv) { Py_Initialize(); try { PyRun_SimpleString("import sys"); // This raises exception object sys = import("sys"); } catch (boost::python::error_already_set) { PyErr_Print(); } Py_Finalize(); }
Hmm, looks simple enough.
Output from gdb:
(gdb) boost::python::import (name=@0x7fff5fbff690) at libs/python/src/import.cpp:19 19 char *n = python::extract<char *>(name);
This is where the bug is (in Boost.Python). One should never try to extract a pointer to non-const char from a str. Could you try the enclosed patch and see if your problem is fixed?
Yes, applying this patch to the 1.43 release fixes the problem. Dave, can this patch be applied to version control head if it has not been already? -- Brian Ray

Yes, applying this patch to the 1.43 release fixes the problem. Dave, can this patch be applied to version control head if it has not been already?
I'll try to get to it soon. Would you mind attaching the patch to a Trac ticket for me? BTW, Boost.Python still doesn't support Py_Finalize :( -- Dave Abrahams BoostPro Computing http://www.boostpro.com
participants (3)
-
Brian Ray
-
Dave Abrahams
-
David Abrahams