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