
= {<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.