ANR: Improve parameter removal
Support removing multiple parameters since functions can
be defined inside function (lambdas are very common case).
Bug: 189881220
Test: manual ANR
Change-Id: I9c4ad139bcee09811cb7356ee48199b16483d971
diff --git a/runtime/native_stack_dump.cc b/runtime/native_stack_dump.cc
index 0dd13b7..00f6106 100644
--- a/runtime/native_stack_dump.cc
+++ b/runtime/native_stack_dump.cc
@@ -322,17 +322,17 @@
return code <= pc && pc <= (code + code_size);
}
-// Remove method parameters by finding matching parenthesis and removing that substring.
-std::string_view StripParameters(std::string_view name) {
- if (name.empty() || *name.rbegin() != ')') {
- return name;
- }
+// Remove method parameters by finding matching top-level parenthesis and removing them.
+// Since functions can be defined inside functions, this can remove multiple substrings.
+std::string StripParameters(std::string name) {
+ size_t end = name.size();
int nesting = 0;
for (ssize_t i = name.size() - 1; i > 0; i--) {
- if (name[i] == ')') {
- nesting++;
- } else if (name[i] == '(' && --nesting == 0) {
- return name.substr(0, i);
+ if (name[i] == ')' && nesting++ == 0) {
+ end = i + 1;
+ }
+ if (name[i] == '(' && --nesting == 0) {
+ name = name.erase(i, end - i);
}
}
return name;