[Checkins] SVN: BTrees/branches/py3k/ Get bucket's __repr__ working in C extension under Py3k.

Tres Seaver cvs-admin at zope.org
Fri Dec 14 22:37:20 UTC 2012


Log message for revision 128672:
  Get bucket's __repr__ working in C extension under Py3k.

Changed:
  _U  BTrees/branches/py3k/
  U   BTrees/branches/py3k/BTrees/BucketTemplate.c

-=-
Modified: BTrees/branches/py3k/BTrees/BucketTemplate.c
===================================================================
--- BTrees/branches/py3k/BTrees/BucketTemplate.c	2012-12-14 22:37:19 UTC (rev 128671)
+++ BTrees/branches/py3k/BTrees/BucketTemplate.c	2012-12-14 22:37:20 UTC (rev 128672)
@@ -1808,6 +1808,9 @@
 bucket_repr(Bucket *self)
 {
     PyObject *i, *r;
+#ifdef PY3K
+    PyObject *rb;
+#endif
     char repr[10000];
     int rv;
 
@@ -1822,20 +1825,34 @@
     {
         return NULL;
     }
+#ifdef PY3K
+    rb = PyUnicode_AsLatin1String(r);
     rv = PyOS_snprintf(repr, sizeof(repr),
                        "%s(%s)", Py_TYPE(self)->tp_name,
+                       PyBytes_AsString(rb));
+    Py_DECREF(rb);
+#else
+    rv = PyOS_snprintf(repr, sizeof(repr),
+                       "%s(%s)", Py_TYPE(self)->tp_name,
                        PyBytes_AS_STRING(r));
+#endif
     if (rv > 0 && rv < sizeof(repr))
     {
         Py_DECREF(r);
-        return PyBytes_FromStringAndSize(repr, strlen(repr));
+#ifdef PY3K
+        return PyUnicode_DecodeLatin1(repr, sizeof(repr), "surrogateescape");
+#else
+        return PyBytes_FromStringAndSize(repr, sizeof(repr));
+#endif
     }
     else
     {
         /* The static buffer wasn't big enough */
         int size;
         PyObject *s;
-
+#ifdef PY3K
+        PyObject *result;
+#endif
         /* 3 for the parens and the null byte */
         size = strlen(Py_TYPE(self)->tp_name) + PyBytes_GET_SIZE(r) + 3;
         s = PyBytes_FromStringAndSize(NULL, size);
@@ -1846,7 +1863,13 @@
         PyOS_snprintf(PyBytes_AS_STRING(s), size,
                     "%s(%s)", Py_TYPE(self)->tp_name, PyBytes_AS_STRING(r));
         Py_DECREF(r);
+#ifdef PY3K
+        result = PyUnicode_FromEncodedObject(s, "latin1", "surrogateescape");
+        Py_DECREF(s);
+        return result;
+#else
         return s;
+#endif
     }
 }
 



More information about the checkins mailing list