@@ -26,27 +26,31 @@ void Preprocessor::EnableBacktrackAtThisPos(bool Unannotated) {
26
26
assert (LexLevel == 0 && " cannot use lookahead while lexing" );
27
27
BacktrackPositions.push_back ((CachedLexPos << 1 ) | Unannotated);
28
28
if (Unannotated)
29
- UnannotatedBacktrackPositions.emplace_back (CachedTokens,
30
- CachedTokens.size ());
29
+ UnannotatedBacktrackTokens.emplace_back (CachedTokens, CachedTokens.size ());
31
30
EnterCachingLexMode ();
32
31
}
33
32
33
+ Preprocessor::CachedTokensTy Preprocessor::PopUnannotatedBacktrackTokens () {
34
+ assert (isUnannotatedBacktrackEnabled () && " missing unannotated tokens?" );
35
+ auto [UnannotatedTokens, NumCachedToks] =
36
+ std::move (UnannotatedBacktrackTokens.back ());
37
+ UnannotatedBacktrackTokens.pop_back ();
38
+ // If another unannotated backtrack is active, propagate any tokens that were
39
+ // lexed (not cached) since EnableBacktrackAtThisPos was last called.
40
+ if (isUnannotatedBacktrackEnabled ())
41
+ UnannotatedBacktrackTokens.back ().first .append (
42
+ UnannotatedTokens.begin () + NumCachedToks, UnannotatedTokens.end ());
43
+ return std::move (UnannotatedTokens);
44
+ }
45
+
34
46
// Disable the last EnableBacktrackAtThisPos call.
35
47
void Preprocessor::CommitBacktrackedTokens () {
36
48
assert (!BacktrackPositions.empty ()
37
49
&& " EnableBacktrackAtThisPos was not called!" );
38
50
auto BacktrackPos = BacktrackPositions.back ();
39
51
BacktrackPositions.pop_back ();
40
- if (BacktrackPos & 1 ) {
41
- assert (!UnannotatedBacktrackPositions.empty () &&
42
- " missing unannotated tokens?" );
43
- auto [UnannotatedTokens, NumCachedToks] =
44
- std::move (UnannotatedBacktrackPositions.back ());
45
- if (!UnannotatedBacktrackPositions.empty ())
46
- UnannotatedBacktrackPositions.back ().first .append (
47
- UnannotatedTokens.begin () + NumCachedToks, UnannotatedTokens.end ());
48
- UnannotatedBacktrackPositions.pop_back ();
49
- }
52
+ if (BacktrackPos & 1 )
53
+ PopUnannotatedBacktrackTokens ();
50
54
}
51
55
52
56
// Make Preprocessor re-lex the tokens that were lexed since
@@ -57,17 +61,8 @@ void Preprocessor::Backtrack() {
57
61
auto BacktrackPos = BacktrackPositions.back ();
58
62
BacktrackPositions.pop_back ();
59
63
CachedLexPos = BacktrackPos >> 1 ;
60
- if (BacktrackPos & 1 ) {
61
- assert (!UnannotatedBacktrackPositions.empty () &&
62
- " missing unannotated tokens?" );
63
- auto [UnannotatedTokens, NumCachedToks] =
64
- std::move (UnannotatedBacktrackPositions.back ());
65
- UnannotatedBacktrackPositions.pop_back ();
66
- if (!UnannotatedBacktrackPositions.empty ())
67
- UnannotatedBacktrackPositions.back ().first .append (
68
- UnannotatedTokens.begin () + NumCachedToks, UnannotatedTokens.end ());
69
- CachedTokens = std::move (UnannotatedTokens);
70
- }
64
+ if (BacktrackPos & 1 )
65
+ CachedTokens = PopUnannotatedBacktrackTokens ();
71
66
recomputeCurLexerKind ();
72
67
}
73
68
@@ -94,7 +89,7 @@ void Preprocessor::CachingLex(Token &Result) {
94
89
CachedTokens.push_back (Result);
95
90
++CachedLexPos;
96
91
if (isUnannotatedBacktrackEnabled ())
97
- UnannotatedBacktrackPositions .back ().first .push_back (Result);
92
+ UnannotatedBacktrackTokens .back ().first .push_back (Result);
98
93
return ;
99
94
}
100
95
@@ -137,7 +132,7 @@ const Token &Preprocessor::PeekAhead(unsigned N) {
137
132
CachedTokens.push_back (Token ());
138
133
Lex (CachedTokens.back ());
139
134
if (isUnannotatedBacktrackEnabled ())
140
- UnannotatedBacktrackPositions .back ().first .push_back (CachedTokens.back ());
135
+ UnannotatedBacktrackTokens .back ().first .push_back (CachedTokens.back ());
141
136
}
142
137
EnterCachingLexMode ();
143
138
return CachedTokens.back ();
0 commit comments