[pypy-svn] r51780 - pypy/branch/unified-rtti/pypy/rpython/lltypesystem/test

arigo at codespeak.net arigo at codespeak.net
Fri Feb 22 11:40:23 CET 2008


Author: arigo
Date: Fri Feb 22 11:40:22 2008
New Revision: 51780

Modified:
   pypy/branch/unified-rtti/pypy/rpython/lltypesystem/test/test_llmemory.py
Log:
Support for 'adr|flag' and 'adr&~flag' to set and clear flags
in the lower-order bits of an aligned address.


Modified: pypy/branch/unified-rtti/pypy/rpython/lltypesystem/test/test_llmemory.py
==============================================================================
--- pypy/branch/unified-rtti/pypy/rpython/lltypesystem/test/test_llmemory.py	(original)
+++ pypy/branch/unified-rtti/pypy/rpython/lltypesystem/test/test_llmemory.py	Fri Feb 22 11:40:22 2008
@@ -570,3 +570,41 @@
     adr += gcarrayofptr_itemsoffset + 2 * gcarrayofptr_singleitemoffset
     adr = adr.address[0]    # => s2[1][2]
     assert (adr + FieldOffset(S1, 'x')).signed[0] == -33
+
+def test_flags_in_low_bits():
+    S = lltype.GcStruct('S', ('x', lltype.Signed))
+    s = lltype.malloc(S)
+    a = cast_ptr_to_adr(s)
+    assert cast_adr_to_int(a) & 3 == 0
+    assert cast_adr_to_int(a | 0) & 3 == 0
+    assert cast_adr_to_int(a | 1) & 3 == 1
+    assert cast_adr_to_int(a | 2) & 3 == 2
+    assert cast_adr_to_int(a | 3) & 3 == 3
+    assert cast_adr_to_int(a & ~0) & 3 == 0
+    assert cast_adr_to_int(a & ~1) & 3 == 0
+    assert cast_adr_to_int(a & ~2) & 3 == 0
+    assert cast_adr_to_int(a & ~3) & 3 == 0
+    assert cast_adr_to_int((a | 1) & ~0) & 3 == 1
+    assert cast_adr_to_int((a | 1) & ~1) & 3 == 0
+    assert cast_adr_to_int((a | 1) & ~2) & 3 == 1
+    assert cast_adr_to_int((a | 1) & ~3) & 3 == 0
+    assert cast_adr_to_int((a | 2) & ~0) & 3 == 2
+    assert cast_adr_to_int((a | 2) & ~1) & 3 == 2
+    assert cast_adr_to_int((a | 2) & ~2) & 3 == 0
+    assert cast_adr_to_int((a | 2) & ~3) & 3 == 0
+    assert cast_adr_to_int((a | 3) & ~0) & 3 == 3
+    assert cast_adr_to_int((a | 3) & ~1) & 3 == 2
+    assert cast_adr_to_int((a | 3) & ~2) & 3 == 1
+    assert cast_adr_to_int((a | 3) & ~3) & 3 == 0
+    a |= 1
+    assert a != cast_ptr_to_adr(s)
+    py.test.raises(ValueError, cast_adr_to_ptr, a, lltype.Ptr(S))
+    a |= 2
+    assert a != cast_ptr_to_adr(s)
+    py.test.raises(ValueError, cast_adr_to_ptr, a, lltype.Ptr(S))
+    a &= ~1
+    assert a != cast_ptr_to_adr(s)
+    py.test.raises(ValueError, cast_adr_to_ptr, a, lltype.Ptr(S))
+    a &= ~2
+    assert a == cast_ptr_to_adr(s)
+    assert cast_adr_to_ptr(a, lltype.Ptr(S)) == s



More information about the Pypy-commit mailing list