aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/compiler/qv4compiler.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2014-03-27 17:07:06 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-03-28 15:07:03 +0100
commit0ed744c1ef955cdb94cbd89c58283663da490d7d (patch)
treee07da64307bb70331ed0a9cbfa78ecd960b57b14 /src/qml/compiler/qv4compiler.cpp
parent6bbd173a9cb36021ed284522ac628400469eab2f (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.cpp93
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);
}
-
-