diff --git a/src/libs/cplusplus/pp-engine.cpp b/src/libs/cplusplus/pp-engine.cpp index 6e85fe95a57fb477e70e525d66669294652d3a44..0ba1d8459fda72a217aaa92fa59edf97fde5e4ee 100644 --- a/src/libs/cplusplus/pp-engine.cpp +++ b/src/libs/cplusplus/pp-engine.cpp @@ -1202,16 +1202,13 @@ void Preprocessor::trackExpansionCycles(PPToken *tk) } else if (m_state.m_expansionStatus == Expanding) { m_state.m_expansionStatus = JustFinishedExpansion; - QByteArray *buffer = currentOutputBuffer(); - if (!buffer) - return; - + QByteArray &buffer = currentOutputBuffer(); maybeStartOutputLine(); // Offset and length of the macro invocation char chunk[40]; qsnprintf(chunk, sizeof(chunk), "# expansion begin %d,%d", tk->offset, tk->length()); - buffer->append(chunk); + buffer.append(chunk); // Expanded tokens unsigned generatedCount = 0; @@ -1220,23 +1217,23 @@ void Preprocessor::trackExpansionCycles(PPToken *tk) if (p.first) { if (generatedCount) { qsnprintf(chunk, sizeof(chunk), " ~%d", generatedCount); - buffer->append(chunk); + buffer.append(chunk); generatedCount = 0; } qsnprintf(chunk, sizeof(chunk), " %d:%d", p.first, p.second); - buffer->append(chunk); + buffer.append(chunk); } else { ++generatedCount; } } if (generatedCount) { qsnprintf(chunk, sizeof(chunk), " ~%d", generatedCount); - buffer->append(chunk); + buffer.append(chunk); } - buffer->append('\n'); - buffer->append(m_state.m_expansionResult); + buffer.append('\n'); + buffer.append(m_state.m_expansionResult); maybeStartOutputLine(); - buffer->append("# expansion end\n"); + buffer.append("# expansion end\n"); } lex(tk); @@ -1279,16 +1276,14 @@ void Preprocessor::synchronizeOutputLines(const PPToken &tk, bool forceLine) void Preprocessor::removeTrailingOutputLines() { - QByteArray *buffer = currentOutputBuffer(); - if (buffer) { - int i = buffer->size() - 1; - while (i >= 0 && buffer->at(i) == '\n') - --i; - const int mightChop = buffer->size() - i - 1; - if (mightChop > 1) { - // Keep one new line at end. - buffer->chop(mightChop - 1); - } + QByteArray &buffer = currentOutputBuffer(); + int i = buffer.size() - 1; + while (i >= 0 && buffer.at(i) == '\n') + --i; + const int mightChop = buffer.size() - i - 1; + if (mightChop > 1) { + // Keep one new line at end. + buffer.chop(mightChop - 1); } } @@ -2044,40 +2039,37 @@ void Preprocessor::startSkippingBlocks(const Preprocessor::PPToken &tk) const template <class T> void Preprocessor::writeOutput(const T &t) { - QByteArray *buffer = currentOutputBuffer(); - if (buffer) - buffer->append(t); + currentOutputBuffer().append(t); } void Preprocessor::writeOutput(const ByteArrayRef &ref) { - QByteArray *buffer = currentOutputBuffer(); - if (buffer) - buffer->append(ref.start(), ref.length()); + currentOutputBuffer().append(ref.start(), ref.length()); } bool Preprocessor::atStartOfOutputLine() const { - const QByteArray *buffer = currentOutputBuffer(); - return (buffer && !buffer->isEmpty()) ? *(buffer->end() - 1) == '\n' : true; + const QByteArray &buffer = currentOutputBuffer(); + return buffer.isEmpty() || buffer.endsWith('\n'); } void Preprocessor::maybeStartOutputLine() { - QByteArray *buffer = currentOutputBuffer(); - if (buffer && !buffer->isEmpty() && *(buffer->end() - 1) != '\n') + QByteArray &buffer = currentOutputBuffer(); + if (!buffer.isEmpty() && !buffer.endsWith('\n')) writeOutput('\n'); } -const QByteArray *Preprocessor::currentOutputBuffer() const +const QByteArray &Preprocessor::currentOutputBuffer() const { if (m_state.m_expansionStatus == Expanding) - return &m_state.m_expansionResult; - - return m_state.m_result; + return m_state.m_expansionResult; + return *m_state.m_result; } -QByteArray *Preprocessor::currentOutputBuffer() +QByteArray &Preprocessor::currentOutputBuffer() { - return const_cast<QByteArray *>(static_cast<const Preprocessor *>(this)->currentOutputBuffer()); + if (m_state.m_expansionStatus == Expanding) + return m_state.m_expansionResult; + return *m_state.m_result; } diff --git a/src/libs/cplusplus/pp-engine.h b/src/libs/cplusplus/pp-engine.h index d95effba9c150dd325afd36bd7dbab129990cf11..7d04849168d38ed5b836c5dcaffc10b97d21e15e 100644 --- a/src/libs/cplusplus/pp-engine.h +++ b/src/libs/cplusplus/pp-engine.h @@ -236,8 +236,8 @@ private: void synchronizeOutputLines(const PPToken &tk, bool forceLine = false); void removeTrailingOutputLines(); - const QByteArray *currentOutputBuffer() const; - QByteArray *currentOutputBuffer(); + const QByteArray ¤tOutputBuffer() const; + QByteArray ¤tOutputBuffer(); void enforceSpacing(const PPToken &tk, bool forceSpacing = false); static std::size_t computeDistance(const PPToken &tk, bool forceTillLine = false);