[Python-checkins] r72240 - python/branches/pep-0383/Objects/unicodeobject.c

martin.v.loewis python-checkins at python.org
Sun May 3 21:14:40 CEST 2009


Author: martin.v.loewis
Date: Sun May 3 21:14:40 2009
New Revision: 72240
Log:
Support byte results from error handlers in ucs1 and
charmap encoders.
Modified:
 python/branches/pep-0383/Objects/unicodeobject.c
Modified: python/branches/pep-0383/Objects/unicodeobject.c
==============================================================================
--- python/branches/pep-0383/Objects/unicodeobject.c	(original)
+++ python/branches/pep-0383/Objects/unicodeobject.c	Sun May 3 21:14:40 2009
@@ -4154,11 +4154,22 @@
 collstart-startp, collend-startp, &newpos);
 if (repunicode == NULL)
 goto onError;
- if (!PyUnicode_Check(repunicode)) {
- /* Implementation limitation: byte results not supported yet. */
- PyErr_SetString(PyExc_TypeError, "error handler should return unicode");
+ if (PyBytes_Check(repunicode)) {
+ /* Directly copy bytes result to output. */
+ repsize = PyBytes_Size(repunicode);
+ if (repsize > 1) {
+ /* Make room for all additional bytes. */
+ if (_PyBytes_Resize(&res, ressize+repsize-1)) {
+ Py_DECREF(repunicode);
+ goto onError;
+ }
+ ressize += repsize-1;
+ }
+ memcpy(str, PyBytes_AsString(repunicode), repsize);
+ str += repsize;
+ p = startp + newpos;
 Py_DECREF(repunicode);
- goto onError;
+ break;
 }
 /* need more space? (at least enough for what we
 have+the replacement+the rest of the string, so
@@ -5123,11 +5134,24 @@
 collstartpos, collendpos, &newpos);
 if (repunicode == NULL)
 return -1;
- if (!PyUnicode_Check(repunicode)) {
- /* Implementation limitation: byte results not supported yet. */
- PyErr_SetString(PyExc_TypeError, "error handler should return unicode");
+ if (PyBytes_Check(repunicode)) {
+ /* Directly copy bytes result to output. */
+ Py_ssize_t outsize = PyBytes_Size(*res);
+ Py_ssize_t requiredsize;
+ repsize = PyBytes_Size(repunicode);
+ requiredsize = *respos + repsize;
+ if (requiredsize > outsize)
+ /* Make room for all additional bytes. */
+ if (charmapencode_resize(res, respos, requiredsize)) {
+ Py_DECREF(repunicode);
+ return -1;
+ }
+ memcpy(PyBytes_AsString(*res) + *respos,
+ PyBytes_AsString(repunicode), repsize);
+ *respos += repsize;
+ *inpos = newpos;
 Py_DECREF(repunicode);
- return -1;
+ break;
 }
 /* generate replacement */
 repsize = PyUnicode_GET_SIZE(repunicode);
@@ -5691,7 +5715,7 @@
 if (repunicode == NULL)
 goto onError;
 if (!PyUnicode_Check(repunicode)) {
- /* Implementation limitation: byte results not supported yet. */
+ /* Byte results not supported, since they have no decimal property. */
 PyErr_SetString(PyExc_TypeError, "error handler should return unicode");
 Py_DECREF(repunicode);
 goto onError;


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /