v / vlib / v2 / transformer / minimal_runtime_init_test.v
227 lines · 203 sloc · 6.96 KB · 3dd96de45339a469cb83ffacc0e50b017468e032
Raw
1module transformer
2
3import v2.ast
4import v2.pref as vpref
5import v2.types
6
7fn transformer_with_x64_target(target_os string) &Transformer {
8 env := &types.Environment{}
9 prefs := &vpref.Preferences{
10 backend: .x64
11 arch: .x64
12 target_os: target_os
13 }
14 return Transformer.new_with_pref(env, prefs)
15}
16
17fn transformer_with_macos_tiny_candidate_graph() &Transformer {
18 mut t := transformer_with_x64_target('macos')
19 t.enable_macos_tiny_candidate_graph()
20 return t
21}
22
23fn runtime_init_call_names(stmts []ast.Stmt) []string {
24 mut names := []string{}
25 for stmt in stmts {
26 if stmt is ast.ExprStmt {
27 if stmt.expr is ast.CallExpr {
28 if stmt.expr.lhs is ast.Ident {
29 names << stmt.expr.lhs.name
30 }
31 }
32 }
33 }
34 return names
35}
36
37fn runtime_init_call_names_from_flat(mut t Transformer, files []ast.File) []string {
38 flat := ast.flatten_files(files)
39 return runtime_init_call_names(t.runtime_const_init_main_calls_parts_from_flat(&flat))
40}
41
42fn runtime_init_test_files(main_imports []ast.ImportStmt) []ast.File {
43 return [
44 ast.File{
45 mod: 'main'
46 imports: main_imports
47 stmts: [
48 ast.Stmt(ast.FnDecl{
49 name: 'main'
50 }),
51 ]
52 },
53 ast.File{
54 mod: 'os'
55 stmts: [
56 ast.Stmt(ast.FnDecl{
57 name: 'init'
58 }),
59 ]
60 },
61 ]
62}
63
64fn runtime_init_test_files_with_main_extra_stmts(extra_stmts []ast.Stmt) []ast.File {
65 mut files := runtime_init_test_files([]ast.ImportStmt{})
66 mut main_stmts := []ast.Stmt{cap: extra_stmts.len + files[0].stmts.len}
67 main_stmts << extra_stmts
68 main_stmts << files[0].stmts
69 files[0] = ast.File{
70 mod: files[0].mod
71 stmts: main_stmts
72 }
73 return files
74}
75
76fn runtime_init_import_stmt(name string) ast.Stmt {
77 return ast.Stmt(ast.ImportStmt{
78 name: name
79 })
80}
81
82fn runtime_init_comptime_if_import_stmt(cond_name string, import_name string) ast.Stmt {
83 return ast.Stmt(ast.ExprStmt{
84 expr: ast.Expr(ast.ComptimeExpr{
85 expr: ast.Expr(ast.IfExpr{
86 cond: ast.Expr(ast.Ident{
87 name: cond_name
88 })
89 stmts: [runtime_init_import_stmt(import_name)]
90 })
91 })
92 })
93}
94
95fn runtime_init_comptime_else_import_stmt(cond_name string, import_name string) ast.Stmt {
96 return ast.Stmt(ast.ExprStmt{
97 expr: ast.Expr(ast.ComptimeExpr{
98 expr: ast.Expr(ast.IfExpr{
99 cond: ast.Expr(ast.Ident{
100 name: cond_name
101 })
102 else_expr: ast.Expr(ast.IfExpr{
103 cond: ast.empty_expr
104 stmts: [runtime_init_import_stmt(import_name)]
105 })
106 })
107 })
108 })
109}
110
111fn seed_runtime_const_init_names(mut t Transformer) {
112 t.runtime_const_modules = ['os', 'main']
113 t.runtime_const_init_fn_name['os'] = '__v_init_consts_os'
114 t.runtime_const_init_fn_name['main'] = '__v_init_consts_main'
115}
116
117fn test_linux_minimal_runtime_filters_unimported_runtime_init_calls() {
118 mut t := transformer_with_x64_target('linux')
119 seed_runtime_const_init_names(mut t)
120 names :=
121 runtime_init_call_names(t.runtime_const_init_main_calls_parts(runtime_init_test_files([]ast.ImportStmt{})))
122 assert names == ['__v_init_consts_main']
123}
124
125fn test_linux_minimal_runtime_keeps_imported_runtime_init_calls() {
126 mut t := transformer_with_x64_target('linux')
127 seed_runtime_const_init_names(mut t)
128 names := runtime_init_call_names(t.runtime_const_init_main_calls_parts(runtime_init_test_files([
129 ast.ImportStmt{
130 name: 'os'
131 },
132 ])))
133 assert names == ['os____v_init_consts_os', 'os__init', '__v_init_consts_main']
134}
135
136fn test_linux_minimal_runtime_filters_unimported_runtime_init_calls_from_flat() {
137 mut t := transformer_with_x64_target('linux')
138 seed_runtime_const_init_names(mut t)
139 names := runtime_init_call_names_from_flat(mut t, runtime_init_test_files([]ast.ImportStmt{}))
140 assert names == ['__v_init_consts_main']
141}
142
143fn test_linux_minimal_runtime_keeps_imported_runtime_init_calls_from_flat() {
144 mut t := transformer_with_x64_target('linux')
145 seed_runtime_const_init_names(mut t)
146 names := runtime_init_call_names_from_flat(mut t, runtime_init_test_files([
147 ast.ImportStmt{
148 name: 'os'
149 },
150 ]))
151 assert names == ['os____v_init_consts_os', 'os__init', '__v_init_consts_main']
152}
153
154fn test_macos_tiny_candidate_filters_unimported_runtime_init_calls() {
155 mut t := transformer_with_macos_tiny_candidate_graph()
156 seed_runtime_const_init_names(mut t)
157 names :=
158 runtime_init_call_names(t.runtime_const_init_main_calls_parts(runtime_init_test_files([]ast.ImportStmt{})))
159 assert names == ['__v_init_consts_main']
160}
161
162fn test_macos_tiny_candidate_keeps_imported_runtime_init_calls() {
163 mut t := transformer_with_macos_tiny_candidate_graph()
164 seed_runtime_const_init_names(mut t)
165 names := runtime_init_call_names(t.runtime_const_init_main_calls_parts(runtime_init_test_files([
166 ast.ImportStmt{
167 name: 'os'
168 },
169 ])))
170 assert names == ['os____v_init_consts_os', 'os__init', '__v_init_consts_main']
171}
172
173fn test_linux_minimal_runtime_keeps_active_comptime_imports_from_flat() {
174 files := runtime_init_test_files_with_main_extra_stmts([
175 runtime_init_comptime_if_import_stmt('linux', 'os'),
176 ])
177 mut t_legacy := transformer_with_x64_target('linux')
178 seed_runtime_const_init_names(mut t_legacy)
179 mut t_flat := transformer_with_x64_target('linux')
180 seed_runtime_const_init_names(mut t_flat)
181
182 legacy_names := runtime_init_call_names(t_legacy.runtime_const_init_main_calls_parts(files))
183 flat_names := runtime_init_call_names_from_flat(mut t_flat, files)
184 assert legacy_names == ['os____v_init_consts_os', 'os__init', '__v_init_consts_main']
185 assert flat_names == legacy_names
186}
187
188fn test_linux_minimal_runtime_keeps_comptime_else_imports_from_flat() {
189 files := runtime_init_test_files_with_main_extra_stmts([
190 runtime_init_comptime_else_import_stmt('windows', 'os'),
191 ])
192 mut t_legacy := transformer_with_x64_target('linux')
193 seed_runtime_const_init_names(mut t_legacy)
194 mut t_flat := transformer_with_x64_target('linux')
195 seed_runtime_const_init_names(mut t_flat)
196
197 legacy_names := runtime_init_call_names(t_legacy.runtime_const_init_main_calls_parts(files))
198 flat_names := runtime_init_call_names_from_flat(mut t_flat, files)
199 assert legacy_names == ['os____v_init_consts_os', 'os__init', '__v_init_consts_main']
200 assert flat_names == legacy_names
201}
202
203fn test_macos_tiny_candidate_filters_unimported_runtime_init_calls_from_flat() {
204 mut t := transformer_with_macos_tiny_candidate_graph()
205 seed_runtime_const_init_names(mut t)
206 names := runtime_init_call_names_from_flat(mut t, runtime_init_test_files([]ast.ImportStmt{}))
207 assert names == ['__v_init_consts_main']
208}
209
210fn test_macos_tiny_candidate_keeps_imported_runtime_init_calls_from_flat() {
211 mut t := transformer_with_macos_tiny_candidate_graph()
212 seed_runtime_const_init_names(mut t)
213 names := runtime_init_call_names_from_flat(mut t, runtime_init_test_files([
214 ast.ImportStmt{
215 name: 'os'
216 },
217 ]))
218 assert names == ['os____v_init_consts_os', 'os__init', '__v_init_consts_main']
219}
220
221fn test_non_minimal_x64_runtime_keeps_existing_init_behavior() {
222 mut t := transformer_with_x64_target('macos')
223 seed_runtime_const_init_names(mut t)
224 names :=
225 runtime_init_call_names(t.runtime_const_init_main_calls_parts(runtime_init_test_files([]ast.ImportStmt{})))
226 assert names == ['os____v_init_consts_os', 'os__init', '__v_init_consts_main']
227}
228