Index: libs/python/src/dict.cpp =================================================================== --- libs/python/src/dict.cpp.orig +++ libs/python/src/dict.cpp @@ -28,9 +28,9 @@ namespace detail::new_reference dict_base::call(object const& arg_) { + union { PyTypeObject *ptop; PyObject *pop; }pun = { &PyDict_Type }; return (detail::new_reference)PyObject_CallFunction( - (PyObject*)&PyDict_Type, const_cast("(O)"), - arg_.ptr()); + pun.pop, const_cast("(O)"), arg_.ptr()); } dict_base::dict_base() Index: libs/python/src/list.cpp =================================================================== --- libs/python/src/list.cpp.orig +++ libs/python/src/list.cpp @@ -10,11 +10,11 @@ namespace boost { namespace python { nam detail::new_non_null_reference list_base::call(object const& arg_) { + union{ PyTypeObject *ptop; PyObject *pop; }pun = { &PyList_Type }; return (detail::new_non_null_reference) (expect_non_null)( PyObject_CallFunction( - (PyObject*)&PyList_Type, const_cast("(O)"), - arg_.ptr())); + pun.pop, const_cast("(O)"), arg_.ptr())); } list_base::list_base() Index: libs/python/src/long.cpp =================================================================== --- libs/python/src/long.cpp.orig +++ libs/python/src/long.cpp @@ -8,16 +8,16 @@ namespace boost { namespace python { nam new_reference long_base::call(object const& arg_) { + union { PyTypeObject *ptop; PyObject *pop; }pun = { &PyLong_Type }; return (detail::new_reference)PyObject_CallFunction( - (PyObject*)&PyLong_Type, const_cast("(O)"), - arg_.ptr()); + pun.pop, const_cast("(O)"), arg_.ptr()); } new_reference long_base::call(object const& arg_, object const& base) { + union { PyTypeObject *ptop; PyObject *pop; }pun = { &PyLong_Type }; return (detail::new_reference)PyObject_CallFunction( - (PyObject*)&PyLong_Type, const_cast("(OO)"), - arg_.ptr(), base.ptr()); + pun.pop, const_cast("(OO)"), arg_.ptr(), base.ptr()); } long_base::long_base() @@ -25,7 +25,12 @@ long_base::long_base() detail::new_reference( PyObject_CallFunction((PyObject*)&PyLong_Type, const_cast("()"))) ) -{} +{ + union { PyTypeObject *ptop; PyObject *pop; }pun = { &PyLong_Type }; + object(detail::new_reference( + PyObject_CallFunction(pun.pop, const_cast("()")))); +} + long_base::long_base(object_cref arg) : object(long_base::call(arg)) Index: libs/python/src/object/class.cpp =================================================================== --- libs/python/src/object/class.cpp.orig +++ libs/python/src/object/class.cpp @@ -612,9 +612,11 @@ namespace objects void class_base::add_property( char const* name, object const& fget, char const* docstr) { + union { PyTypeObject *ptop; PyObject *pop; }pun = { &PyProperty_Type }; + object property( (python::detail::new_reference) - PyObject_CallFunction((PyObject*)&PyProperty_Type, const_cast("Osss"), fget.ptr(), (char*)NULL, (char*)NULL, docstr)); + PyObject_CallFunction(pun.pop, const_cast("Osss"), fget.ptr(), (char*)NULL, (char*)NULL, docstr)); this->setattr(name, property); } @@ -622,9 +624,11 @@ namespace objects void class_base::add_property( char const* name, object const& fget, object const& fset, char const* docstr) { + union { PyTypeObject *ptop; PyObject *pop; }pun = { &PyProperty_Type }; + object property( (python::detail::new_reference) - PyObject_CallFunction((PyObject*)&PyProperty_Type, const_cast("OOss"), fget.ptr(), fset.ptr(), (char*)NULL, docstr)); + PyObject_CallFunction(pun.pop, const_cast("OOss"), fget.ptr(), fset.ptr(), (char*)NULL, docstr)); this->setattr(name, property); } Index: libs/python/src/str.cpp =================================================================== --- libs/python/src/str.cpp.orig +++ libs/python/src/str.cpp @@ -9,14 +9,14 @@ namespace boost { namespace python { nam detail::new_reference str_base::call(object const& arg_) { - return (detail::new_reference)PyObject_CallFunction( #if PY_VERSION_HEX >= 0x03000000 - (PyObject*)&PyUnicode_Type, + union { PyTypeObject *ptop; PyObject *pop; }pun = { &PyUnicode_Type }; #else - (PyObject*)&PyString_Type, + union { PyTypeObject *ptop; PyObject *pop; }pun = { &PyString_Type }; #endif - const_cast("(O)"), - arg_.ptr()); + + return (detail::new_reference)PyObject_CallFunction( + pun.pop, const_cast("(O)"), arg_.ptr()); } str_base::str_base() Index: libs/python/src/tuple.cpp =================================================================== --- libs/python/src/tuple.cpp.orig +++ libs/python/src/tuple.cpp @@ -8,9 +8,10 @@ namespace boost { namespace python { nam detail::new_reference tuple_base::call(object const& arg_) { + union { PyTypeObject *ptop; PyObject *pop; }pun = { &PyTuple_Type }; + return (detail::new_reference)PyObject_CallFunction( - (PyObject*)&PyTuple_Type, const_cast("(O)"), - arg_.ptr()); + pun.pop, const_cast("(O)"), arg_.ptr()); } tuple_base::tuple_base()