Remove weakref free list.  This has the side effect of fixing a memory
management bug.  Also, move some duplicated code into the new_weakref
fucntion.
diff --git a/Objects/weakrefobject.c b/Objects/weakrefobject.c
index 2e02cf2..021670a 100644
--- a/Objects/weakrefobject.c
+++ b/Objects/weakrefobject.c
@@ -5,9 +5,6 @@
 #define GET_WEAKREFS_LISTPTR(o) \
         ((PyWeakReference **) PyObject_GET_WEAKREFS_LISTPTR(o))
 
-static PyWeakReference *
-free_list = NULL;
-
 
 long
 _PyWeakref_GetWeakrefCount(PyWeakReference *head)
@@ -23,21 +20,18 @@
 
 
 static PyWeakReference *
-new_weakref(void)
+new_weakref(PyObject *ob, PyObject *callback)
 {
     PyWeakReference *result;
 
-    if (free_list != NULL) {
-        result = free_list;
-        free_list = result->wr_next;
-        result->ob_type = &_PyWeakref_RefType;
-        _Py_NewReference((PyObject *)result);
-    }
-    else {
-        result = PyObject_GC_New(PyWeakReference, &_PyWeakref_RefType);
-    }
-    if (result)
+    result = PyObject_GC_New(PyWeakReference, &_PyWeakref_RefType);
+    if (result) {
         result->hash = -1;
+        result->wr_object = ob;
+        Py_XINCREF(callback);
+        result->wr_callback = callback;
+        PyObject_GC_Track(result);
+    }
     return result;
 }
 
@@ -76,8 +70,7 @@
 {
     PyObject_GC_UnTrack((PyObject *)self);
     clear_weakref(self);
-    self->wr_next = free_list;
-    free_list = self;
+    PyObject_GC_Del(self);
 }
 
 
@@ -580,11 +573,8 @@
     if (result != NULL)
         Py_XINCREF(result);
     else {
-        result = new_weakref();
+        result = new_weakref(ob, callback);
         if (result != NULL) {
-            Py_XINCREF(callback);
-            result->wr_callback = callback;
-            result->wr_object = ob;
             if (callback == NULL) {
                 insert_head(result, list);
             }
@@ -596,7 +586,6 @@
                 else
                     insert_after(result, prev);
             }
-            PyObject_GC_Track(result);
         }
     }
     return (PyObject *) result;
@@ -624,7 +613,7 @@
     if (result != NULL)
         Py_XINCREF(result);
     else {
-        result = new_weakref();
+        result = new_weakref(ob, callback);
         if (result != NULL) {
             PyWeakReference *prev;
 
@@ -632,9 +621,6 @@
                 result->ob_type = &_PyWeakref_CallableProxyType;
             else
                 result->ob_type = &_PyWeakref_ProxyType;
-            result->wr_object = ob;
-            Py_XINCREF(callback);
-            result->wr_callback = callback;
             if (callback == NULL)
                 prev = ref;
             else
@@ -644,7 +630,6 @@
                 insert_head(result, list);
             else
                 insert_after(result, prev);
-            PyObject_GC_Track(result);
         }
     }
     return (PyObject *) result;