[pypy-svn] r12158 - in pypy/dist/pypy/rpython: . test
pedronis at codespeak.net
pedronis at codespeak.net
Tue May 10 16:20:26 CEST 2005
Author: pedronis
Date: Tue May 10 16:20:26 2005
New Revision: 12158
Modified:
pypy/dist/pypy/rpython/lltypes.py
pypy/dist/pypy/rpython/test/test_lltypes.py
Log:
recursive checking for parents too, doh
check for array el structures
with tests
Modified: pypy/dist/pypy/rpython/lltypes.py
==============================================================================
--- pypy/dist/pypy/rpython/lltypes.py (original)
+++ pypy/dist/pypy/rpython/lltypes.py Tue May 10 16:20:26 2005
@@ -20,7 +20,7 @@
def __str__(self):
return self.__class__.__name__
- def _defl(self):
+ def _defl(self, parent=None):
raise NotImplementedError
@@ -65,8 +65,8 @@
def __str__(self):
return "Struct %s { %s }" % (self._name, self._str_fields())
- def _defl(self):
- return _struct(self)
+ def _defl(self, parent=None):
+ return _struct(self, parent=parent)
class Array(ContainerType):
@@ -87,7 +87,7 @@
def __str__(self):
return self._name
- def _defl(self):
+ def _defl(self, parent=None):
return self._default
@@ -119,7 +119,7 @@
def __str__(self):
return 'ptr(%s) to %s' % (self._str_flags(), self.TO)
- def _defl(self):
+ def _defl(self, parent=None):
return _ptr(self, None)
def GcPtr(TO, **flags):
@@ -309,10 +309,13 @@
def _check(self):
if self._wrparent is not None:
- if self._wrparent() is None:
+ parent = self._wrparent()
+ if parent is None:
raise RuntimeError("accessing substructure %r,\n"
"but already garbage collected parent %r"
% (self, self._wrparent_type))
+ else:
+ parent._check()
def __repr__(self):
return '<%s>' % (self,)
@@ -341,17 +344,20 @@
if n < 0:
raise ValueError, "negative array length"
self._TYPE = TYPE
- self.items = [TYPE.OF._defl() for j in range(n)]
+ self.items = [TYPE.OF._defl(parent=self) for j in range(n)]
if parent is not None:
self._wrparent_type = typeOf(parent)
self._wrparent = weakref.ref(parent)
def _check(self):
if self._wrparent is not None:
- if self._wrparent() is None:
+ parent = self._wrparent()
+ if parent is None:
raise RuntimeError("accessing subarray %r,\n"
"but already garbage collected parent %r"
% (self, self._wrparent_type))
+ else:
+ parent._check()
def __repr__(self):
return '<%s>' % (self,)
Modified: pypy/dist/pypy/rpython/test/test_lltypes.py
==============================================================================
--- pypy/dist/pypy/rpython/test/test_lltypes.py (original)
+++ pypy/dist/pypy/rpython/test/test_lltypes.py Tue May 10 16:20:26 2005
@@ -173,3 +173,17 @@
gc.collect()
py.test.raises(RuntimeError, "p2.a")
py.test.raises(RuntimeError, "p3[0]")
+
+def test_best_effort_gced_parent_for_arrays():
+ A1 = Array(('v', Signed))
+ p1 = malloc(A1, 10)
+ p1[5].v=3
+ assert p1[0].v == 0
+ assert p1[9].v == 0
+ assert p1[5].v == 3
+ p1_5 = p1[5]
+ del p1
+ import gc
+ gc.collect()
+ py.test.raises(RuntimeError, "p1_5.v")
+
More information about the Pypy-commit
mailing list