Author: Armin Rigo <[email protected]>
Branch: 
Changeset: r57768:235ae082806e
Date: 2012-10-03 16:27 +0200
http://bitbucket.org/pypy/pypy/changeset/235ae082806e/

Log:    A constant offsetof() in a FixedSizeArray.

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
@@ -31,6 +31,11 @@
     if isinstance(value, Symbolic):
         if isinstance(value, FieldOffset):
             structnode = db.gettypedefnode(value.TYPE)
+            if isinstance(value.TYPE, FixedSizeArray):
+                assert value.fldname.startswith('item')
+                repeat = value.fldname[4:]
+                size = 'sizeof(%s)' % (cdecl(db.gettype(value.TYPE.OF), ''),)
+                return '(%s * %s)' % (size, repeat)
             return 'offsetof(%s, %s)'%(
                 cdecl(db.gettype(value.TYPE), ''),
                 structnode.c_struct_field_name(value.fldname))
diff --git a/pypy/translator/c/test/test_lladdresses.py 
b/pypy/translator/c/test/test_lladdresses.py
--- a/pypy/translator/c/test/test_lladdresses.py
+++ b/pypy/translator/c/test/test_lladdresses.py
@@ -52,6 +52,19 @@
     res = fc(42.42)
     assert res == f(42.42)
 
+def test_offset_inside_fixed_array():
+    S = lltype.FixedSizeArray(lltype.Signed, 10)
+    offset = FieldOffset(S, 'item4')
+    def f(value):
+        s = lltype.malloc(S, flavor='raw')
+        s[4] = value
+        res = (cast_ptr_to_adr(s) + offset).signed[0]
+        lltype.free(s, flavor='raw')
+        return res
+    fc = compile(f, [int])
+    res = fc(42)
+    assert res == 42
+
 def test_pointer_arithmetic():
     def f(offset, char):
         addr = raw_malloc(10000)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to