aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2014-03-27 19:18:55 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-03-28 16:25:16 +0100
commit1526771ebf473af8a65bce77cfd16be67b6eb944 (patch)
treeb4167f7f93703db93da1a5f5b486da1ada4d007e
parent0ed744c1ef955cdb94cbd89c58283663da490d7d (diff)
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 <lars.knoll@digia.com>
-rw-r--r--src/qml/compiler/qv4compileddata_p.h4
-rw-r--r--src/qml/compiler/qv4compiler.cpp30
-rw-r--r--src/qml/compiler/qv4compiler_p.h3
3 files changed, 19 insertions, 18 deletions
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<const JSClassMember*>(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();