Skip to content

Commit 0fadf9e

Browse files
authored
sped up Tokenizer::dump() (#5009)
Scanning the `cli` folder with `DISABLE_VALUEFLOW=1` `Tokenizer::dump()` will consume almost 25% of the total Ir count when an addon is specified. This is mainly caused by the usage of `std::ostream`. Encountered while profiling #4958.
1 parent 98401a3 commit 0fadf9e

File tree

7 files changed

+684
-287
lines changed

7 files changed

+684
-287
lines changed

lib/cppcheck.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -315,8 +315,8 @@ static void createDumpFile(const Settings& settings,
315315
break;
316316
}
317317

318-
fdump << "<?xml version=\"1.0\"?>" << std::endl;
319-
fdump << "<dumps" << language << ">" << std::endl;
318+
fdump << "<?xml version=\"1.0\"?>\n";
319+
fdump << "<dumps" << language << ">\n";
320320
fdump << " <platform"
321321
<< " name=\"" << settings.platform.toString() << '\"'
322322
<< " char_bit=\"" << settings.platform.char_bit << '\"'
@@ -325,7 +325,7 @@ static void createDumpFile(const Settings& settings,
325325
<< " long_bit=\"" << settings.platform.long_bit << '\"'
326326
<< " long_long_bit=\"" << settings.platform.long_long_bit << '\"'
327327
<< " pointer_bit=\"" << (settings.platform.sizeof_pointer * settings.platform.char_bit) << '\"'
328-
<< "/>\n";
328+
<< "/>" << '\n';
329329
}
330330

331331
static std::string executeAddon(const AddonInfo &addonInfo,
@@ -571,16 +571,16 @@ unsigned int CppCheck::check(const std::string &path)
571571
std::string dumpFile;
572572
createDumpFile(mSettings, path, fdump, dumpFile);
573573
if (fdump.is_open()) {
574-
fdump << "<dump cfg=\"\">" << std::endl;
574+
fdump << "<dump cfg=\"\">\n";
575575
for (const ErrorMessage& errmsg: compilerWarnings)
576576
fdump << " <clang-warning file=\"" << toxml(errmsg.callStack.front().getfile()) << "\" line=\"" << errmsg.callStack.front().line << "\" column=\"" << errmsg.callStack.front().column << "\" message=\"" << toxml(errmsg.shortMessage()) << "\"/>\n";
577-
fdump << " <standards>" << std::endl;
578-
fdump << " <c version=\"" << mSettings.standards.getC() << "\"/>" << std::endl;
579-
fdump << " <cpp version=\"" << mSettings.standards.getCPP() << "\"/>" << std::endl;
580-
fdump << " </standards>" << std::endl;
577+
fdump << " <standards>\n";
578+
fdump << " <c version=\"" << mSettings.standards.getC() << "\"/>\n";
579+
fdump << " <cpp version=\"" << mSettings.standards.getCPP() << "\"/>\n";
580+
fdump << " </standards>\n";
581581
tokenizer.dump(fdump);
582-
fdump << "</dump>" << std::endl;
583-
fdump << "</dumps>" << std::endl;
582+
fdump << "</dump>\n";
583+
fdump << "</dumps>\n";
584584
fdump.close();
585585
}
586586

lib/errorlogger.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -731,36 +731,36 @@ std::string ErrorMessage::FileLocation::stringify() const
731731

732732
std::string ErrorLogger::toxml(const std::string &str)
733733
{
734-
std::ostringstream xml;
734+
std::string xml;
735735
for (const unsigned char c : str) {
736736
switch (c) {
737737
case '<':
738-
xml << "&lt;";
738+
xml += "&lt;";
739739
break;
740740
case '>':
741-
xml << "&gt;";
741+
xml += "&gt;";
742742
break;
743743
case '&':
744-
xml << "&amp;";
744+
xml += "&amp;";
745745
break;
746746
case '\"':
747-
xml << "&quot;";
747+
xml += "&quot;";
748748
break;
749749
case '\'':
750-
xml << "&apos;";
750+
xml += "&apos;";
751751
break;
752752
case '\0':
753-
xml << "\\0";
753+
xml += "\\0";
754754
break;
755755
default:
756756
if (c >= ' ' && c <= 0x7f)
757-
xml << c;
757+
xml += c;
758758
else
759-
xml << 'x';
759+
xml += 'x';
760760
break;
761761
}
762762
}
763-
return xml.str();
763+
return xml;
764764
}
765765

766766
std::string ErrorLogger::plistHeader(const std::string &version, const std::vector<std::string> &files)

0 commit comments

Comments
 (0)