summaryrefslogtreecommitdiff
path: root/Python/codecs.c
diff options
context:
space:
mode:
authorMarc-André Lemburg <mal@egenix.com>2008-06-06 12:18:17 +0000
committerMarc-André Lemburg <mal@egenix.com>2008-06-06 12:18:17 +0000
commitb02358e17f67d632258e5ceb962ad8d7d1b6f4aa (patch)
tree9d3d3013f08b5eee43b296b3439705d974dd678c /Python/codecs.c
parent39e336ec3cfa778b9ad3595e2f2eeb4574f7c848 (diff)
downloadcpython-b02358e17f67d632258e5ceb962ad8d7d1b6f4aa.tar.gz
Move the codec decode type checks to bytes/bytearray.decode().
Use faster PyUnicode_FromEncodedObject() for bytes/bytearray.decode(). Add new PyCodec_KnownEncoding() API. Add new PyUnicode_AsDecodedUnicode() and PyUnicode_AsEncodedUnicode() APIs. Add missing PyUnicode_AsDecodedObject() to unicodeobject.h Fix punicode codec to also work on memoryviews.
Diffstat (limited to 'Python/codecs.c')
-rw-r--r--Python/codecs.c45
1 files changed, 25 insertions, 20 deletions
diff --git a/Python/codecs.c b/Python/codecs.c
index 33f0733e20..66576c481c 100644
--- a/Python/codecs.c
+++ b/Python/codecs.c
@@ -183,6 +183,23 @@ PyObject *_PyCodec_Lookup(const char *encoding)
return NULL;
}
+/* Codec registry encoding check API. */
+
+int PyCodec_KnownEncoding(const char *encoding)
+{
+ PyObject *codecs;
+
+ codecs = _PyCodec_Lookup(encoding);
+ if (!codecs) {
+ PyErr_Clear();
+ return 0;
+ }
+ else {
+ Py_DECREF(codecs);
+ return 1;
+ }
+}
+
static
PyObject *args_tuple(PyObject *object,
const char *errors)
@@ -344,32 +361,20 @@ PyObject *PyCodec_Encode(PyObject *object,
"encoder must return a tuple (object, integer)");
goto onError;
}
- v = PyTuple_GET_ITEM(result, 0);
- if (PyByteArray_Check(v)) {
- char msg[100];
- PyOS_snprintf(msg, sizeof(msg),
- "encoder %s returned buffer instead of bytes",
- encoding);
- if (PyErr_WarnEx(PyExc_RuntimeWarning, msg, 1) < 0) {
- v = NULL;
- goto onError;
- }
- v = PyBytes_FromStringAndSize(PyByteArray_AS_STRING(v), Py_SIZE(v));
- }
- else if (PyBytes_Check(v))
- Py_INCREF(v);
- else {
- PyErr_SetString(PyExc_TypeError,
- "encoding must return a tuple(bytes, integer)");
- v = NULL;
- }
+ v = PyTuple_GET_ITEM(result,0);
+ Py_INCREF(v);
/* We don't check or use the second (integer) entry. */
+ Py_DECREF(args);
+ Py_DECREF(encoder);
+ Py_DECREF(result);
+ return v;
+
onError:
Py_XDECREF(result);
Py_XDECREF(args);
Py_XDECREF(encoder);
- return v;
+ return NULL;
}
/* Decode an object (usually a Python string) using the given encoding