vxx2 / vlib / v3 / tests / c_anonymous_param_codegen_test.v
102 lines · 95 sloc · 3.56 KB · 2b81918e62db9ab38787518603a7f93bee80868c
Raw
1import os
2
3const c_anon_param_vexe = @VEXE
4const c_anon_param_tests_dir = os.dir(@FILE)
5const c_anon_param_v3_dir = os.dir(c_anon_param_tests_dir)
6const c_anon_param_vlib_dir = os.dir(c_anon_param_v3_dir)
7const c_anon_param_v3_src = os.join_path(c_anon_param_v3_dir, 'v3.v')
8
9fn c_anon_param_build_v3() string {
10 v3_bin := os.join_path(os.temp_dir(), 'v3_c_anon_param_test_${os.getpid()}')
11 os.rm(v3_bin) or {}
12 build :=
13 os.execute('${c_anon_param_vexe} -gc none -path "${c_anon_param_vlib_dir}|@vlib|@vmodules" -o ${v3_bin} ${c_anon_param_v3_src}')
14 assert build.exit_code == 0, build.output
15 return v3_bin
16}
17
18fn test_c_anonymous_params_keep_pointer_call_shape() {
19 v3_bin := c_anon_param_build_v3()
20 src := os.join_path(os.temp_dir(), 'v3_c_anon_param_${os.getpid()}.v')
21 os.write_file(src, 'module main
22
23@[typedef]
24struct C.AnonNative {
25 value int
26}
27
28fn C.take_ptr(&C.AnonNative) int
29fn C.take_named(stream &C.AnonNative) int
30fn C.take_void(voidptr) int
31fn C.take_primitive(int, u64) int
32fn C.take_multi(&&C.AnonNative) int
33fn C.take_mixed(&C.AnonNative, voidptr, int, &&C.AnonNative) int
34fn C.take_fn(fn (&C.AnonNative) int) int
35fn C.XLookupString(event &C.AnonNative) int
36fn C.SSL_new() voidptr
37fn C.load_matrix(m [16]f32) int
38fn C.width_runes(r []rune) int
39
40fn callback(n &C.AnonNative) int {
41 return n.value
42}
43
44fn main() {
45 mut native := C.AnonNative{
46 value: 3
47 }
48 ptr := &native
49 pptr := &ptr
50 _ := C.take_ptr(ptr)
51 _ = C.take_ptr(&native)
52 _ = C.take_named(ptr)
53 _ = C.take_void(voidptr(ptr))
54 _ = C.take_void(voidptr(&ptr))
55 _ = C.take_primitive(1, u64(2))
56 _ = C.take_multi(pptr)
57 _ = C.take_mixed(ptr, voidptr(ptr), 3, pptr)
58 _ = C.take_fn(callback)
59 _ = C.XLookupString(ptr)
60 ssl := C.SSL_new()
61 if ssl == unsafe { nil } {
62 }
63 mut matrix := [16]f32{}
64 _ = C.load_matrix(matrix)
65 runes := []rune{}
66 _ = C.width_runes(runes)
67}
68') or {
69 panic(err)
70 }
71 c_path := os.join_path(os.temp_dir(), 'v3_c_anon_param_${os.getpid()}.c')
72 os.rm(c_path) or {}
73 compile := os.execute('${v3_bin} ${src} -b c -o ${c_path}')
74 assert compile.exit_code == 0, compile.output
75 generated := os.read_file(c_path) or { panic(err) }
76 assert generated.contains('take_ptr(ptr)'), generated
77 assert generated.contains('take_ptr(&native)'), generated
78 assert generated.contains('take_named(ptr)'), generated
79 assert generated.contains('take_void((void*)(ptr))'), generated
80 assert generated.contains('take_void((void*)(&ptr))'), generated
81 assert generated.contains('take_multi(pptr)'), generated
82 assert generated.contains('take_mixed(ptr, (void*)(ptr), 3, pptr)'), generated
83 fn_ptr_idx := generated.index('typedef int (*_fn_ptr_') or { -1 }
84 take_fn_proto_idx := generated.index('int take_fn(_fn_ptr_') or { -1 }
85 assert fn_ptr_idx >= 0, generated
86 assert take_fn_proto_idx >= 0, generated
87 assert fn_ptr_idx < take_fn_proto_idx, generated
88 assert generated.contains('int XLookupString(AnonNative* event);'), generated
89 assert generated.contains('void* SSL_new(void);'), generated
90 assert generated.contains('load_matrix(matrix)'), generated
91 assert generated.contains('width_runes(runes)'), generated
92 assert !generated.contains('take_ptr(*'), generated
93 assert !generated.contains('take_named(*'), generated
94 assert !generated.contains('take_void(*'), generated
95 assert !generated.contains('take_multi(*'), generated
96 assert !generated.contains('take_mixed(*'), generated
97 assert !generated.contains('load_matrix(*'), generated
98 assert !generated.contains('width_runes(*'), generated
99 assert !generated.contains('*&native'), generated
100 assert !generated.contains('*(AnonNative*)'), generated
101 assert !generated.contains('*(struct AnonNative*)'), generated
102}
103