Skip to content

Commit d4b3c65

Browse files
committed
cgen: a minor optimization; checker: a c2v fix
1 parent 6cffcf5 commit d4b3c65

File tree

3 files changed

+21
-12
lines changed

3 files changed

+21
-12
lines changed

vlib/v/checker/checker.v

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8340,18 +8340,22 @@ fn (mut c Checker) fn_decl(mut node ast.FnDecl) {
83408340
}
83418341
if node.language == .v {
83428342
// Make sure all types are valid
8343-
for arg in node.params {
8344-
c.ensure_type_exists(arg.typ, arg.type_pos) or { return }
8345-
if !arg.typ.is_ptr() { // value parameter, i.e. on stack - check for `[heap]`
8346-
arg_typ_sym := c.table.get_type_symbol(arg.typ)
8343+
for mut param in node.params {
8344+
c.ensure_type_exists(param.typ, param.type_pos) or { return }
8345+
if !param.typ.is_ptr() { // value parameter, i.e. on stack - check for `[heap]`
8346+
arg_typ_sym := c.table.get_type_symbol(param.typ)
83478347
if arg_typ_sym.kind == .struct_ {
83488348
info := arg_typ_sym.info as ast.Struct
83498349
if info.is_heap { // set auto_heap to promote value parameter
8350-
mut v := node.scope.find_var(arg.name) or { continue }
8350+
mut v := node.scope.find_var(param.name) or { continue }
83518351
v.is_auto_heap = true
83528352
}
83538353
}
83548354
}
8355+
if c.pref.translated && node.is_variadic && node.params.len == 1 && param.typ.is_ptr() {
8356+
// TODO c2v hack to fix `(const char *s, ...)`
8357+
param.typ = ast.int_type.to_ptr()
8358+
}
83558359
}
83568360
}
83578361
if node.language == .v && node.name.after_char(`.`) == 'init' && !node.is_method

vlib/v/gen/c/cgen.v

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1533,7 +1533,7 @@ fn (mut g Gen) stmt(node ast.Stmt) {
15331533
}
15341534
}
15351535
ast.FnDecl {
1536-
g.process_fn_decl(node)
1536+
g.fn_decl(node)
15371537
}
15381538
ast.ForCStmt {
15391539
prev_branch_parent_pos := g.branch_parent_pos

vlib/v/gen/c/fn.v

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ fn (mut g Gen) is_used_by_main(node ast.FnDecl) bool {
2828
return is_used_by_main
2929
}
3030

31-
fn (mut g Gen) process_fn_decl(node ast.FnDecl) {
31+
fn (mut g Gen) fn_decl(node ast.FnDecl) {
3232
if !g.is_used_by_main(node) {
3333
return
3434
}
@@ -43,6 +43,11 @@ fn (mut g Gen) process_fn_decl(node ast.FnDecl) {
4343
mut skip := false
4444
pos := g.out.len
4545
should_bundle_module := util.should_bundle_module(node.mod)
46+
/*
47+
if node.name.contains('i_error') {
48+
println(g.table.type_str(node.params[0].typ))
49+
}
50+
*/
4651
if g.pref.build_mode == .build_module {
4752
// if node.name.contains('parse_text') {
4853
// println('!!! $node.name mod=$node.mod, built=$g.module_built')
@@ -77,13 +82,13 @@ fn (mut g Gen) process_fn_decl(node ast.FnDecl) {
7782
if node.is_main {
7883
g.has_main = true
7984
}
80-
if node.name == 'backtrace' || node.name == 'backtrace_symbols'
81-
|| node.name == 'backtrace_symbols_fd' {
85+
is_backtrace := node.name.starts_with('backtrace') // TODO PERF remove this from here
86+
&& node.name in ['backtrace_symbols', 'backtrace', 'backtrace_symbols_fd']
87+
if is_backtrace {
8288
g.write('\n#ifndef __cplusplus\n')
8389
}
8490
g.gen_fn_decl(node, skip)
85-
if node.name == 'backtrace' || node.name == 'backtrace_symbols'
86-
|| node.name == 'backtrace_symbols_fd' {
91+
if is_backtrace {
8792
g.write('\n#endif\n')
8893
}
8994
g.fn_decl = keep_fn_decl
@@ -454,7 +459,7 @@ fn (mut g Gen) gen_anon_fn_decl(mut node ast.AnonFn) {
454459
pos := g.out.len
455460
was_anon_fn := g.anon_fn
456461
g.anon_fn = true
457-
g.process_fn_decl(node.decl)
462+
g.fn_decl(node.decl)
458463
g.anon_fn = was_anon_fn
459464
builder.write_string(g.out.cut_to(pos))
460465
g.anon_fn_definitions << builder.str()

0 commit comments

Comments
 (0)