diff options
author | Chris Mihelich <cmihelic@google.com> | 2024-05-30 14:10:22 -0700 |
---|---|---|
committer | Copybara-Service <copybara-worker@google.com> | 2024-05-30 14:11:24 -0700 |
commit | 9a2da1a407278eb70be13e5cd392a898cfc11792 (patch) | |
tree | cfc40c318bf43a95df006a1d6997df1ca841a0cb /absl/debugging/internal/demangle.cc | |
parent | c8671e7542ebfd928ee3e239315c8784fdd88e1c (diff) | |
download | abseil-9a2da1a407278eb70be13e5cd392a898cfc11792.tar.gz abseil-9a2da1a407278eb70be13e5cd392a898cfc11792.tar.bz2 abseil-9a2da1a407278eb70be13e5cd392a898cfc11792.zip |
Parse <discriminator> more accurately.
PiperOrigin-RevId: 638778076
Change-Id: I97b9bab2d1b6f87d2f449777145f932949d61a38
Diffstat (limited to 'absl/debugging/internal/demangle.cc')
-rw-r--r-- | absl/debugging/internal/demangle.cc | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/absl/debugging/internal/demangle.cc b/absl/debugging/internal/demangle.cc index c730f8bf..d32d5980 100644 --- a/absl/debugging/internal/demangle.cc +++ b/absl/debugging/internal/demangle.cc @@ -2387,12 +2387,22 @@ static bool ParseLocalName(State *state) { return false; } -// <discriminator> := _ <(non-negative) number> +// <discriminator> := _ <digit> +// := __ <number (>= 10)> _ static bool ParseDiscriminator(State *state) { ComplexityGuard guard(state); if (guard.IsTooComplex()) return false; ParseState copy = state->parse_state; - if (ParseOneCharToken(state, '_') && ParseNumber(state, nullptr)) { + + // Both forms start with _ so parse that first. + if (!ParseOneCharToken(state, '_')) return false; + + // <digit> + if (ParseDigit(state, nullptr)) return true; + + // _ <number> _ + if (ParseOneCharToken(state, '_') && ParseNumber(state, nullptr) && + ParseOneCharToken(state, '_')) { return true; } state->parse_state = copy; |