[Python-checkins] r84396 - in python/branches/release31-maint: Misc/ACKS Misc/NEWS Objects/unicodeobject.c

antoine.pitrou python-checkins at python.org
Wed Sep 1 17:16:42 CEST 2010


Author: antoine.pitrou
Date: Wed Sep 1 17:16:41 2010
New Revision: 84396
Log:
Merged revisions 84394 via svnmerge from 
svn+ssh://pythondev@svn.python.org/python/branches/py3k
........
 r84394 | antoine.pitrou | 2010年09月01日 17:10:12 +0200 (mer., 01 sept. 2010) | 4 lines
 
 Issue #7415: PyUnicode_FromEncodedObject() now uses the new buffer API
 properly. Patch by Stefan Behnel.
........
Modified:
 python/branches/release31-maint/ (props changed)
 python/branches/release31-maint/Misc/ACKS
 python/branches/release31-maint/Misc/NEWS
 python/branches/release31-maint/Objects/unicodeobject.c
Modified: python/branches/release31-maint/Misc/ACKS
==============================================================================
--- python/branches/release31-maint/Misc/ACKS	(original)
+++ python/branches/release31-maint/Misc/ACKS	Wed Sep 1 17:16:41 2010
@@ -58,6 +58,7 @@
 Robin Becker
 Neal Becker
 Bill Bedford
+Stefan Behnel
 Reimer Behrends
 Ben Bell
 Thomas Bellman
Modified: python/branches/release31-maint/Misc/NEWS
==============================================================================
--- python/branches/release31-maint/Misc/NEWS	(original)
+++ python/branches/release31-maint/Misc/NEWS	Wed Sep 1 17:16:41 2010
@@ -12,6 +12,9 @@
 Core and Builtins
 -----------------
 
+- Issue #7415: PyUnicode_FromEncodedObject() now uses the new buffer API
+ properly. Patch by Stefan Behnel.
+
 - Restore GIL in nis_cat in case of error.
 
 - Issue #9712: Fix tokenize on identifiers that start with non-ascii names.
Modified: python/branches/release31-maint/Objects/unicodeobject.c
==============================================================================
--- python/branches/release31-maint/Objects/unicodeobject.c	(original)
+++ python/branches/release31-maint/Objects/unicodeobject.c	Wed Sep 1 17:16:41 2010
@@ -1162,8 +1162,7 @@
 const char *encoding,
 const char *errors)
 {
- const char *s = NULL;
- Py_ssize_t len;
+ Py_buffer buffer;
 PyObject *v;
 
 if (obj == NULL) {
@@ -1171,44 +1170,44 @@
 return NULL;
 }
 
+ /* Decoding bytes objects is the most common case and should be fast */
+ if (PyBytes_Check(obj)) {
+ if (PyBytes_GET_SIZE(obj) == 0) {
+ Py_INCREF(unicode_empty);
+ v = (PyObject *) unicode_empty;
+ }
+ else {
+ v = PyUnicode_Decode(
+ PyBytes_AS_STRING(obj), PyBytes_GET_SIZE(obj),
+ encoding, errors);
+ }
+ return v;
+ }
+
 if (PyUnicode_Check(obj)) {
 PyErr_SetString(PyExc_TypeError,
 "decoding str is not supported");
 return NULL;
 }
 
- /* Coerce object */
- if (PyBytes_Check(obj)) {
- s = PyBytes_AS_STRING(obj);
- len = PyBytes_GET_SIZE(obj);
- }
- else if (PyByteArray_Check(obj)) {
- s = PyByteArray_AS_STRING(obj);
- len = PyByteArray_GET_SIZE(obj);
- }
- else if (PyObject_AsCharBuffer(obj, &s, &len)) {
- /* Overwrite the error message with something more useful in
- case of a TypeError. */
- if (PyErr_ExceptionMatches(PyExc_TypeError))
- PyErr_Format(PyExc_TypeError,
- "coercing to str: need string or buffer, "
- "%.80s found",
- Py_TYPE(obj)->tp_name);
- goto onError;
+ /* Retrieve a bytes buffer view through the PEP 3118 buffer interface */
+ if (PyObject_GetBuffer(obj, &buffer, PyBUF_SIMPLE) < 0) {
+ PyErr_Format(PyExc_TypeError,
+ "coercing to str: need bytes, bytearray "
+ "or buffer-like object, %.80s found",
+ Py_TYPE(obj)->tp_name);
+ return NULL;
 }
 
- /* Convert to Unicode */
- if (len == 0) {
+ if (buffer.len == 0) {
 Py_INCREF(unicode_empty);
- v = (PyObject *)unicode_empty;
+ v = (PyObject *) unicode_empty;
 }
 else
- v = PyUnicode_Decode(s, len, encoding, errors);
+ v = PyUnicode_Decode((char*) buffer.buf, buffer.len, encoding, errors);
 
+ PyBuffer_Release(&buffer);
 return v;
-
- onError:
- return NULL;
 }
 
 PyObject *PyUnicode_Decode(const char *s,


More information about the Python-checkins mailing list

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