I have a quasi-fix for this to the library itself, (see diff below) buuut it breaks a certain case: if you have a wrapped c++ function that takes a bool, and you try to pass it an int, you get a

    ArgumentError: Python argument types in
        builtin_converters_ext.rewrap_const_reference_bool(int)
    did not match C++ signature:
        rewrap_const_reference_bool(bool)

so you have to call the function with an explicit cast to bool:

c++:

  void takes_a_bool(bool b) { ... };

  def("py_takesbool", takes_a_bool);

py:

  py_takesbool(bool(33))

to get things to work.   This breaks a lot of tests, I'm digging further.


Index: converter/builtin_converters.cpp
===================================================================
--- converter/builtin_converters.cpp    (revision 51812)
+++ converter/builtin_converters.cpp    (working copy)
@@ -99,8 +99,13 @@
           if (number_methods == 0)
               return 0;

-          return (PyInt_Check(obj) || PyLong_Check(obj))
-              ? &number_methods->nb_int : 0;
+          return (
+#if PY_VERSION_HEX >= 0x02040000
+                 !PyBool_Check(obj) &&
+#endif
+                 (PyInt_Check(obj) || PyLong_Check(obj)))
+
+           ? &number_methods->nb_int : 0;
       }
       static PyTypeObject const* get_pytype() { return &PyInt_Type;}
   };
@@ -135,7 +140,11 @@
           if (number_methods == 0)
               return 0;

-          return (PyInt_Check(obj) || PyLong_Check(obj))
+          return (
+#if PY_VERSION_HEX >= 0x02040000
+                 !PyBool_Check(obj) &&
+#endif
+                 (PyInt_Check(obj) || PyLong_Check(obj)))
               ? &py_object_identity : 0;
       }
       static PyTypeObject const* get_pytype() { return &PyInt_Type;}
@@ -226,7 +235,11 @@
   {
       static unaryfunc* get_slot(PyObject* obj)
       {
+#if PY_VERSION_HEX >= 0x02040000
+       return obj == Py_None || PyBool_Check(obj) ? &py_object_identity : 0;
+#else
return obj == Py_None || PyInt_Check(obj) ? &py_object_identity : 0;
+#endif
       }

       static bool extract(PyObject* intermediate)
_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig

Reply via email to