diff options
| author | Barry Warsaw <barry@python.org> | 2011-12-15 06:57:21 -0500 |
|---|---|---|
| committer | Barry Warsaw <barry@python.org> | 2011-12-15 06:57:21 -0500 |
| commit | 4c1c2eade1c5b383adad94a7a4fd6553873fecf0 (patch) | |
| tree | b9e0f45fc19539bcaddff69e661bf0c5d21bab5a /_dbus_bindings/containers.c | |
| parent | 667082d0b4aef9c438a2e7fec89614b5b8ef960a (diff) | |
| download | dbus-python-4c1c2eade1c5b383adad94a7a4fd6553873fecf0.tar.gz | |
This is the big one; it adds Python 3 support.
Diffstat (limited to '_dbus_bindings/containers.c')
| -rw-r--r-- | _dbus_bindings/containers.c | 59 |
1 files changed, 55 insertions, 4 deletions
diff --git a/_dbus_bindings/containers.c b/_dbus_bindings/containers.c index e296406..9e57243 100644 --- a/_dbus_bindings/containers.c +++ b/_dbus_bindings/containers.c @@ -167,15 +167,42 @@ Array_tp_init (DBusPyArray *self, PyObject *args, PyObject *kwargs) } if (signature != Py_None) { - const char *c_str = PyBytes_AS_STRING(signature); + const char *c_str; + PyObject *signature_as_bytes; + + if ( +#ifdef PY3 + !PyUnicode_Check(signature) +#else + !PyBytes_Check(signature) +#endif + ) + { + PyErr_SetString(PyExc_TypeError, "str expected"); + Py_CLEAR(signature); + return -1; + } +#ifdef PY3 + if (!(signature_as_bytes = PyUnicode_AsUTF8String(signature))) { + Py_CLEAR(signature); + return -1; + } +#else + signature_as_bytes = signature; + Py_INCREF(signature_as_bytes); +#endif + + c_str = PyBytes_AS_STRING(signature_as_bytes); if (!dbus_signature_validate_single(c_str, NULL)) { Py_CLEAR(signature); + Py_CLEAR(signature_as_bytes); PyErr_SetString(PyExc_ValueError, "There must be exactly one complete type in " "an Array's signature parameter"); return -1; } + Py_CLEAR(signature_as_bytes); } tuple = Py_BuildValue("(O)", obj); @@ -375,8 +402,25 @@ Dict_tp_init(DBusPyDict *self, PyObject *args, PyObject *kwargs) } if (signature != Py_None) { - const char *c_str = PyBytes_AS_STRING(signature); + const char *c_str; + PyObject *signature_as_bytes; + if (!NATIVESTR_CHECK(signature)) { + PyErr_SetString(PyExc_TypeError, "str expected"); + Py_CLEAR(signature); + return -1; + } +#ifdef PY3 + if (!(signature_as_bytes = PyUnicode_AsUTF8String(signature))) { + Py_CLEAR(signature); + return -1; + } +#else + signature_as_bytes = signature; + Py_INCREF(signature_as_bytes); +#endif + + c_str = PyBytes_AS_STRING(signature_as_bytes); switch (c_str[0]) { case DBUS_TYPE_BYTE: case DBUS_TYPE_BOOLEAN: @@ -399,6 +443,7 @@ Dict_tp_init(DBusPyDict *self, PyObject *args, PyObject *kwargs) break; default: Py_CLEAR(signature); + Py_CLEAR(signature_as_bytes); PyErr_SetString(PyExc_ValueError, "The key type in a Dictionary's signature " "must be a primitive type"); @@ -407,11 +452,13 @@ Dict_tp_init(DBusPyDict *self, PyObject *args, PyObject *kwargs) if (!dbus_signature_validate_single(c_str + 1, NULL)) { Py_CLEAR(signature); + Py_CLEAR(signature_as_bytes); PyErr_SetString(PyExc_ValueError, "There must be exactly two complete types in " "a Dictionary's signature parameter"); return -1; } + Py_CLEAR(signature_as_bytes); } tuple = Py_BuildValue("(O)", obj); @@ -526,7 +573,7 @@ Struct_tp_repr(PyObject *self) variant_level = dbus_py_variant_level_get(self); if (variant_level < 0) goto finally; - + if (variant_level > 0) { my_repr = PyUnicode_FromFormat("%s(%V, signature=%V, " "variant_level=%ld)", @@ -653,6 +700,10 @@ Struct_tp_getattro(PyObject *obj, PyObject *name) { PyObject *key, *value; +#ifdef PY3 + if (PyUnicode_CompareWithASCIIString(name, "signature")) + return dbus_py_variant_level_getattro(obj, name); +#else if (PyBytes_Check(name)) { Py_INCREF(name); } @@ -672,8 +723,8 @@ Struct_tp_getattro(PyObject *obj, PyObject *name) Py_CLEAR(name); return value; } - Py_CLEAR(name); +#endif /* PY3 */ key = PyLong_FromVoidPtr(obj); |
