int f_newlinetypes; /* Types of newlines seen */
int f_skipnextlf; /* Skip next \n */
PyObject *f_encoding;
+ PyObject *weakreflist; /* List of weak references */
} PyFileObject;
PyAPI_DATA(PyTypeObject) PyFile_Type;
import unittest
from test import test_support
+from weakref import proxy
import array, cStringIO, math
tests = [] # list to accumulate all tests
b = buffer(a)
self.assertEqual(b[0], a.tostring()[0])
+ def test_weakref(self):
+ s = array.array(self.typecode, self.example)
+ p = proxy(s)
+ self.assertEqual(p.tostring(), s.tostring())
+ s = None
+ self.assertRaises(ReferenceError, len, p)
+
def test_bug_782369(self):
import sys
if hasattr(sys, "getrefcount"):
b = array.array('B', range(64))
self.assertEqual(rc, sys.getrefcount(10))
+
+
class StringTest(BaseTest):
def test_setitem(self):
import sys
import os
from array import array
+from weakref import proxy
from test.test_support import verify, TESTFN, TestFailed
from UserList import UserList
+# verify weak references
+f = file(TESTFN, 'w')
+p = proxy(f)
+p.write('teststring')
+verify(f.tell(), p.tell())
+f.close()
+f = None
+try:
+ p.tell()
+except ReferenceError:
+ pass
+else:
+ raise TestFailed('file proxy still exists when the file is gone')
+
# verify expected attributes exist
f = file(TESTFN, 'w')
softspace = f.softspace
The item type is restricted to simple C types like int or float */
#include "Python.h"
+#include "structmember.h"
#ifdef STDC_HEADERS
#include <stddef.h>
char *ob_item;
int allocated;
struct arraydescr *ob_descr;
+ PyObject *weakreflist; /* List of weak references */
} arrayobject;
static PyTypeObject Arraytype;
}
op->ob_descr = descr;
op->allocated = size;
+ op->weakreflist = NULL;
return (PyObject *) op;
}
static void
array_dealloc(arrayobject *op)
{
+ if (op->weakreflist != NULL)
+ PyObject_ClearWeakRefs((PyObject *) op);
if (op->ob_item != NULL)
PyMem_DEL(op->ob_item);
op->ob_type->tp_free((PyObject *)op);
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
&array_as_buffer, /* tp_as_buffer*/
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
arraytype_doc, /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
array_richcompare, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
+ offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */
(getiterfunc)array_iter, /* tp_iter */
0, /* tp_iternext */
array_methods, /* tp_methods */
static void
file_dealloc(PyFileObject *f)
{
+ if (f->weakreflist != NULL)
+ PyObject_ClearWeakRefs((PyObject *) f);
if (f->f_fp != NULL && f->f_close != NULL) {
Py_BEGIN_ALLOW_THREADS
(*f->f_close)(f->f_fp);
((PyFileObject *)self)->f_mode = not_yet_string;
Py_INCREF(Py_None);
((PyFileObject *)self)->f_encoding = Py_None;
+ ((PyFileObject *)self)->weakreflist = NULL;
}
return self;
}
/* softspace is writable: we must supply tp_setattro */
PyObject_GenericSetAttr, /* tp_setattro */
0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
file_doc, /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
+ offsetof(PyFileObject, weakreflist), /* tp_weaklistoffset */
(getiterfunc)file_getiter, /* tp_iter */
(iternextfunc)file_iternext, /* tp_iternext */
file_methods, /* tp_methods */