@@ -62,7 +62,6 @@ def __init__(self, context: DWARFContext, base_dir: str):
6262 self ._files : dict [str , dict [int , list [Object ]]] = defaultdict (lambda : defaultdict (list ))
6363 self ._base_dir = base_dir
6464 self ._objects = {}
65- self ._param_names : dict [str , list [str ]] = {}
6665 self ._functions : dict [str , list [Function ]] = defaultdict (list )
6766 self ._templates : dict [str | int , dict [int , list [Template ]]] = defaultdict (lambda : defaultdict (list ))
6867 self ._types = {}
@@ -103,8 +102,19 @@ def files(self) -> Generator[tuple[str, dict[int, list[Object]]], None, None]:
103102 pbar .set_description_str (f"Visiting compile unit { rel_path } " )
104103 self .visit (cu_die )
105104
106- for key , param_names in self ._param_names .items ():
107- functions = self ._functions [key ]
105+ for key , functions in self ._functions .items ():
106+ # collect param names
107+ param_names = []
108+ for function in functions :
109+ if not param_names :
110+ param_names = [param .name for param in function .parameters ]
111+ else :
112+ assert len (param_names ) == len (function .parameters ), "Parameter count mismatch"
113+ for i , param in enumerate (function .parameters ):
114+ if param_names [i ] is None and param .name is not None :
115+ param_names [i ] = param .name
116+
117+ # sync param names
108118 for function in functions :
109119 for i , param in enumerate (function .parameters ):
110120 if param .name is None :
@@ -555,7 +565,7 @@ def visit_subprogram(self, die: DWARFDie) -> None:
555565 case _:
556566 raise ValueError (f"Unhandled child tag { child .tag } " )
557567
558- # sync parameter names from definition to declaration
568+ # group functions to sync parameter names
559569 key = None
560570 if die .linkage_name :
561571 # c++ functions with external linkage
@@ -572,15 +582,6 @@ def visit_subprogram(self, die: DWARFDie) -> None:
572582 if spec and not spec .linkage_name :
573583 self ._functions [key ].append (self ._get (spec ))
574584
575- if key not in self ._param_names :
576- self ._param_names [key ] = [p .name for p in function .parameters ]
577- else :
578- param_names = self ._param_names [key ]
579- assert len (param_names ) == len (function .parameters ), "Parameter count mismatch"
580- for i , param in enumerate (function .parameters ):
581- if param_names [i ] is None and param .name is not None :
582- param_names [i ] = param .name
583-
584585 if template_params :
585586 function .template = Template (name = "" ) # without declaration as there is no trivial way to infer that
586587 for template_param in template_params :
0 commit comments