[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