summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@digia.com>2012-12-04 11:41:15 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2012-12-04 12:42:11 +0100
commit5277586c68e3232b5132bf65270f104c054a0409 (patch)
tree3bedfb178abee6e474af358e1c11ff3cf37c28e5
parent056d9b57cee7476cdb6e901334c9f8e3992f5105 (diff)
dumpcpp: use temporary file as class implementation buffer
Instead of writing vast amounts of data into a QByteArray, we're using a temporary file as clipboard. This enables us to handle much larger import tables without worrying about running out of RAM. Task-number: QTBUG-28325 Change-Id: Ied9567651cd859400ba3ed9a45cbbaac603300b6 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
-rw-r--r--tools/dumpcpp/main.cpp31
1 files changed, 28 insertions, 3 deletions
diff --git a/tools/dumpcpp/main.cpp b/tools/dumpcpp/main.cpp
index 8fe7818..1af4518 100644
--- a/tools/dumpcpp/main.cpp
+++ b/tools/dumpcpp/main.cpp
@@ -46,6 +46,7 @@
#include <QTextStream>
#include <QSettings>
#include <QStringList>
+#include <QTemporaryFile>
#include <QUuid>
#include <QWidget>
#include <QFileInfo>
@@ -570,6 +571,24 @@ uint nameToBuiltinType(const QByteArray &name)
return tp < uint(QMetaType::User) ? tp : uint(QMetaType::UnknownType);
}
+void copyFileToStream(QFile *file, QTextStream *stream)
+{
+ file->seek(0);
+ QByteArray buffer;
+ const int bufferSize = 4096 * 1024;
+ buffer.resize(bufferSize);
+ while (!file->atEnd()) {
+ const int bytesRead = static_cast<int>(file->read(buffer.data(), bufferSize));
+ if (bytesRead < bufferSize) {
+ buffer.resize(bytesRead);
+ *stream << buffer;
+ buffer.resize(bufferSize);
+ } else {
+ *stream << buffer;
+ }
+ }
+}
+
void generateTypeInfo(QTextStream &out, const QByteArray &typeName)
{
if (QtPrivate::isBuiltinType(typeName)) {
@@ -1009,8 +1028,12 @@ bool generateTypeLibrary(const QByteArray &typeLib, const QByteArray &outname, O
QMetaObject *namespaceObject = qax_readEnumInfo(typelib, 0);
- QByteArray classImplBuffer;
- QTextStream classImplOut(&classImplBuffer, QIODevice::WriteOnly);
+ QTemporaryFile classImplFile;
+ if (!classImplFile.open()) {
+ qWarning("dumpcpp: Cannot open temporary file.");
+ return false;
+ }
+ QTextStream classImplOut(&classImplFile);
QFile implFile(cppFile + QLatin1String(".cpp"));
QTextStream implOut(&implFile);
if (!(category & (NoMetaObject|NoImplementation))) {
@@ -1386,7 +1409,9 @@ bool generateTypeLibrary(const QByteArray &typeLib, const QByteArray &outname, O
implOut << "#undef QT_MOC_LITERAL" << endl << endl;
- implOut << classImplBuffer << endl;
+ classImplOut.flush();
+ copyFileToStream(&classImplFile, &implOut);
+ implOut << endl;
}
qax_deleteMetaObject(namespaceObject);