Exemplo n.º 1
0
    def test_mdarray(self):
        N = 10
        FFI = self.FFI
        ArTy = FFI.arrayType(FFI.DoubleTy, N)
        Ar = ArTy()
        for i in range(len(Ar)):
            Ar[i] = i
        Ref = [float(i) for i in range(len(Ar))]
        self.assertEqual(list(Ar), Ref)
        ArV = memoryview(Ar)
        self.assertEqual(ArV.format, "d")

        def upck_double(v):
            if isinstance(v, float):
                return v
            return struct.unpack("d", v)[0]

        self.assertTrue(all(upck_double(a) == b for a, b in zip(ArV, Ref)))

        Ar2Ty = FFI.arrayType(FFI.arrayType(FFI.DoubleTy, 10), 2)
        Ar = Ar2Ty()
        ArV = memoryview(Ar)
        self.assertEqual(ArV.format, "d")
        self.assertEqual(ArV.ndim, 2)
        self.assertEqual(ArV.shape, (2, 10))
        self.assertEqual(ArV.strides, (80, 8))

        try:
            import numpy as np
        except ImportError:
            return

        ar = np.ndarray(N)
        car = pydffi.view_as(ArTy, ar)
        self.assertTrue(all(a == b for a, b in zip(ar, car)))
Exemplo n.º 2
0
    def test_views(self):
        F = self.FFI
        CU = F.cdef('''
#include <stdint.h>
typedef struct {
  uint32_t a;
  uint64_t b;
} A;
        ''')

        A = CU.types.A
        Len = A.size
        S = pydffi.view_as(pydffi.const(A), b"A" * Len)
        self.assertEqual(int(S.a), 0x41414141)
        self.assertEqual(int(S.b), 0x4141414141414141)
        B = bytearray(pydffi.view_as_bytes(S))
        self.assertEqual(B, b"A" * Len)

        B = pydffi.view_as_bytes(S)
        One = 1 if sys.version_info >= (3, 0) else struct.pack("B", 1)
        B[0] = One
        B[1] = One
        B[2] = One
        B[3] = One
        self.assertEqual(int(S.a), 0x01010101)
Exemplo n.º 3
0
    def test_structsformat(self):
        FFI = pydffi.FFI()
        CU = FFI.cdef('''
#include <stdbool.h>
typedef struct {
    bool a;
    unsigned int b;
    unsigned short c;
} A;

typedef struct {
    unsigned char buf[9];
    unsigned short v0;
    A a;
    unsigned short v1;
} B;
        ''')

        vA = CU.types.A(a=1,b=0xAAAAAAAA,c=0x4444)
        buf = pydffi.view_as_bytes(vA)
        vAup = struct.unpack(CU.types.A.format, buf)
        self.assertEqual(vAup,  (1,0xAAAAAAAA,0x4444))

        buf_ref = bytearray(b"012345678")
        vB = CU.types.B(v0=1,v1=2,a=vA,buf=pydffi.view_as(CU.types.B.buf.type, buf_ref))
        buf = pydffi.view_as_bytes(vB)
        vBup = struct.unpack(CU.types.B.format, buf)
        self.assertEqual(bytearray(vBup[:9]), buf_ref)
        self.assertEqual(vBup[9:], (1,1,0xAAAAAAAA,0x4444,2))
Exemplo n.º 4
0
    def test_buffers(self):
        CU = self.FFI.compile('''
#include <stdio.h>
#include <stdint.h>

void print(const char* msg) {
    puts(msg);
}
void print_u8(uint8_t const* buf, size_t len) {
    for (size_t i = 0; i < len; ++i) {
        printf("%02X ", buf[i]);
    }
    printf("\\n");
} 

void bytesupper(uint8_t* S) {
    const size_t Len = strlen(S);
    printf("%lu\\n", Len);
    for (size_t i = 0; i < Len; ++i) {
        S[i] = toupper(S[i]);
    }
}

void strupper(char* S) {
    bytesupper(S);
}
        ''')
        print_ = getattr(CU.funcs, "print")
        print_u8 = CU.funcs.print_u8
        bytesupper = CU.funcs.bytesupper
        strupper = CU.funcs.strupper

        # CHECK: coucou
        print_("coucou")
        # CHECK: héllo 
        print_("héllo")

        buf = u"héllo".encode("utf8")
        # CHECK: 68 C3 A9 6C 6C 6F
        print_u8(buf, len(buf))

        buf = bytearray(b"hello")
        bytesupper(buf)
        self.assertEqual(buf, b"HELLO")

        buf = bytearray(b"hello")
        buf_char = pydffi.view_as(self.FFI.arrayType(self.FFI.UInt8Ty, len(buf)), buf)
        strupper(pydffi.cast(pydffi.ptr(buf_char),self.FFI.CharPtrTy))
        self.assertEqual(buf, b"HELLO")
Exemplo n.º 5
0
    def test_union(self):
        FFI = pydffi.FFI()
        CU = FFI.cdef('''
#include <stdint.h>
typedef union {
  struct {
    uint8_t v8[4];
  };
  uint32_t v32;
} IP;
''')
        Obj = CU.types.IP()
        Obj.v32 = 0xAABBCCDD
        for IP in self.generated_types(CU.types.IP, "IP"):
            V = self.purectypes.unpack(IP, bytes(pydffi.view_as_bytes(Obj)))
            self.assertEqual(V.v32, 0xAABBCCDD)
            for i in range(4):
                self.assertEqual(V.v8[i], Obj.v8[i])
            V = self.purectypes.pack(IP, V)
            V = pydffi.view_as(pydffi.const(CU.types.IP), V)
            self.assertEqual(V.v32, 0xAABBCCDD)
Exemplo n.º 6
0
    def test_views(self):
        F = self.FFI
        CU = F.cdef('''
typedef struct {
  unsigned int a;
  unsigned long long b;
} A;
        ''')

        S = pydffi.view_as(pydffi.const(CU.types.A), b"A" * 16)
        self.assertEqual(int(S.a), 0x41414141)
        self.assertEqual(int(S.b), 0x4141414141414141)
        B = bytearray(pydffi.view_as_bytes(S))
        self.assertEqual(B, b"A" * 16)

        B = pydffi.view_as_bytes(S)
        One = 1 if sys.version_info >= (3, 0) else struct.pack("B", 1)
        B[0] = One
        B[1] = One
        B[2] = One
        B[3] = One
        self.assertEqual(int(S.a), 0x01010101)
Exemplo n.º 7
0
    def test_struct(self):
        FFI = pydffi.FFI()
        CU = FFI.cdef('''
typedef struct {
  unsigned char a;
  int b;
  int c;
  short d;
} A;
''')
        Obj = CU.types.A(a=1, b=2, c=10, d=20)
        for A in self.generated_types(CU.types.A, "A"):
            V = self.purectypes.unpack(A, bytes(pydffi.view_as_bytes(Obj)))
            self.assertEqual(V.a, 1)
            self.assertEqual(V.b, 2)
            self.assertEqual(V.c, 10)
            self.assertEqual(V.d, 20)
            V = self.purectypes.pack(A, V)
            V = pydffi.view_as(CU.types.A, V)
            self.assertEqual(Obj.a, V.a)
            self.assertEqual(Obj.b, V.b)
            self.assertEqual(Obj.c, V.c)
            self.assertEqual(Obj.d, V.d)
Exemplo n.º 8
0
 def get_buf_view(self):
     FFI = getFFI()
     buf = bytearray(b"hello\x00")
     return FFI, pydffi.view_as(FFI.arrayType(FFI.UInt8Ty, len(buf)), buf)
Exemplo n.º 9
0
}

void strupper(char* S) {
    bytesupper(S);
}
''')
print_ = getattr(CU.funcs, "print")
print_u8 = CU.funcs.print_u8
bytesupper = CU.funcs.bytesupper
strupper = CU.funcs.strupper

# CHECK: coucou
print_("coucou")
# CHECK: héllo 
print_("héllo")

buf = u"héllo".encode("utf8")
# CHECK: 68 C3 A9 6C 6C 6F
print_u8(buf, len(buf))

buf = bytearray(b"hello")
# CHECK: 5
bytesupper(buf)
assert(buf == b"HELLO")

buf = bytearray(b"hello")
buf_char = pydffi.view_as(FFI.arrayType(FFI.UInt8Ty, len(buf)), buf)
# CHECK: 5
strupper(pydffi.cast(pydffi.ptr(buf_char),FFI.CharPtrTy))
assert(buf == b"HELLO")
Exemplo n.º 10
0
Ref = [float(i) for i in range(len(Ar))]
assert (list(Ar) == Ref)
ArV = memoryview(Ar)
assert (ArV.format == "d")


def upck_double(v):
    if isinstance(v, float):
        return v
    return struct.unpack("d", v)[0]


assert (all(upck_double(a) == b for a, b in zip(ArV, Ref)))

Ar2Ty = FFI.arrayType(FFI.arrayType(FFI.DoubleTy, 10), 2)
Ar = Ar2Ty()
ArV = memoryview(Ar)
assert (ArV.format == "d")
assert (ArV.ndim == 2)
assert (ArV.shape == (2, 10))
assert (ArV.strides == (80, 8))

try:
    import numpy as np
except ImportError:
    sys.exit(0)

ar = np.ndarray(N)
car = pydffi.view_as(ArTy, ar)
assert (all(a == b for a, b in zip(ar, car)))
Exemplo n.º 11
0
# RUN: "%python" "%s"

import pydffi
import sys
import struct

F = pydffi.FFI()
CU = F.compile('''
#include <stdio.h>
struct A {
  unsigned int a;
  unsigned long long b;
};

void print(struct A a) { printf("%u %lu\\n", a.a, a.b); }
''')

S = pydffi.view_as(pydffi.const(CU.types.A), b"A"*16)
assert(int(S.a) == 0x41414141)
assert(int(S.b) == 0x4141414141414141)
B = bytearray(pydffi.view_as_bytes(S))
assert(B == b"A"*16)

B = pydffi.view_as_bytes(S)
One = 1 if sys.version_info >= (3, 0) else struct.pack("B", 1)
B[0] = One
B[1] = One
B[2] = One
B[3] = One
assert(int(S.a) == 0x01010101)
Exemplo n.º 12
0
CU = FFI.cdef('''
#include <stdbool.h>
typedef struct {
    bool a;
    unsigned int b;
    unsigned short c;
} A;

typedef struct {
    unsigned char buf[9];
    unsigned short v0;
    A a;
    unsigned short v1;
} B;
''')

vA = CU.types.A(a=1, b=0xAAAAAAAA, c=0x4444)
buf = pydffi.view_as_bytes(vA)
vAup = struct.unpack(CU.types.A.format, buf)
assert (vAup == (1, 0xAAAAAAAA, 0x4444))

buf_ref = bytearray(b"012345678")
vB = CU.types.B(v0=1,
                v1=2,
                a=vA,
                buf=pydffi.view_as(CU.types.B.buf.type, buf_ref))
buf = pydffi.view_as_bytes(vB)
vBup = struct.unpack(CU.types.B.format, buf)
assert (bytearray(vBup[:9]) == buf_ref)
assert (vBup[9:] == (1, 1, 0xAAAAAAAA, 0x4444, 2))