Author: Carl Friedrich Bolz <cfb...@gmx.de>
Branch: 
Changeset: r48315:8494d35800e1
Date: 2011-10-21 17:23 +0200
http://bitbucket.org/pypy/pypy/changeset/8494d35800e1/

Log:    a test that rerased works after translation to C, which it didn't,
        so a fix too.

diff --git a/pypy/translator/c/gcc/test/test_asmgcroot.py 
b/pypy/translator/c/gcc/test/test_asmgcroot.py
--- a/pypy/translator/c/gcc/test/test_asmgcroot.py
+++ b/pypy/translator/c/gcc/test/test_asmgcroot.py
@@ -21,6 +21,7 @@
         config = get_pypy_config(translating=True)
         config.translation.gc = cls.gcpolicy
         config.translation.gcrootfinder = "asmgcc"
+        config.translation.taggedpointers = getattr(cls, "taggedpointers", 
False)
         return config
 
     @classmethod
diff --git a/pypy/translator/c/primitive.py b/pypy/translator/c/primitive.py
--- a/pypy/translator/c/primitive.py
+++ b/pypy/translator/c/primitive.py
@@ -141,7 +141,12 @@
 
 def name_gcref(value, db):
     if value:
-        realobj = value._obj.container
+        obj = value._obj
+        if isinstance(obj, int):
+            # a tagged pointer
+            assert obj & 1 == 1
+            return '((%s) %d)' % (cdecl("void*", ''), obj)
+        realobj = obj.container
         realvalue = cast_opaque_ptr(Ptr(typeOf(realobj)), value)
         return db.get(realvalue)
     else:
diff --git a/pypy/translator/c/test/test_newgc.py 
b/pypy/translator/c/test/test_newgc.py
--- a/pypy/translator/c/test/test_newgc.py
+++ b/pypy/translator/c/test/test_newgc.py
@@ -1487,6 +1487,43 @@
         res = self.run("tagged")
         assert res == expected
 
+    def define_erased(cls):
+        from pypy.rlib import rerased
+        erase, unerase = rerased.new_erasing_pair("test")
+        class Unrelated(object):
+            pass
+
+        u = Unrelated()
+        u.tagged = True
+        u.x = rerased.erase_int(41)
+        class A(object):
+            pass
+        def fn():
+            n = 1
+            while n >= 0:
+                if u.tagged:
+                    n = rerased.unerase_int(u.x)
+                    a = A()
+                    a.n = n - 1
+                    u.x = erase(a)
+                    u.tagged = False
+                else:
+                    n = unerase(u.x).n
+                    u.x = rerased.erase_int(n - 1)
+                    u.tagged = True
+        def func():
+            rgc.collect() # check that a prebuilt erased integer doesn't 
explode
+            u.x = rerased.erase_int(1000)
+            u.tagged = True
+            fn()
+            return 1
+        return func
+
+    def test_erased(self):
+        expected = self.run_orig("erased")
+        res = self.run("erased")
+        assert res == expected
+
 from pypy.rlib.objectmodel import UnboxedValue
 
 class TaggedBase(object):
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to