(fn *profile.Function, opts []demangle.Option)
| 282 | } |
| 283 | |
| 284 | func demangleSingleFunction(fn *profile.Function, opts []demangle.Option) { |
| 285 | if fn.Name != "" && fn.SystemName != fn.Name { |
| 286 | return // Already demangled. |
| 287 | } |
| 288 | if demangled := demangle.Filter(fn.SystemName, opts...); demangled != fn.SystemName { |
| 289 | fn.Name = demangled |
| 290 | return |
| 291 | } |
| 292 | |
| 293 | // OSX has all the symbols prefixed with extra '_' so lets try |
| 294 | // once more without it |
| 295 | if strings.HasPrefix(fn.SystemName, "_") { |
| 296 | if demangled := demangle.Filter(fn.SystemName[1:], opts...); demangled != fn.SystemName[1:] { |
| 297 | fn.Name = demangled |
| 298 | return |
| 299 | } |
| 300 | } |
| 301 | |
| 302 | // Could not demangle. Apply heuristics in case the name is |
| 303 | // already demangled. |
| 304 | name := fn.SystemName |
| 305 | if looksLikeDemangledCPlusPlus(name) { |
| 306 | for _, o := range opts { |
| 307 | switch o { |
| 308 | case demangle.NoParams: |
| 309 | name = removeMatching(name, '(', ')') |
| 310 | case demangle.NoTemplateParams: |
| 311 | name = removeMatching(name, '<', '>') |
| 312 | } |
| 313 | } |
| 314 | } |
| 315 | fn.Name = name |
| 316 | } |
| 317 | |
| 318 | // looksLikeDemangledCPlusPlus is a heuristic to decide if a name is |
| 319 | // the result of demangling C++. If so, further heuristics will be |
searching dependent graphs…