Skip to content

Commit

Permalink
v.debug: callstack minor cleanup (vlang#20704)
Browse files Browse the repository at this point in the history
  • Loading branch information
felipensp authored Feb 2, 2024
1 parent 0a612bf commit e9320ad
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 72 deletions.
1 change: 0 additions & 1 deletion vlib/v/ast/ast.v
Original file line number Diff line number Diff line change
Expand Up @@ -574,7 +574,6 @@ pub mut:
stmts []Stmt
defer_stmts []DeferStmt
trace_fns map[string]FnTrace
has_trace_fns bool
return_type Type
return_type_pos token.Pos // `string` in `fn (u User) name() string` position
has_return bool
Expand Down
11 changes: 11 additions & 0 deletions vlib/v/ast/table.v
Original file line number Diff line number Diff line change
Expand Up @@ -2485,3 +2485,14 @@ pub fn (t &Table) get_array_dims(arr Array) (int, Type) {
}
return dims, elem_type
}

pub fn (t &Table) get_trace_fn_name(cur_fn FnDecl, node CallExpr) (string, string) {
generic_name := node.concrete_types.map(t.type_to_str(it)).join('_')
hash_fn := '_v__trace__${cur_fn.name}_${node.name}_${generic_name}_${node.pos.line_nr}'
fn_name := if node.concrete_types.len > 0 {
'${node.name}_T_${generic_name}'
} else {
node.name
}
return hash_fn, fn_name
}
9 changes: 1 addition & 8 deletions vlib/v/checker/fn.v
Original file line number Diff line number Diff line change
Expand Up @@ -1523,13 +1523,7 @@ fn (mut c Checker) register_trace_call(node ast.CallExpr, func ast.Fn) {
is_traceable := c.pref.is_callstack && c.table.cur_fn != unsafe { nil } && c.pref.is_callstack
&& c.file.imports.any(it.mod == 'v.debug') && node.name != 'v.debug.callstack'
if is_traceable {
generic_name := node.concrete_types.map(c.table.type_to_str(it)).join('_')
hash_fn := '_v__trace__${c.table.cur_fn.name}_${node.name}_${generic_name}_${node.pos.line_nr}'
fn_name := if generic_name != '' {
'${node.name}_T_${generic_name}'
} else {
node.name
}
hash_fn, fn_name := c.table.get_trace_fn_name(c.table.cur_fn, node)
calling_fn := if func.is_method {
'${c.table.type_to_str(c.unwrap_generic(node.left_type))}_${fn_name}'
} else {
Expand All @@ -1543,7 +1537,6 @@ fn (mut c Checker) register_trace_call(node ast.CallExpr, func ast.Fn) {
func: &func
is_fn_var: node.is_fn_var
}
c.table.cur_fn.has_trace_fns = true
}
}

Expand Down
113 changes: 56 additions & 57 deletions vlib/v/gen/c/cgen.v
Original file line number Diff line number Diff line change
Expand Up @@ -141,63 +141,62 @@ mut:
inside_dump_fn bool
expected_fixed_arr bool
inside_for_c_stmt bool
// inside_comptime_for_field bool
inside_cast_in_heap int // inside cast to interface type in heap (resolve recursive calls)
inside_cast bool
inside_const bool
inside_array_item bool
inside_const_opt_or_res bool
inside_lambda bool
inside_cinit bool
inside_interface_deref bool
last_tmp_call_var []string
loop_depth int
ternary_names map[string]string
ternary_level_names map[string][]string
arraymap_set_pos int // map or array set value position
stmt_path_pos []int // positions of each statement start, for inserting C statements before the current statement
skip_stmt_pos bool // for handling if expressions + autofree (since both prepend C statements)
left_is_opt bool // left hand side on assignment is an option
right_is_opt bool // right hand side on assignment is an option
assign_ct_type ast.Type // left hand side resolved comptime type
indent int
empty_line bool
assign_op token.Kind // *=, =, etc (for array_set)
defer_stmts []ast.DeferStmt
defer_ifdef string
defer_profile_code string
defer_vars []string
str_types []StrType // types that need automatic str() generation
generated_str_fns []StrType // types that already have a str() function
str_fn_names []string // remove duplicate function names
threaded_fns shared []string // for generating unique wrapper types and fns for `go xxx()`
waiter_fns shared []string // functions that wait for `go xxx()` to finish
needed_equality_fns []ast.Type
generated_eq_fns []ast.Type
array_sort_fn shared []string
array_contains_types []ast.Type
array_index_types []ast.Type
auto_fn_definitions []string // auto generated functions definition list
sumtype_casting_fns []SumtypeCastingFn
anon_fn_definitions []string // anon generated functions definition list
sumtype_definitions map[int]bool // `_TypeA_to_sumtype_TypeB()` fns that have been generated
trace_fn_definitions []string
json_types []ast.Type // to avoid json gen duplicates
pcs []ProfileCounterMeta // -prof profile counter fn_names => fn counter name
hotcode_fn_names []string
hotcode_fpaths []string
embedded_files []ast.EmbeddedFile
sql_i int
sql_stmt_name string
sql_bind_name string
sql_idents []string
sql_idents_types []ast.Type
sql_left_type ast.Type
sql_table_name string
sql_fkey string
sql_parent_id string
sql_side SqlExprSide // left or right, to distinguish idents in `name == name`
strs_to_free0 []string // strings.Builder
inside_cast_in_heap int // inside cast to interface type in heap (resolve recursive calls)
inside_cast bool
inside_const bool
inside_array_item bool
inside_const_opt_or_res bool
inside_lambda bool
inside_cinit bool
inside_interface_deref bool
last_tmp_call_var []string
loop_depth int
ternary_names map[string]string
ternary_level_names map[string][]string
arraymap_set_pos int // map or array set value position
stmt_path_pos []int // positions of each statement start, for inserting C statements before the current statement
skip_stmt_pos bool // for handling if expressions + autofree (since both prepend C statements)
left_is_opt bool // left hand side on assignment is an option
right_is_opt bool // right hand side on assignment is an option
assign_ct_type ast.Type // left hand side resolved comptime type
indent int
empty_line bool
assign_op token.Kind // *=, =, etc (for array_set)
defer_stmts []ast.DeferStmt
defer_ifdef string
defer_profile_code string
defer_vars []string
str_types []StrType // types that need automatic str() generation
generated_str_fns []StrType // types that already have a str() function
str_fn_names []string // remove duplicate function names
threaded_fns shared []string // for generating unique wrapper types and fns for `go xxx()`
waiter_fns shared []string // functions that wait for `go xxx()` to finish
needed_equality_fns []ast.Type
generated_eq_fns []ast.Type
array_sort_fn shared []string
array_contains_types []ast.Type
array_index_types []ast.Type
auto_fn_definitions []string // auto generated functions definition list
sumtype_casting_fns []SumtypeCastingFn
anon_fn_definitions []string // anon generated functions definition list
sumtype_definitions map[int]bool // `_TypeA_to_sumtype_TypeB()` fns that have been generated
trace_fn_definitions []string
json_types []ast.Type // to avoid json gen duplicates
pcs []ProfileCounterMeta // -prof profile counter fn_names => fn counter name
hotcode_fn_names []string
hotcode_fpaths []string
embedded_files []ast.EmbeddedFile
sql_i int
sql_stmt_name string
sql_bind_name string
sql_idents []string
sql_idents_types []ast.Type
sql_left_type ast.Type
sql_table_name string
sql_fkey string
sql_parent_id string
sql_side SqlExprSide // left or right, to distinguish idents in `name == name`
strs_to_free0 []string // strings.Builder
// strs_to_free []string // strings.Builder
// tmp_arg_vars_to_free []string
// autofree_pregen map[string]string
Expand Down
11 changes: 5 additions & 6 deletions vlib/v/gen/c/fn.v
Original file line number Diff line number Diff line change
Expand Up @@ -1535,7 +1535,7 @@ fn (mut g Gen) method_call(node ast.CallExpr) {
}
g.write('${name}${noscan}(')
} else {
if g.cur_fn != unsafe { nil } && g.cur_fn.has_trace_fns {
if g.cur_fn != unsafe { nil } && g.cur_fn.trace_fns.len > 0 {
g.gen_trace_call(node, name)
g.write('(')
} else {
Expand Down Expand Up @@ -1984,7 +1984,7 @@ fn (mut g Gen) fn_call(node ast.CallExpr) {
}
}
if !is_fn_var {
if g.cur_fn != unsafe { nil } && g.cur_fn.has_trace_fns {
if g.cur_fn != unsafe { nil } && g.cur_fn.trace_fns.len > 0 {
g.gen_trace_call(node, name)
if node.is_fn_var {
return
Expand Down Expand Up @@ -2037,10 +2037,9 @@ fn (mut g Gen) fn_call(node ast.CallExpr) {

// gen_trace_call generates call to the wrapper trace fn if the call is traceable
fn (mut g Gen) gen_trace_call(node ast.CallExpr, name string) {
generic_name := node.concrete_types.map(g.table.type_to_str(it)).join('_')
trace_fn_name := '_v__trace__${g.cur_fn.name}_${node.name}_${generic_name}_${node.pos.line_nr}'
if _ := g.cur_fn.trace_fns[trace_fn_name] {
g.write(c_name(trace_fn_name))
hash_fn, _ := g.table.get_trace_fn_name(g.cur_fn, node)
if _ := g.cur_fn.trace_fns[hash_fn] {
g.write(c_name(hash_fn))
if node.is_fn_var {
g.write('(${node.name})')
}
Expand Down

0 comments on commit e9320ad

Please sign in to comment.