diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2014-03-27 17:07:06 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-03-28 15:07:03 +0100 |
commit | 0ed744c1ef955cdb94cbd89c58283663da490d7d (patch) | |
tree | e07da64307bb70331ed0a9cbfa78ecd960b57b14 /src/qml/compiler/qv4compiler.cpp | |
parent | 6bbd173a9cb36021ed284522ac628400469eab2f (diff) |
Various cleanups
* Encapsulate the string pooling for the V4 data generation into a StringGenerator class.
* Move type reference collection into the IR::Document, where it belongs (as it writes
into the typeReferences there)
* const fixes
* Remove unused methods and members
* Store unit and qml unit sizes right in the generated data structure. That makes copying
easier (like we do when generating the QML data based on the JS fields)
Change-Id: I053146ab0b00cc90ac7f72f867415962d1be121b
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/qml/compiler/qv4compiler.cpp')
-rw-r--r-- | src/qml/compiler/qv4compiler.cpp | 93 |
1 files changed, 54 insertions, 39 deletions
diff --git a/src/qml/compiler/qv4compiler.cpp b/src/qml/compiler/qv4compiler.cpp index f25b1900ce..0338bf1840 100644 --- a/src/qml/compiler/qv4compiler.cpp +++ b/src/qml/compiler/qv4compiler.cpp @@ -45,19 +45,12 @@ #include <qv4engine_p.h> #include <private/qqmlpropertycache_p.h> -QV4::Compiler::JSUnitGenerator::JSUnitGenerator(QV4::IR::Module *module, int headerSize) - : irModule(module) - , stringDataSize(0) - , jsClassDataSize(0) +QV4::Compiler::StringTableGenerator::StringTableGenerator() { - if (headerSize == -1) - headerSize = sizeof(QV4::CompiledData::Unit); - this->headerSize = headerSize; - // Make sure the empty string always gets index 0 - registerString(QString()); + clear(); } -int QV4::Compiler::JSUnitGenerator::registerString(const QString &str) +int QV4::Compiler::StringTableGenerator::registerString(const QString &str) { QHash<QString, int>::ConstIterator it = stringToId.find(str); if (it != stringToId.end()) @@ -68,12 +61,50 @@ int QV4::Compiler::JSUnitGenerator::registerString(const QString &str) return strings.size() - 1; } -int QV4::Compiler::JSUnitGenerator::getStringId(const QString &string) const +int QV4::Compiler::StringTableGenerator::getStringId(const QString &string) const { Q_ASSERT(stringToId.contains(string)); return stringToId.value(string); } +void QV4::Compiler::StringTableGenerator::clear() +{ + strings.clear(); + stringToId.clear(); + stringDataSize = 0; +} + +void QV4::Compiler::StringTableGenerator::serialize(uint *stringTable, char *dataStart, char *stringData) +{ + for (int i = 0; i < strings.size(); ++i) { + stringTable[i] = stringData - dataStart; + const QString &qstr = strings.at(i); + + QV4::CompiledData::String *s = (QV4::CompiledData::String*)(stringData); + s->hash = QV4::String::createHashValue(qstr.constData(), qstr.length()); + s->flags = 0; // ### + s->str.ref.atomic.store(-1); + s->str.size = qstr.length(); + s->str.alloc = 0; + s->str.capacityReserved = false; + s->str.offset = sizeof(QArrayData); + memcpy(s + 1, qstr.constData(), (qstr.length() + 1)*sizeof(ushort)); + + stringData += QV4::CompiledData::String::calculateSize(qstr); + } +} + +QV4::Compiler::JSUnitGenerator::JSUnitGenerator(QV4::IR::Module *module, int headerSize) + : irModule(module) + , jsClassDataSize(0) +{ + if (headerSize == -1) + headerSize = sizeof(QV4::CompiledData::Unit); + this->headerSize = headerSize; + // Make sure the empty string always gets index 0 + registerString(QString()); +} + uint QV4::Compiler::JSUnitGenerator::registerIndexedGetterLookup() { CompiledData::Lookup l; @@ -175,7 +206,7 @@ int QV4::Compiler::JSUnitGenerator::registerJSClass(int count, IR::ExprList *arg return jsClasses.size() - 1; } -QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit(int *totalUnitSize) +QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit() { registerString(irModule->fileName); foreach (QV4::IR::Function *f, irModule->functions) { @@ -186,22 +217,20 @@ QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit(int *total registerString(*f->locals.at(i)); } - int unitSize = QV4::CompiledData::Unit::calculateSize(headerSize, strings.size(), irModule->functions.size(), regexps.size(), + int unitSize = QV4::CompiledData::Unit::calculateSize(headerSize, stringTable.stringCount(), irModule->functions.size(), regexps.size(), constants.size(), lookups.size(), jsClasses.count()); uint functionDataSize = 0; for (int i = 0; i < irModule->functions.size(); ++i) { QV4::IR::Function *f = irModule->functions.at(i); - functionOffsets.insert(f, functionDataSize + unitSize + stringDataSize); + functionOffsets.insert(f, functionDataSize + unitSize + stringTable.dataSize()); const int qmlIdDepsCount = f->idObjectDependencies.count(); const int qmlPropertyDepsCount = f->scopeObjectPropertyDependencies.count() + f->contextObjectPropertyDependencies.count(); functionDataSize += QV4::CompiledData::Function::calculateSize(f->formals.size(), f->locals.size(), f->nestedFunctions.size(), qmlIdDepsCount, qmlPropertyDepsCount); } - const int totalSize = unitSize + functionDataSize + stringDataSize + jsClassDataSize; - if (totalUnitSize) - *totalUnitSize = totalSize; + const int totalSize = unitSize + functionDataSize + stringTable.dataSize() + jsClassDataSize; char *data = (char *)malloc(totalSize); memset(data, 0, totalSize); QV4::CompiledData::Unit *unit = (QV4::CompiledData::Unit*)data; @@ -210,7 +239,8 @@ QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit(int *total unit->architecture = 0; // ### unit->flags = QV4::CompiledData::Unit::IsJavascript; unit->version = 1; - unit->stringTableSize = strings.size(); + unit->unitSize = totalSize; + unit->stringTableSize = stringTable.stringCount(); unit->offsetToStringTable = headerSize; unit->functionTableSize = irModule->functions.size(); unit->offsetToFunctionTable = unit->offsetToStringTable + unit->stringTableSize * sizeof(uint); @@ -226,30 +256,17 @@ QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit(int *total unit->sourceFileIndex = getStringId(irModule->fileName); // write strings and string table - uint *stringTable = (uint *)(data + unit->offsetToStringTable); - char *string = data + unitSize; - for (int i = 0; i < strings.size(); ++i) { - stringTable[i] = string - data; - const QString &qstr = strings.at(i); - - QV4::CompiledData::String *s = (QV4::CompiledData::String*)(string); - s->hash = QV4::String::createHashValue(qstr.constData(), qstr.length()); - s->flags = 0; // ### - s->str.ref.atomic.store(-1); - s->str.size = qstr.length(); - s->str.alloc = 0; - s->str.capacityReserved = false; - s->str.offset = sizeof(QArrayData); - memcpy(s + 1, qstr.constData(), (qstr.length() + 1)*sizeof(ushort)); - - string += QV4::CompiledData::String::calculateSize(qstr); + { + uint *stringTablePtr = (uint *)(data + unit->offsetToStringTable); + char *string = data + unitSize; + stringTable.serialize(stringTablePtr, data, string); } uint *functionTable = (uint *)(data + unit->offsetToFunctionTable); for (int i = 0; i < irModule->functions.size(); ++i) functionTable[i] = functionOffsets.value(irModule->functions.at(i)); - char *f = data + unitSize + stringDataSize; + char *f = data + unitSize + stringTable.dataSize(); for (int i = 0; i < irModule->functions.size(); ++i) { QV4::IR::Function *function = irModule->functions.at(i); if (function == irModule->rootFunction) @@ -271,7 +288,7 @@ QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit(int *total // write js classes and js class lookup table uint *jsClassTable = (uint*)(data + unit->offsetToJSClassTable); - char *jsClass = data + unitSize + stringDataSize + functionDataSize; + char *jsClass = data + unitSize + stringTable.dataSize() + functionDataSize; for (int i = 0; i < jsClasses.count(); ++i) { jsClassTable[i] = jsClass - data; @@ -383,5 +400,3 @@ int QV4::Compiler::JSUnitGenerator::writeFunction(char *f, int index, QV4::IR::F return CompiledData::Function::calculateSize(function->nFormals, function->nLocals, function->nInnerFunctions, function->nDependingIdObjects, function->nDependingContextProperties + function->nDependingScopeProperties); } - - |