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