]> granicus.if.org Git - python/commitdiff
Merged revisions 76396 via svnmerge from
authorBenjamin Peterson <benjamin@python.org>
Thu, 19 Nov 2009 03:10:36 +0000 (03:10 +0000)
committerBenjamin Peterson <benjamin@python.org>
Thu, 19 Nov 2009 03:10:36 +0000 (03:10 +0000)
svn+ssh://pythondev@svn.python.org/python/branches/py3k

................
  r76396 | benjamin.peterson | 2009-11-18 21:08:32 -0600 (Wed, 18 Nov 2009) | 10 lines

  fix __bytes__ handling here in py3x
  Merged revisions 76395 via svnmerge from
  svn+ssh://pythondev@svn.python.org/python/trunk

  ........
    r76395 | benjamin.peterson | 2009-11-18 21:00:02 -0600 (Wed, 18 Nov 2009) | 1 line

    #5037 proxy __unicode__ correctly
  ........
................

Lib/test/test_weakref.py
Misc/NEWS
Objects/weakrefobject.c

index ffa28a6169c0c270230fda37ed332429bd64e0e5..ecf197670767749b93d22c40dc80116695e12052 100644 (file)
@@ -183,6 +183,17 @@ class ReferencesTestCase(TestBase):
         self.assertEqual(L3[:5], p3[:5])
         self.assertEqual(L3[2:5], p3[2:5])
 
+    def test_proxy_unicode(self):
+        # See bug 5037
+        class C(object):
+            def __str__(self):
+                return "string"
+            def __bytes__(self):
+                return b"bytes"
+        instance = C()
+        self.assertTrue("__bytes__" in dir(weakref.proxy(instance)))
+        self.assertEqual(bytes(weakref.proxy(instance)), b"bytes")
+
     def test_proxy_index(self):
         class C:
             def __index__(self):
index 5dbee1917da3bbb4702485a363160478d5af58a1..ba07336fdd6c8c5559f4cf9bd6d430a5f73b2687 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -49,6 +49,9 @@ Library
 - Issue #3976: pprint for sets, frozensets, and dicts now succeed when
   they contain unorderable types.
 
+- Issue #5037: Proxy the __unicode__ special method instead to __unicode__
+  instead of __str__.
+
 - Issue #7341: Close the internal file object in the TarFile constructor in
   case of an error.
 
index 214dd95da75bc24345c3c3be73cc895e7dc0e37d..27f015d3a0fd637496403f9ed9f7f3ca18acd35b 100644 (file)
@@ -435,6 +435,13 @@ proxy_checkref(PyWeakReference *proxy)
         return generic(proxy, v, w); \
     }
 
+#define WRAP_METHOD(method, special) \
+    static PyObject * \
+    method(PyObject *proxy) { \
+           UNWRAP(proxy); \
+               return PyObject_CallMethod(proxy, special, ""); \
+       }
+
 
 /* direct slots */
 
@@ -576,6 +583,15 @@ proxy_iternext(PyWeakReference *proxy)
 }
 
 
+WRAP_METHOD(proxy_bytes, "__bytes__");
+
+
+static PyMethodDef proxy_methods[] = {
+       {"__bytes__", (PyCFunction)proxy_bytes, METH_NOARGS},
+       {NULL, NULL}
+};
+
+
 static PyNumberMethods proxy_as_number = {
     proxy_add,              /*nb_add*/
     proxy_sub,              /*nb_subtract*/
@@ -661,6 +677,7 @@ _PyWeakref_ProxyType = {
     0,                                  /* tp_weaklistoffset */
     (getiterfunc)proxy_iter,            /* tp_iter */
     (iternextfunc)proxy_iternext,       /* tp_iternext */
+       proxy_methods,                      /* tp_methods */
 };