summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorFrederik Gladhorn <frederik.gladhorn@digia.com>2013-01-07 14:46:00 +0100
committerFrederik Gladhorn <frederik.gladhorn@digia.com>2013-01-07 14:46:00 +0100
commitfc6eced446e591bf73a048f6a186c5d2909dda6e (patch)
tree215e2e86d78983c28119d984074d87fea5dcbfa0 /tools
parentdf3356e74d52f3b61a0cfa85b7689fb0b34d3528 (diff)
parente5cd35c807029d3955c03707874f76b773b445bc (diff)
downloadqtactiveqt-fc6eced446e591bf73a048f6a186c5d2909dda6e.tar.gz
Merge remote-tracking branch 'origin/stable' into dev
Conflicts: sync.profile Change-Id: I1bca8b78106fba1846ad8513f02f650d418b773e
Diffstat (limited to 'tools')
-rw-r--r--tools/dumpcpp/main.cpp52
1 files changed, 43 insertions, 9 deletions
diff --git a/tools/dumpcpp/main.cpp b/tools/dumpcpp/main.cpp
index 63a031a..a7a44b1 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>
@@ -77,6 +78,7 @@ extern QMetaObject *qax_readInterfaceInfo(ITypeLib *typeLib, ITypeInfo *typeInfo
extern QList<QByteArray> qax_qualified_usertypes;
extern QString qax_docuFromName(ITypeInfo *typeInfo, const QString &name);
extern bool qax_dispatchEqualsIDispatch;
+extern void qax_deleteMetaObject(QMetaObject *mo);
QByteArray nameSpace;
QMap<QByteArray, QByteArray> namespaceForType;
@@ -535,6 +537,12 @@ void strreg(const QByteArray &s)
}
}
+void strDetachAndRegister(QByteArray s)
+{
+ s.detach();
+ strreg(s);
+}
+
int stridx(const QByteArray &s)
{
int i = stringIndex.value(s);
@@ -563,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)) {
@@ -700,7 +726,7 @@ void generateClassImpl(QTextStream &out, const QMetaObject *mo, const QByteArray
int argsCount = method.parameterCount();
combinedParameterCount += argsCount;
- strreg(method.name());
+ strDetachAndRegister(method.name());
QByteArray typeName = method.typeName();
if (!QtPrivate::isBuiltinType(typeName))
strreg(typeName);
@@ -710,8 +736,8 @@ void generateClassImpl(QTextStream &out, const QMetaObject *mo, const QByteArray
const QList<QByteArray> parameterTypes = method.parameterTypes();
for (int j = 0; j < argsCount; ++j) {
if (!QtPrivate::isBuiltinType(parameterTypes.at(j)))
- strreg(parameterTypes.at(j));
- strreg(parameterNames.at(j));
+ strDetachAndRegister(parameterTypes.at(j));
+ strDetachAndRegister(parameterNames.at(j));
}
}
for (int i = mo->propertyOffset(); i < allPropertyCount; ++i) {
@@ -1002,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))) {
@@ -1119,7 +1149,7 @@ bool generateTypeLibrary(const QByteArray &typeLib, const QByteArray &outname, O
break;
}
- delete metaObject;
+ qax_deleteMetaObject(metaObject);
typeinfo->ReleaseTypeAttr(typeattr);
typeinfo->Release();
}
@@ -1156,6 +1186,7 @@ bool generateTypeLibrary(const QByteArray &typeLib, const QByteArray &outname, O
declOut << " class " << className << ";" << endl;
namespaceForType.insert(className, nspace);
namespaceForType.insert(className + "*", nspace);
+ namespaceForType.insert(className + "**", nspace);
}
}
declOut << "}" << endl << endl;
@@ -1178,6 +1209,7 @@ bool generateTypeLibrary(const QByteArray &typeLib, const QByteArray &outname, O
declOut << " class " << className << ";" << endl;
namespaceForType.insert(className, libName.toLatin1());
namespaceForType.insert(className + "*", libName.toLatin1());
+ namespaceForType.insert(className + "**", libName.toLatin1());
}
}
@@ -1278,7 +1310,7 @@ bool generateTypeLibrary(const QByteArray &typeLib, const QByteArray &outname, O
currentTypeInfo = 0;
}
- delete metaObject;
+ qax_deleteMetaObject(metaObject);
typeinfo->ReleaseTypeAttr(typeattr);
typeinfo->Release();
@@ -1379,10 +1411,12 @@ 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;
}
- delete namespaceObject;
+ qax_deleteMetaObject(namespaceObject);
classesOut.flush();
inlinesOut.flush();