aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/compiler
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml/compiler')
-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();