Author: Carl Friedrich Bolz <[email protected]>
Branch:
Changeset: r48473:990f8f82e063
Date: 2011-10-26 16:31 +0200
http://bitbucket.org/pypy/pypy/changeset/990f8f82e063/
Log: yet another case of tagged pointer handling in the C backend.
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
@@ -144,14 +144,19 @@
obj = value._obj
if isinstance(obj, int):
# a tagged pointer
- assert obj & 1 == 1
- return '((%s) %d)' % (cdecl("void*", ''), obj)
+ return _name_tagged(obj, db)
realobj = obj.container
+ if isinstance(realobj, int):
+ return _name_tagged(realobj, db)
realvalue = cast_opaque_ptr(Ptr(typeOf(realobj)), value)
return db.get(realvalue)
else:
return 'NULL'
+def _name_tagged(obj, db):
+ assert obj & 1 == 1
+ return '((%s) %d)' % (cdecl("void*", ''), obj)
+
def name_small_integer(value, db):
"""Works for integers of size at most INT or UINT."""
if isinstance(value, Symbolic):
diff --git a/pypy/translator/c/test/test_rtagged.py
b/pypy/translator/c/test/test_rtagged.py
--- a/pypy/translator/c/test/test_rtagged.py
+++ b/pypy/translator/c/test/test_rtagged.py
@@ -77,3 +77,12 @@
data = g.read()
g.close()
assert data.rstrip().endswith('ALL OK')
+
+def test_name_gcref():
+ from pypy.rpython.lltypesystem import lltype, llmemory, rclass
+ from pypy.translator.c import primitive
+ from pypy.translator.c.database import LowLevelDatabase
+ x = lltype.cast_int_to_ptr(rclass.OBJECTPTR, 19)
+ y = lltype.cast_opaque_ptr(llmemory.GCREF, x)
+ db = LowLevelDatabase()
+ assert primitive.name_gcref(y, db) == "((void*) 19)"
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit