github.com/gotranspile/cxgo@v0.3.7/runtime/libc/conv_test.go (about) 1 package libc 2 3 import ( 4 "testing" 5 "unsafe" 6 7 "github.com/stretchr/testify/require" 8 ) 9 10 func TestFunc2Ptr(t *testing.T) { 11 var ( 12 v1 bool 13 v2 bool 14 ) 15 f1 := func() { 16 v1 = true 17 } 18 f2 := func() int { 19 v2 = true 20 return 1 21 } 22 p1 := FuncAddr(f1) 23 p2 := FuncAddr(f2) 24 25 f1 = AddrAsFunc(p1, (*func())(nil)).(func()) 26 f1() 27 require.True(t, v1) 28 29 f2 = AddrAsFunc(p2, (*func() int)(nil)).(func() int) 30 r := f2() 31 require.Equal(t, 1, r) 32 require.True(t, v2) 33 } 34 35 func TestConvFuncStruct(t *testing.T) { 36 type T1 struct { 37 fnc func() 38 } 39 type T2 struct { 40 fnc uint 41 } 42 var v bool 43 var b [unsafe.Sizeof(uintptr(0))]byte 44 45 p1 := (*T2)(unsafe.Pointer(&b[0])) 46 p1.fnc = uint(FuncAddr(func() { 47 v = true 48 })) 49 50 p2 := (*T1)(unsafe.Pointer(&b[0])) 51 p2.fnc() 52 require.True(t, v) 53 } 54 55 func TestConvFuncStruct2(t *testing.T) { 56 type T1 struct { 57 fnc func() 58 } 59 type T2 struct { 60 fnc uint 61 } 62 var v bool 63 var b [unsafe.Sizeof(uintptr(0))]byte 64 65 p1 := (*T1)(unsafe.Pointer(&b[0])) 66 p1.fnc = func() { 67 v = true 68 } 69 70 p2 := (*T2)(unsafe.Pointer(&b[0])) 71 AddrAsFunc(uintptr(p2.fnc), (*func())(nil)).(func())() 72 require.True(t, v) 73 }