[Python-checkins] cpython: Introduce PyObject* API for raising encode errors.

martin.v.loewis python-checkins at python.org
Wed Nov 2 13:29:15 CET 2011


http://hg.python.org/cpython/rev/38e961ddeb9d
changeset:   73301:38e961ddeb9d
user:        Martin v. Löwis <martin at v.loewis.de>
date:        Wed Nov 02 12:45:42 2011 +0100
summary:
  Introduce PyObject* API for raising encode errors.

files:
  Objects/unicodeobject.c |  52 +++++++++++++++++++++++++++-
  1 files changed, 49 insertions(+), 3 deletions(-)


diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -257,6 +257,12 @@
                        const Py_UNICODE *unicode, Py_ssize_t size,
                        Py_ssize_t startpos, Py_ssize_t endpos,
                        const char *reason);
+static void
+raise_encode_exception_obj(PyObject **exceptionObject,
+                       const char *encoding,
+                       PyObject *unicode,
+                       Py_ssize_t startpos, Py_ssize_t endpos,
+                       const char *reason);
 
 /* Same for linebreaks */
 static unsigned char ascii_linebreak[] = {
@@ -4786,9 +4792,9 @@
                 for(k=0; k<repsize; k++) {
                     c = prep[k];
                     if (0x80 <= c) {
-                        raise_encode_exception(&exc, "utf-8",
-                                               PyUnicode_AS_UNICODE(unicode),
-                                               size, i-1, i,
+                        raise_encode_exception_obj(&exc, "utf-8",
+                                               (PyObject*)unicode,
+                                               i-1, i,
                                                "surrogates not allowed");
                         goto error;
                     }
@@ -6434,6 +6440,33 @@
     }
 }
 
+/* This is ultimately going t replace above function. */
+static void
+make_encode_exception_obj(PyObject **exceptionObject,
+                      const char *encoding,
+                      PyObject *unicode,
+                      Py_ssize_t startpos, Py_ssize_t endpos,
+                      const char *reason)
+{
+    if (*exceptionObject == NULL) {
+        *exceptionObject = PyObject_CallFunction(
+            PyExc_UnicodeEncodeError, "sUnns",
+            encoding, unicode, startpos, endpos, reason);
+    }
+    else {
+        if (PyUnicodeEncodeError_SetStart(*exceptionObject, startpos))
+            goto onError;
+        if (PyUnicodeEncodeError_SetEnd(*exceptionObject, endpos))
+            goto onError;
+        if (PyUnicodeEncodeError_SetReason(*exceptionObject, reason))
+            goto onError;
+        return;
+      onError:
+        Py_DECREF(*exceptionObject);
+        *exceptionObject = NULL;
+    }
+}
+
 /* raises a UnicodeEncodeError */
 static void
 raise_encode_exception(PyObject **exceptionObject,
@@ -6447,6 +6480,19 @@
     if (*exceptionObject != NULL)
         PyCodec_StrictErrors(*exceptionObject);
 }
+/* This is ultimately going to replace above function. */
+static void
+raise_encode_exception_obj(PyObject **exceptionObject,
+                       const char *encoding,
+                       PyObject *unicode,
+                       Py_ssize_t startpos, Py_ssize_t endpos,
+                       const char *reason)
+{
+    make_encode_exception_obj(exceptionObject,
+                          encoding, unicode, startpos, endpos, reason);
+    if (*exceptionObject != NULL)
+        PyCodec_StrictErrors(*exceptionObject);
+}
 
 /* error handling callback helper:
    build arguments, call the callback and check the arguments,

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list