Skip to content

Commit c12e157

Browse files
committed
[TEST] different representation of unannotated backtrack
1 parent 99d4482 commit c12e157

File tree

3 files changed

+22
-14
lines changed

3 files changed

+22
-14
lines changed

clang/include/clang/Lex/Preprocessor.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1728,6 +1728,8 @@ class Preprocessor {
17281728
void EnableBacktrackAtThisPos(bool Unannotated = false);
17291729

17301730
private:
1731+
std::pair<CachedTokensTy::size_type, bool> LastBacktrackPos();
1732+
17311733
CachedTokensTy PopUnannotatedBacktrackTokens();
17321734

17331735
public:
@@ -1853,7 +1855,7 @@ class Preprocessor {
18531855
assert(isBacktrackEnabled() &&
18541856
"Should only be called when tokens are cached for backtracking");
18551857
assert(signed(CachedLexPos) - signed(N) >=
1856-
signed(BacktrackPositions.back() >> 1) &&
1858+
signed(LastBacktrackPos().first) &&
18571859
"Should revert tokens up to the last backtrack position, not more");
18581860
assert(signed(CachedLexPos) - signed(N) >= 0 &&
18591861
"Corrupted backtrack positions ?");

clang/lib/Lex/PPCaching.cpp

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,15 @@
1414
#include "clang/Lex/Preprocessor.h"
1515
using namespace clang;
1616

17+
std::pair<Preprocessor::CachedTokensTy::size_type, bool>
18+
Preprocessor::LastBacktrackPos() {
19+
assert(isBacktrackEnabled());
20+
auto BacktrackPos = BacktrackPositions.back();
21+
bool Unannotated =
22+
static_cast<CachedTokensTy::difference_type>(BacktrackPos) < 0;
23+
return {Unannotated ? ~BacktrackPos : BacktrackPos, Unannotated};
24+
}
25+
1726
// EnableBacktrackAtThisPos - From the point that this method is called, and
1827
// until CommitBacktrackedTokens() or Backtrack() is called, the Preprocessor
1928
// keeps track of the lexed tokens so that a subsequent Backtrack() call will
@@ -24,7 +33,7 @@ using namespace clang;
2433
// be combined with the EnableBacktrackAtThisPos calls in reverse order.
2534
void Preprocessor::EnableBacktrackAtThisPos(bool Unannotated) {
2635
assert(LexLevel == 0 && "cannot use lookahead while lexing");
27-
BacktrackPositions.push_back((CachedLexPos << 1) | Unannotated);
36+
BacktrackPositions.push_back(Unannotated ? ~CachedLexPos : CachedLexPos);
2837
if (Unannotated)
2938
UnannotatedBacktrackTokens.emplace_back(CachedTokens, CachedTokens.size());
3039
EnterCachingLexMode();
@@ -45,23 +54,21 @@ Preprocessor::CachedTokensTy Preprocessor::PopUnannotatedBacktrackTokens() {
4554

4655
// Disable the last EnableBacktrackAtThisPos call.
4756
void Preprocessor::CommitBacktrackedTokens() {
48-
assert(!BacktrackPositions.empty()
49-
&& "EnableBacktrackAtThisPos was not called!");
50-
auto BacktrackPos = BacktrackPositions.back();
57+
assert(isBacktrackEnabled() && "EnableBacktrackAtThisPos was not called!");
58+
auto [BacktrackPos, Unannotated] = LastBacktrackPos();
5159
BacktrackPositions.pop_back();
52-
if (BacktrackPos & 1)
60+
if (Unannotated)
5361
PopUnannotatedBacktrackTokens();
5462
}
5563

5664
// Make Preprocessor re-lex the tokens that were lexed since
5765
// EnableBacktrackAtThisPos() was previously called.
5866
void Preprocessor::Backtrack() {
59-
assert(!BacktrackPositions.empty()
60-
&& "EnableBacktrackAtThisPos was not called!");
61-
auto BacktrackPos = BacktrackPositions.back();
67+
assert(isBacktrackEnabled() && "EnableBacktrackAtThisPos was not called!");
68+
auto [BacktrackPos, Unannotated] = LastBacktrackPos();
6269
BacktrackPositions.pop_back();
63-
CachedLexPos = BacktrackPos >> 1;
64-
if (BacktrackPos & 1)
70+
CachedLexPos = BacktrackPos;
71+
if (Unannotated)
6572
CachedTokens = PopUnannotatedBacktrackTokens();
6673
recomputeCurLexerKind();
6774
}
@@ -149,8 +156,7 @@ void Preprocessor::AnnotatePreviousCachedTokens(const Token &Tok) {
149156
for (CachedTokensTy::size_type i = CachedLexPos; i != 0; --i) {
150157
CachedTokensTy::iterator AnnotBegin = CachedTokens.begin() + i-1;
151158
if (AnnotBegin->getLocation() == Tok.getLocation()) {
152-
assert((BacktrackPositions.empty() ||
153-
(BacktrackPositions.back() >> 1) <= i) &&
159+
assert((!isBacktrackEnabled() || LastBacktrackPos().first <= i) &&
154160
"The backtrack pos points inside the annotated tokens!");
155161
// Replace the cached tokens with the single annotation token.
156162
if (i < CachedLexPos)

clang/lib/Lex/Preprocessor.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ Preprocessor::Preprocessor(std::shared_ptr<PreprocessorOptions> PPOpts,
170170
}
171171

172172
Preprocessor::~Preprocessor() {
173-
assert(BacktrackPositions.empty() && "EnableBacktrack/Backtrack imbalance!");
173+
assert(!isBacktrackEnabled() && "EnableBacktrack/Backtrack imbalance!");
174174

175175
IncludeMacroStack.clear();
176176

0 commit comments

Comments
 (0)