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.
This commit is contained in:
Marc-André Lemburg 2008-06-06 12:18:17 +00:00
parent 4efb518185
commit b2750b5d33
8 changed files with 171 additions and 41 deletions

View file

@ -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

View file

@ -261,14 +261,10 @@ Py_InitializeEx(int install_sigs)
codeset = nl_langinfo(CODESET);
if (codeset && *codeset) {
PyObject *enc = PyCodec_Encoder(codeset);
if (enc) {
codeset = strdup(codeset);
Py_DECREF(enc);
} else {
codeset = NULL;
PyErr_Clear();
}
if (PyCodec_KnownEncoding(codeset))
codeset = strdup(codeset);
else
codeset = NULL;
} else
codeset = NULL;