Add weakref support to sockets and re pattern objects.
diff --git a/Doc/lib/libweakref.tex b/Doc/lib/libweakref.tex
index c8d82a8..f2ba80b 100644
--- a/Doc/lib/libweakref.tex
+++ b/Doc/lib/libweakref.tex
@@ -48,9 +48,23 @@
 
 Not all objects can be weakly referenced; those objects which can
 include class instances, functions written in Python (but not in C),
-and methods (both bound and unbound).  Extension types can easily
-be made to support weak references; see section \ref{weakref-extension},
-``Weak References in Extension Types,'' for more information.
+methods (both bound and unbound), sets, frozensets, file objects,
+sockets, arrays, deques, and regular expression pattern objects.
+\versionchanged[Added support for files, sockets, arrays, and patterns]{2.4}
+
+Several builtin types such as \class{list} and \class{dict} do not
+directly support weak references but can add support through subclassing:
+
+\begin{verbatim}
+class Dict(dict):
+    pass
+
+obj = Dict(red=1, green=2, blue=3)   # this object is weak referencable
+\end{verbatim}
+
+Extension types can easily be made to support weak references; see section
+\ref{weakref-extension}, ``Weak References in Extension Types,'' for more
+information.
 
 
 \begin{funcdesc}{ref}{object\optional{, callback}}
diff --git a/Lib/socket.py b/Lib/socket.py
index 39d5119..e97ce59 100644
--- a/Lib/socket.py
+++ b/Lib/socket.py
@@ -147,7 +147,8 @@
 
     __doc__ = _realsocket.__doc__
 
-    __slots__ = ["_sock", "send", "recv", "sendto", "recvfrom"]
+    __slots__ = ["_sock", "send", "recv", "sendto", "recvfrom",
+                 "__weakref__"]
 
     def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, _sock=None):
         if _sock is None:
diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py
index 2363ce5..c7afdc5 100644
--- a/Lib/test/test_re.py
+++ b/Lib/test/test_re.py
@@ -5,6 +5,7 @@
 import re
 from sre import Scanner
 import sys, os, traceback
+from weakref import proxy
 
 # Misc tests from Tim Peters' re.doc
 
@@ -15,6 +16,13 @@
 import unittest
 
 class ReTests(unittest.TestCase):
+
+    def test_weakref(self):
+        s = 'QabbbcR'
+        x = re.compile('ab+c')
+        y = proxy(x)
+        self.assertEqual(x.findall('QabbbcR'), y.findall('QabbbcR'))
+
     def test_search_star_plus(self):
         self.assertEqual(re.search('x*', 'axx').span(0), (0, 0))
         self.assertEqual(re.search('x*', 'axx').span(), (0, 0))
diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py
index f7bf041..6e2f80c 100644
--- a/Lib/test/test_socket.py
+++ b/Lib/test/test_socket.py
@@ -9,6 +9,7 @@
 import thread, threading
 import Queue
 import sys
+from weakref import proxy
 
 PORT = 50007
 HOST = 'localhost'
@@ -191,6 +192,19 @@
 
 class GeneralModuleTests(unittest.TestCase):
 
+    def test_weakref(self):
+        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+        p = proxy(s)
+        self.assertEqual(p.fileno(), s.fileno())
+        s.close()
+        s = None
+        try:
+            p.fileno()
+        except ReferenceError:
+            pass
+        else:
+            self.fail('Socket proxy still exists')
+
     def testSocketError(self):
         # Testing socket module exceptions
         def raise_error(*args, **kwargs):
diff --git a/Misc/NEWS b/Misc/NEWS
index 7215483..032f76e 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -207,6 +207,9 @@
 Extension modules
 -----------------
 
+- the weakref module now supports additional objects:  array.array,
+  sre.pattern_objects, file objects, and sockets.
+
 - operator.isMappingType() and operator.isSequenceType() now give
   fewer false positives.
 
diff --git a/Modules/_sre.c b/Modules/_sre.c
index 45139bc..4be33d0 100644
--- a/Modules/_sre.c
+++ b/Modules/_sre.c
@@ -1673,6 +1673,8 @@
     Py_XINCREF(indexgroup);
     self->indexgroup = indexgroup;
 
+    self->weakreflist = NULL;
+
     return (PyObject*) self;
 }
 
@@ -1985,6 +1987,8 @@
 static void
 pattern_dealloc(PatternObject* self)
 {
+    if (self->weakreflist != NULL)
+        PyObject_ClearWeakRefs((PyObject *) self);
     Py_XDECREF(self->pattern);
     Py_XDECREF(self->groupindex);
     Py_XDECREF(self->indexgroup);
@@ -2632,6 +2636,7 @@
 
     memcpy((char*) copy + offset, (char*) self + offset,
            sizeof(PatternObject) + self->codesize * sizeof(SRE_CODE) - offset);
+    copy->weakreflist = NULL;
 
     return (PyObject*) copy;
 #else
@@ -2722,7 +2727,25 @@
     sizeof(PatternObject), sizeof(SRE_CODE),
     (destructor)pattern_dealloc, /*tp_dealloc*/
     0, /*tp_print*/
-    (getattrfunc)pattern_getattr /*tp_getattr*/
+    (getattrfunc)pattern_getattr, /*tp_getattr*/
+    0,					/* tp_setattr */
+    0,					/* tp_compare */
+    0,					/* tp_repr */
+    0,					/* tp_as_number */
+    0,					/* tp_as_sequence */
+    0,					/* tp_as_mapping */
+    0,					/* tp_hash */
+    0,					/* tp_call */
+    0,					/* tp_str */
+    0,					/* tp_getattro */
+    0,					/* tp_setattro */
+    0,					/* tp_as_buffer */
+    Py_TPFLAGS_HAVE_WEAKREFS,		/* tp_flags */
+    0,					/* tp_doc */
+    0,					/* tp_traverse */
+    0,					/* tp_clear */
+    0,					/* tp_richcompare */
+    offsetof(PatternObject, weakreflist),	/* tp_weaklistoffset */
 };
 
 /* -------------------------------------------------------------------- */
diff --git a/Modules/sre.h b/Modules/sre.h
index 4502802..b07d210 100644
--- a/Modules/sre.h
+++ b/Modules/sre.h
@@ -29,6 +29,7 @@
     /* compatibility */
     PyObject* pattern; /* pattern source (or None) */
     int flags; /* flags used when compiling pattern source */
+    PyObject *weakreflist; /* List of weak references */
     /* pattern code */
     int codesize;
     SRE_CODE code[1];