Skip to content

Commit dbdd96f

Browse files
authored
checker, cgen: fix @[if xyz?] fn init() {}, add tests (#20096)
1 parent 4b31092 commit dbdd96f

8 files changed

+58
-20
lines changed

vlib/v/checker/fn.v

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -413,20 +413,23 @@ fn (mut c Checker) fn_decl(mut node ast.FnDecl) {
413413
}
414414
node.source_file = c.file
415415

416-
if node.name in c.table.fns && node.name != 'main.main' {
417-
mut dep_names := []string{}
418-
for stmt in node.stmts {
419-
dnames := c.table.dependent_names_in_stmt(stmt)
420-
for dname in dnames {
421-
if dname in dep_names {
422-
continue
416+
if node.name in c.table.fns {
417+
if node.name != 'main.main' {
418+
mut dep_names := []string{}
419+
for stmt in node.stmts {
420+
dnames := c.table.dependent_names_in_stmt(stmt)
421+
for dname in dnames {
422+
if dname in dep_names {
423+
continue
424+
}
425+
dep_names << dname
423426
}
424-
dep_names << dname
427+
}
428+
if dep_names.len > 0 {
429+
c.table.fns[node.name].dep_names = dep_names
425430
}
426431
}
427-
if dep_names.len > 0 {
428-
c.table.fns[node.name].dep_names = dep_names
429-
}
432+
c.table.fns[node.name].source_fn = voidptr(node)
430433
}
431434

432435
// vweb checks

vlib/v/gen/c/cgen.v

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5869,14 +5869,14 @@ fn (mut g Gen) write_init_function() {
58695869
// ignore v.reflection already initialized above
58705870
continue
58715871
}
5872-
mut is_empty := true
5872+
mut const_section_header_shown := false
58735873
// write globals and consts init later
58745874
for var_name in g.sorted_global_const_names {
58755875
if var := g.global_const_defs[var_name] {
58765876
if var.mod == mod_name && var.init.len > 0 {
5877-
if is_empty {
5878-
is_empty = false
5879-
g.writeln('\t// Initializations for module ${mod_name}')
5877+
if !const_section_header_shown {
5878+
g.writeln('\t// Initializations of consts for module ${mod_name}')
5879+
const_section_header_shown = true
58805880
}
58815881
g.writeln(var.init)
58825882
}
@@ -5885,12 +5885,21 @@ fn (mut g Gen) write_init_function() {
58855885
init_fn_name := '${mod_name}.init'
58865886
if initfn := g.table.find_fn(init_fn_name) {
58875887
if initfn.return_type == ast.void_type && initfn.params.len == 0 {
5888-
if is_empty {
5889-
g.writeln('\t// Initializations for module ${mod_name}')
5888+
mut should_be_skipped := false
5889+
if initfn.source_fn != unsafe { nil } {
5890+
fndecl := unsafe { &ast.FnDecl(initfn.source_fn) }
5891+
if fndecl.should_be_skipped {
5892+
should_be_skipped = fndecl.should_be_skipped
5893+
}
5894+
}
5895+
if should_be_skipped {
5896+
g.writeln('\t// Skipping fn init() for module ${mod_name}')
5897+
} else {
5898+
g.writeln('\t// Calling fn init() for module ${mod_name}')
5899+
mod_c_name := util.no_dots(mod_name)
5900+
init_fn_c_name := '${mod_c_name}__init'
5901+
g.writeln('\t${init_fn_c_name}();')
58905902
}
5891-
mod_c_name := util.no_dots(mod_name)
5892-
init_fn_c_name := '${mod_c_name}__init'
5893-
g.writeln('\t${init_fn_c_name}();')
58945903
}
58955904
}
58965905
cleanup_fn_name := '${mod_name}.cleanup'
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
// Calling fn init() for module main
2+
main__init();
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
hi from init
2+
hi from main
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// vtest vflags: -d init_on
2+
3+
@[if init_on ?]
4+
fn init() {
5+
println('hi from init')
6+
}
7+
8+
fn main() {
9+
println('hi from main')
10+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// Skipping fn init() for module main
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
hi from main
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// vtest vflags: -d init_is_not_defined
2+
3+
@[if init_on ?]
4+
fn init() {
5+
println('hi from init')
6+
}
7+
8+
fn main() {
9+
println('hi from main')
10+
}

0 commit comments

Comments
 (0)