def test_wrapper(self): CU = self.FFI.compile(''' struct A { int a; int b; }; struct A init_A(int a, int b) { struct A ret = {a,b}; return ret; } ''') FTy = pydffi.typeof(CU.funcs.init_A) print(FTy.getWrapperLLVMStr("wrap"))
def test_func_ptr(self): FFI = self.FFI CU = FFI.compile(''' typedef struct { int a; int b; int res; } Res; typedef Res(*op)(int,int); static Res get_res(int res, int a, int b) { Res Ret = {a,b,res}; return Ret; } static Res add(int a, int b) { return get_res(a+b,a,b); } static Res sub(int a, int b) { return get_res(a-b,a,b); } op get_op(unsigned Id) { if (Id == 0) return add; if (Id == 1) return sub; return 0; } Res call(op f, int a, int b) { return f(a,b); } ''') Add = CU.funcs.get_op(0) Add = Add.obj Res = Add(1, 4) self.assertEqual(Res.res, 5) sub_addr = pydffi.ptr(CU.funcs.sub) Res = CU.funcs.call(sub_addr, 1, 5) self.assertEqual(Res.res, -4) subFuncTy = pydffi.typeof(CU.funcs.sub).type funcByAddr = subFuncTy(sub_addr) self.assertEqual(funcByAddr(1, 5).res, -4) funcByAddr = subFuncTy(sub_addr.value) self.assertEqual(funcByAddr(1, 5).res, -4)
def test_anon_struct(self): CU = self.FFI.compile(''' struct A { struct { int a; int b; } s; }; void dump(struct A a) { printf("s.a=%d, s.b=%d\\n", a.s.a, a.s.b); } ''') A = CU.types.A() Obj = A.s Ty = pydffi.typeof(Obj) fields = [f.name for f in iter(Ty)] self.assertEqual(set(fields), set(("a", "b")))
# Copyright 2018 Adrien Guinet <*****@*****.**> # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # RUN: "%python" "%s" import pydffi FFI = pydffi.FFI() CU = FFI.compile(''' struct A { int a; int b; }; struct A init_A(int a, int b) { struct A ret = {a,b}; return ret; } ''') FTy = pydffi.typeof(CU.funcs.init_A) print(FTy.getWrapperLLVMStr("wrap"))
# Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # RUN: "%python" "%s" # import pydffi FFI = pydffi.FFI() CU = FFI.compile(''' struct A { struct { int a; int b; } s; }; void dump(struct A a) { printf("s.a=%d, s.b=%d\\n", a.s.a, a.s.b); } ''') A = CU.types.A() Obj = A.s Ty = pydffi.typeof(Obj) fields = [f.name for f in iter(Ty)] assert (fields[0] == "a") assert (fields[1] == "b")