- The repr() of a weakref object now shows the __name__ attribute of
  the referenced object, if it has one.

Also use %p to format pointers consistently, and use <weakproxy ...>
in proxy_repr(), to match the type name.
diff --git a/Objects/weakrefobject.c b/Objects/weakrefobject.c
index b059080..e26cb65 100644
--- a/Objects/weakrefobject.c
+++ b/Objects/weakrefobject.c
@@ -124,15 +124,24 @@
 {
     char buffer[256];
     if (PyWeakref_GET_OBJECT(self) == Py_None) {
-        PyOS_snprintf(buffer, sizeof(buffer), "<weakref at %lx; dead>",
-		      (long)(self));
+        PyOS_snprintf(buffer, sizeof(buffer), "<weakref at %p; dead>", self);
     }
     else {
+	char *name = NULL;
+	PyObject *nameobj = PyObject_GetAttrString(PyWeakref_GET_OBJECT(self),
+						   "__name__");
+	if (nameobj == NULL)
+		PyErr_Clear();
+	else if (PyString_Check(nameobj))
+		name = PyString_AS_STRING(nameobj);
         PyOS_snprintf(buffer, sizeof(buffer),
-		      "<weakref at %#lx; to '%.50s' at %#lx>",
-		      (long)(self),
+		      name ? "<weakref at %p; to '%.50s' at %p (%s)>"
+		           : "<weakref at %p; to '%.50s' at %p>",
+		      self,
 		      PyWeakref_GET_OBJECT(self)->ob_type->tp_name,
-		      (long)(PyWeakref_GET_OBJECT(self)));
+		      PyWeakref_GET_OBJECT(self),
+		      name);
+	Py_XDECREF(nameobj);
     }
     return PyString_FromString(buffer);
 }
@@ -268,7 +277,7 @@
 {
     char buf[160];
     PyOS_snprintf(buf, sizeof(buf),
-		  "<weakref at %p to %.100s at %p>", proxy,
+		  "<weakproxy at %p to %.100s at %p>", proxy,
 		  PyWeakref_GET_OBJECT(proxy)->ob_type->tp_name,
 		  PyWeakref_GET_OBJECT(proxy));
     return PyString_FromString(buf);