From 1526771ebf473af8a65bce77cfd16be67b6eb944 Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Thu, 27 Mar 2014 19:18:55 +0100 Subject: V4 string table cleanups Move the string table (index and data) to the end of the compilation unit. That makes it easier to extend the string table later with new strings - for example when transitioning from JS data to an entire QML unit - because all the other offsets within the JS data remain the same. Change-Id: Ib28caf943ee2ec74b7acc19c2980de0853bb8086 Reviewed-by: Lars Knoll --- src/qml/compiler/qv4compileddata_p.h | 4 ++-- src/qml/compiler/qv4compiler.cpp | 30 +++++++++++++++--------------- src/qml/compiler/qv4compiler_p.h | 3 ++- 3 files changed, 19 insertions(+), 18 deletions(-) (limited to 'src/qml/compiler') diff --git a/src/qml/compiler/qv4compileddata_p.h b/src/qml/compiler/qv4compileddata_p.h index d6d2419d74..afcf2c6a24 100644 --- a/src/qml/compiler/qv4compileddata_p.h +++ b/src/qml/compiler/qv4compileddata_p.h @@ -228,10 +228,10 @@ struct Unit return reinterpret_cast(ptr + sizeof(JSClass)); } - static int calculateSize(uint headerSize, uint nStrings, uint nFunctions, uint nRegExps, uint nConstants, + static int calculateSize(uint headerSize, uint nFunctions, uint nRegExps, uint nConstants, uint nLookups, uint nClasses) { return (headerSize - + (nStrings + nFunctions + nClasses) * sizeof(uint) + + (nFunctions + nClasses) * sizeof(uint) + nRegExps * RegExp::calculateSize() + nConstants * sizeof(QV4::ReturnedValue) + nLookups * Lookup::calculateSize() diff --git a/src/qml/compiler/qv4compiler.cpp b/src/qml/compiler/qv4compiler.cpp index 0338bf1840..17e0851b4a 100644 --- a/src/qml/compiler/qv4compiler.cpp +++ b/src/qml/compiler/qv4compiler.cpp @@ -217,20 +217,20 @@ QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit() registerString(*f->locals.at(i)); } - int unitSize = QV4::CompiledData::Unit::calculateSize(headerSize, stringTable.stringCount(), irModule->functions.size(), regexps.size(), + int unitSize = QV4::CompiledData::Unit::calculateSize(headerSize, 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 + stringTable.dataSize()); + functionOffsets.insert(f, functionDataSize + unitSize); 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 + stringTable.dataSize() + jsClassDataSize; + const int totalSize = unitSize + functionDataSize + jsClassDataSize + stringTable.sizeOfTableAndData(); char *data = (char *)malloc(totalSize); memset(data, 0, totalSize); QV4::CompiledData::Unit *unit = (QV4::CompiledData::Unit*)data; @@ -240,10 +240,8 @@ QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit() unit->flags = QV4::CompiledData::Unit::IsJavascript; unit->version = 1; unit->unitSize = totalSize; - unit->stringTableSize = stringTable.stringCount(); - unit->offsetToStringTable = headerSize; unit->functionTableSize = irModule->functions.size(); - unit->offsetToFunctionTable = unit->offsetToStringTable + unit->stringTableSize * sizeof(uint); + unit->offsetToFunctionTable = headerSize; unit->lookupTableSize = lookups.count(); unit->offsetToLookupTable = unit->offsetToFunctionTable + unit->functionTableSize * sizeof(uint); unit->regexpTableSize = regexps.size(); @@ -252,21 +250,16 @@ QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit() unit->offsetToConstantTable = unit->offsetToRegexpTable + unit->regexpTableSize * CompiledData::RegExp::calculateSize(); unit->jsClassTableSize = jsClasses.count(); unit->offsetToJSClassTable = unit->offsetToConstantTable + unit->constantTableSize * sizeof(ReturnedValue); + unit->stringTableSize = stringTable.stringCount(); + unit->offsetToStringTable = unitSize + functionDataSize + jsClassDataSize; unit->indexOfRootFunction = -1; unit->sourceFileIndex = getStringId(irModule->fileName); - // write strings and string table - { - 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 + stringTable.dataSize(); + char *f = data + unitSize; for (int i = 0; i < irModule->functions.size(); ++i) { QV4::IR::Function *function = irModule->functions.at(i); if (function == irModule->rootFunction) @@ -288,7 +281,7 @@ QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit() // write js classes and js class lookup table uint *jsClassTable = (uint*)(data + unit->offsetToJSClassTable); - char *jsClass = data + unitSize + stringTable.dataSize() + functionDataSize; + char *jsClass = data + unitSize + functionDataSize; for (int i = 0; i < jsClasses.count(); ++i) { jsClassTable[i] = jsClass - data; @@ -304,6 +297,13 @@ QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit() jsClass += CompiledData::JSClass::calculateSize(members.count()); } + // write strings and string table + { + uint *stringTablePtr = (uint *)(data + unit->offsetToStringTable); + char *string = data + unit->offsetToStringTable + unit->stringTableSize * sizeof(uint); + stringTable.serialize(stringTablePtr, data, string); + } + return unit; } diff --git a/src/qml/compiler/qv4compiler_p.h b/src/qml/compiler/qv4compiler_p.h index 756e7cfd52..e04f13aaf3 100644 --- a/src/qml/compiler/qv4compiler_p.h +++ b/src/qml/compiler/qv4compiler_p.h @@ -66,7 +66,8 @@ struct Q_QML_EXPORT StringTableGenerator { int getStringId(const QString &string) const; QString stringForIndex(int index) const { return strings.at(index); } uint stringCount() const { return strings.size(); } - uint dataSize() const { return stringDataSize; } + + uint sizeOfTableAndData() const { return stringDataSize + strings.count() * sizeof(uint); } void clear(); -- cgit v1.2.3