File: test_struct.py

package info (click to toggle)
pypy3 7.3.19%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 212,236 kB
  • sloc: python: 2,098,316; ansic: 540,565; sh: 21,462; asm: 14,419; cpp: 4,451; makefile: 4,209; objc: 761; xml: 530; exp: 499; javascript: 314; pascal: 244; lisp: 45; csh: 12; awk: 4
file content (69 lines) | stat: -rw-r--r-- 2,399 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import sys
from pypy.module._rawffi.structure import size_alignment_pos
from pypy.module._rawffi.interp_rawffi import TYPEMAP, letter2tp

sizeof = lambda x : size_alignment_pos(x)[0]

def unpack(desc):
    return [('x', letter2tp('space', i), 0) for i in desc]

def test_sizeof():
    s_c = sizeof(unpack('c'))
    s_l = sizeof(unpack('l'))
    s_q = sizeof(unpack('q'))
    alignment_of_q = TYPEMAP['q'].c_alignment
    assert alignment_of_q >= 4
    assert sizeof(unpack('cl')) == 2*s_l
    assert sizeof(unpack('cq')) == alignment_of_q + s_q
    assert sizeof(unpack('ccq')) == alignment_of_q + s_q
    assert sizeof(unpack('cccq')) == alignment_of_q + s_q
    assert sizeof(unpack('ccccq')) == alignment_of_q + s_q
    assert sizeof(unpack('qc')) == s_q + alignment_of_q
    assert sizeof(unpack('qcc')) == s_q + alignment_of_q
    assert sizeof(unpack('qccc')) == s_q + alignment_of_q
    assert sizeof(unpack('qcccc')) == s_q + alignment_of_q

def test_bitsizes():
    fields = [("A", 'i', 1),
              ("B", 'i', 2),
              ("C", 'i', 3),
              ("D", 'i', 4),
              ("E", 'i', 5),
              ("F", 'i', 6),
              ("G", 'i', 7),
              ("H", 'i', 8),
              ("I", 'i', 9),

              ("M", 'h', 1),
              ("N", 'h', 2),
              ("O", 'h', 3),
              ("P", 'h', 4),
              ("Q", 'h', 5),
              ("R", 'h', 6),
              ("S", 'h', 7)]
    size, alignment, pos, bitsizes = size_alignment_pos(
        [(name, letter2tp('space', t), size)
         for (name, t, size) in fields])
    assert size == 12

    import ctypes
    class X(ctypes.Structure):
        _fields_ = [(name, {'i':ctypes.c_int, 'h': ctypes.c_short}[t], size)
                    for (name, t, size) in fields]

    assert pos      == [getattr(X, name).offset for (name, _, _) in fields]
    assert bitsizes == [getattr(X, name).size   for (name, _, _) in fields]

def test_bitsizes_longlong():
    fields = [("a", 'q', 1),
              ("b", 'q', 62),
              ("c", 'q', 1)]
    size, alignment, pos, bitsizes = size_alignment_pos(
        [(name, letter2tp('space', t), size)
         for (name, t, size) in fields])
    assert size == 8
    assert pos == [0, 0, 0]
    if sys.byteorder == 'little':
        assert bitsizes == [0x10000, 0x3e0001, 0x1003f]
    else:
        assert bitsizes == [0x1003f, 0x3e0001, 0x10000]