summaryrefslogtreecommitdiff
path: root/absl
diff options
context:
space:
mode:
authorGravatar Chris Mihelich <cmihelic@google.com>2024-05-23 15:28:19 -0700
committerGravatar Copybara-Service <copybara-worker@google.com>2024-05-23 15:30:43 -0700
commitd60c089e06b638483db5995d16550303225b1b5b (patch)
treee8dfd7e8d0b24c568125c983679f9b6194f8c102 /absl
parentb3cd02500c67749ee7441987cb7d37c89aead79b (diff)
Demangle the C++ this pointer (fpT).
PiperOrigin-RevId: 636695970 Change-Id: I22d6f13271ab965563f1f575d9d7ba0ed1af466d
Diffstat (limited to 'absl')
-rw-r--r--absl/debugging/internal/demangle.cc22
-rw-r--r--absl/debugging/internal/demangle_test.cc8
2 files changed, 27 insertions, 3 deletions
diff --git a/absl/debugging/internal/demangle.cc b/absl/debugging/internal/demangle.cc
index 6d24f8ed..72462ee9 100644
--- a/absl/debugging/internal/demangle.cc
+++ b/absl/debugging/internal/demangle.cc
@@ -300,8 +300,8 @@ static bool ParseOneCharToken(State *state, const char one_char_token) {
return false;
}
-// Returns true and advances "mangled_cur" if we find "two_char_token"
-// at "mangled_cur" position. It is assumed that "two_char_token" does
+// Returns true and advances "mangled_idx" if we find "two_char_token"
+// at "mangled_idx" position. It is assumed that "two_char_token" does
// not contain '\0'.
static bool ParseTwoCharToken(State *state, const char *two_char_token) {
ComplexityGuard guard(state);
@@ -314,6 +314,21 @@ static bool ParseTwoCharToken(State *state, const char *two_char_token) {
return false;
}
+// Returns true and advances "mangled_idx" if we find "three_char_token"
+// at "mangled_idx" position. It is assumed that "three_char_token" does
+// not contain '\0'.
+static bool ParseThreeCharToken(State *state, const char *three_char_token) {
+ ComplexityGuard guard(state);
+ if (guard.IsTooComplex()) return false;
+ if (RemainingInput(state)[0] == three_char_token[0] &&
+ RemainingInput(state)[1] == three_char_token[1] &&
+ RemainingInput(state)[2] == three_char_token[2]) {
+ state->parse_state.mangled_idx += 3;
+ return true;
+ }
+ return false;
+}
+
// Returns true and advances "mangled_cur" if we find any character in
// "char_class" at "mangled_cur" position.
static bool ParseCharClass(State *state, const char *char_class) {
@@ -1759,6 +1774,7 @@ static bool ParseUnionSelector(State *state) {
// ::= fp <(top-level) CV-qualifiers> <number> _
// ::= fL <number> p <(top-level) CV-qualifiers> _
// ::= fL <number> p <(top-level) CV-qualifiers> <number> _
+// ::= fpT # this
static bool ParseFunctionParam(State *state) {
ComplexityGuard guard(state);
if (guard.IsTooComplex()) return false;
@@ -1780,7 +1796,7 @@ static bool ParseFunctionParam(State *state) {
}
state->parse_state = copy;
- return false;
+ return ParseThreeCharToken(state, "fpT");
}
// <braced-expression> ::= <expression>
diff --git a/absl/debugging/internal/demangle_test.cc b/absl/debugging/internal/demangle_test.cc
index 269a35aa..8dcfb517 100644
--- a/absl/debugging/internal/demangle_test.cc
+++ b/absl/debugging/internal/demangle_test.cc
@@ -308,6 +308,14 @@ TEST(Demangle, AbiTags) {
EXPECT_STREQ("C[abi:bar][abi:foo]()", tmp);
}
+TEST(Demangle, ThisPointerInDependentSignature) {
+ char tmp[80];
+
+ // decltype(g<int>(this)) S::f<int>()
+ EXPECT_TRUE(Demangle("_ZN1S1fIiEEDTcl1gIT_EfpTEEv", tmp, sizeof(tmp)));
+ EXPECT_STREQ("S::f<>()", tmp);
+}
+
// Test subobject-address template parameters.
TEST(Demangle, SubobjectAddresses) {
char tmp[80];