summaryrefslogtreecommitdiff
path: root/src/libs/cplusplus/pp-engine.cpp
diff options
context:
space:
mode:
authorhjk <hjk121@nokiamail.com>2013-04-16 11:23:05 +0200
committerErik Verbruggen <erik.verbruggen@digia.com>2013-04-16 12:30:45 +0200
commit980fe3203d418235857bcd8f5a4a3d32ace15892 (patch)
treeebe6452ba9aaae39a1ca8f04e0836b4579d51452 /src/libs/cplusplus/pp-engine.cpp
parent237c82fe474b9da351e03c24a89f3305b1d7dc28 (diff)
downloadqt-creator-980fe3203d418235857bcd8f5a4a3d32ace15892.tar.gz
C++: Streamline preprocessor expansion buffer handling
Change-Id: If86c73945808e871f60fdf231b91e02f66bd1b32 Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
Diffstat (limited to 'src/libs/cplusplus/pp-engine.cpp')
-rw-r--r--src/libs/cplusplus/pp-engine.cpp65
1 files changed, 19 insertions, 46 deletions
diff --git a/src/libs/cplusplus/pp-engine.cpp b/src/libs/cplusplus/pp-engine.cpp
index 0ba1d8459f..ff658f4451 100644
--- a/src/libs/cplusplus/pp-engine.cpp
+++ b/src/libs/cplusplus/pp-engine.cpp
@@ -556,13 +556,14 @@ Preprocessor::State::State()
, m_offsetRef(0)
, m_result(0)
, m_lineRef(1)
- , m_expansionStatus(NotExpanding)
+ , m_currentExpansion(0)
, m_includeGuardState(IncludeGuardState_BeforeIfndef)
{
m_skipping[m_ifLevel] = false;
m_trueTest[m_ifLevel] = false;
m_expansionResult.reserve(256);
+ setExpansionStatus(NotExpanding);
}
#define COMPRESS_TOKEN_BUFFER
@@ -733,14 +734,12 @@ void Preprocessor::setKeepComments(bool keepComments)
void Preprocessor::generateOutputLineMarker(unsigned lineno)
{
maybeStartOutputLine();
- QByteArray marker;
- marker.reserve(64);
+ QByteArray &marker = currentOutputBuffer();
marker.append("# ");
marker.append(QByteArray::number(lineno));
marker.append(" \"");
marker.append(m_env->currentFileUtf8);
marker.append("\"\n");
- writeOutput(marker);
}
void Preprocessor::handleDefined(PPToken *tk)
@@ -1044,7 +1043,7 @@ bool Preprocessor::handleIdentifier(PPToken *tk)
marker.lineno = idTk.lineno;
body.prepend(marker);
body.append(marker);
- m_state.m_expansionStatus = ReadyForExpansion;
+ m_state.setExpansionStatus(ReadyForExpansion);
} else if (oldMarkerTk.f.length
&& (m_state.m_expansionStatus == ReadyForExpansion
|| m_state.m_expansionStatus == Expanding)) {
@@ -1196,11 +1195,11 @@ void Preprocessor::trackExpansionCycles(PPToken *tk)
// ;
if (tk->expanded() && !tk->hasSource()) {
if (m_state.m_expansionStatus == ReadyForExpansion) {
- m_state.m_expansionStatus = Expanding;
+ m_state.setExpansionStatus(Expanding);
m_state.m_expansionResult.clear();
m_state.m_expandedTokensInfo.clear();
} else if (m_state.m_expansionStatus == Expanding) {
- m_state.m_expansionStatus = JustFinishedExpansion;
+ m_state.setExpansionStatus(JustFinishedExpansion);
QByteArray &buffer = currentOutputBuffer();
maybeStartOutputLine();
@@ -1261,13 +1260,13 @@ void Preprocessor::synchronizeOutputLines(const PPToken &tk, bool forceLine)
if (forceLine || m_env->currentLine > tk.lineno || tk.lineno - m_env->currentLine >= 9) {
if (m_state.m_noLines) {
if (!m_state.m_markExpandedTokens)
- writeOutput(' ');
+ currentOutputBuffer().append(' ');
} else {
generateOutputLineMarker(tk.lineno);
}
} else {
for (unsigned i = m_env->currentLine; i < tk.lineno; ++i)
- writeOutput('\n');
+ currentOutputBuffer().append('\n');
}
m_env->currentLine = tk.lineno;
@@ -1306,23 +1305,20 @@ std::size_t Preprocessor::computeDistance(const Preprocessor::PPToken &tk, bool
void Preprocessor::enforceSpacing(const Preprocessor::PPToken &tk, bool forceSpacing)
{
if (tk.whitespace() || forceSpacing) {
+ QByteArray &buffer = currentOutputBuffer();
// For expanded tokens we simply add a whitespace, if necessary - the exact amount of
// whitespaces is irrelevant within an expansion section. For real tokens we must be
// more specific and get the information from the original source.
if (tk.expanded() && !atStartOfOutputLine()) {
- writeOutput(' ');
+ buffer.append(' ');
} else {
const std::size_t spacing = computeDistance(tk, forceSpacing);
const char *tokenBegin = tk.tokenStart();
const char *it = tokenBegin - spacing;
// Reproduce the content as in the original line.
- for (; it != tokenBegin; ++it) {
- if (pp_isspace(*it))
- writeOutput(*it);
- else
- writeOutput(' ');
- }
+ for (; it != tokenBegin; ++it)
+ buffer.append(pp_isspace(*it) ? *it : ' ');
}
}
}
@@ -1346,6 +1342,7 @@ void Preprocessor::preprocess(const QString &fileName, const QByteArray &source,
if (m_keepComments)
m_state.m_lexer->setScanCommentTokens(true);
m_state.m_result = result;
+ m_state.setExpansionStatus(m_state.m_expansionStatus); // Re-set m_currentExpansion
m_state.m_noLines = noLines;
m_state.m_markExpandedTokens = markGeneratedTokens;
m_state.m_inCondition = inCondition;
@@ -1379,7 +1376,7 @@ void Preprocessor::preprocess(const QString &fileName, const QByteArray &source,
}
m_state.m_expandedTokensInfo.append(qMakePair(trackedLine, trackedColumn));
} else if (m_state.m_expansionStatus == JustFinishedExpansion) {
- m_state.m_expansionStatus = NotExpanding;
+ m_state.setExpansionStatus(NotExpanding);
macroExpanded = true;
}
@@ -1390,7 +1387,8 @@ void Preprocessor::preprocess(const QString &fileName, const QByteArray &source,
enforceSpacing(tk, macroExpanded);
// Finally output the token.
- writeOutput(tk.asByteArrayRef());
+ currentOutputBuffer().append(tk.tokenStart(), tk.length());
+
} while (tk.isNot(T_EOF_SYMBOL));
removeTrailingOutputLines();
@@ -2036,40 +2034,15 @@ void Preprocessor::startSkippingBlocks(const Preprocessor::PPToken &tk) const
}
}
-template <class T>
-void Preprocessor::writeOutput(const T &t)
-{
- currentOutputBuffer().append(t);
-}
-
-void Preprocessor::writeOutput(const ByteArrayRef &ref)
-{
- currentOutputBuffer().append(ref.start(), ref.length());
-}
-
bool Preprocessor::atStartOfOutputLine() const
{
- const QByteArray &buffer = currentOutputBuffer();
- return buffer.isEmpty() || buffer.endsWith('\n');
+ const QByteArray *buffer = m_state.m_currentExpansion;
+ return buffer->isEmpty() || buffer->endsWith('\n');
}
void Preprocessor::maybeStartOutputLine()
{
QByteArray &buffer = currentOutputBuffer();
if (!buffer.isEmpty() && !buffer.endsWith('\n'))
- writeOutput('\n');
-}
-
-const QByteArray &Preprocessor::currentOutputBuffer() const
-{
- if (m_state.m_expansionStatus == Expanding)
- return m_state.m_expansionResult;
- return *m_state.m_result;
-}
-
-QByteArray &Preprocessor::currentOutputBuffer()
-{
- if (m_state.m_expansionStatus == Expanding)
- return m_state.m_expansionResult;
- return *m_state.m_result;
+ buffer.append('\n');
}