[pypy-svn] pypy default: (lukas) Rerased pointer patch

bivab commits-noreply at bitbucket.org
Wed Mar 16 14:47:00 CET 2011


Author: David Schneider <david.schneider at picle.org>
Branch: 
Changeset: r42713:d1981fab95dd
Date: 2011-03-16 14:43 +0100
http://bitbucket.org/pypy/pypy/changeset/d1981fab95dd/

Log:	(lukas) Rerased pointer patch

diff --git a/pypy/rlib/rerased.py b/pypy/rlib/rerased.py
--- a/pypy/rlib/rerased.py
+++ b/pypy/rlib/rerased.py
@@ -220,5 +220,7 @@
         bk = self.rtyper.annotator.bookkeeper
         s_obj = value._identity.get_input_annotation(bk)
         r_obj = self.rtyper.getrepr(s_obj)
+        if r_obj.lowleveltype is lltype.Void:
+            return lltype.nullptr(self.lowleveltype.TO)
         v = r_obj.convert_const(value._x)
         return lltype.cast_opaque_ptr(self.lowleveltype, v)

diff --git a/pypy/rlib/test/test_rerased.py b/pypy/rlib/test/test_rerased.py
--- a/pypy/rlib/test/test_rerased.py
+++ b/pypy/rlib/test/test_rerased.py
@@ -120,6 +120,28 @@
     x = interpret(f, [])
     assert x == 16 + 42 + 1
 
+def test_prebuilt_erased_in_instance():
+    erase_empty, unerase_empty = new_erasing_pair("empty")
+    class FakeList(object):
+        pass
+
+    x1 = X()
+    x1.foobar = 42
+    l1 = FakeList()
+    l1.storage = eraseX(x1)
+    l2 = FakeList()
+    l2.storage = erase_empty(None)
+
+    def f():
+        #assert is_integer(e1)
+        #assert not is_integer(e2)
+        x1.foobar += 1
+        x2 = uneraseX(l1.storage).foobar + (unerase_empty(l2.storage) is None)
+        return x2
+    x = interpret(f, [])
+    assert x == 43 + True
+
+
 def test_overflow():
     def f(i):
         try:


More information about the Pypy-commit mailing list