From c586fc4be2428db57ba8579f8280d09893ba796d Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Thu, 14 Jul 2016 16:12:09 +0200 Subject: [PATCH] Clean up function offset table generation We can replace the intermediate hash with a vector of the final little-endian encoded function offsets. Change-Id: If3f970330ab232a672f7c75b4d32f8ef4d246714 Reviewed-by: Lars Knoll --- src/qml/compiler/qv4compiler.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/qml/compiler/qv4compiler.cpp b/src/qml/compiler/qv4compiler.cpp index 8c99fdf0ca..4651bc2c8f 100644 --- a/src/qml/compiler/qv4compiler.cpp +++ b/src/qml/compiler/qv4compiler.cpp @@ -42,6 +42,7 @@ #include #include #include +#include QV4::Compiler::StringTableGenerator::StringTableGenerator() { @@ -220,11 +221,11 @@ QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit(GeneratorO int unitSize = QV4::CompiledData::Unit::calculateSize(irModule->functions.size(), regexps.size(), constants.size(), lookups.size(), jsClassOffsets.count()); - QHash functionOffsets; + CompiledData::LEUInt32 *functionOffsets = reinterpret_cast(alloca(irModule->functions.size() * sizeof(CompiledData::LEUInt32))); 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); + functionOffsets[i] = functionDataSize + unitSize; const int qmlIdDepsCount = f->idObjectDependencies.count(); const int qmlPropertyDepsCount = f->scopeObjectPropertyDependencies.count() + f->contextObjectPropertyDependencies.count(); @@ -266,11 +267,7 @@ QV4::CompiledData::Unit *QV4::Compiler::JSUnitGenerator::generateUnit(GeneratorO unit->offsetToObjects = 0; unit->indexOfRootObject = 0; - { - CompiledData::LEUInt32 *functionTable = reinterpret_cast(data + unit->offsetToFunctionTable); - for (int i = 0; i < irModule->functions.size(); ++i) - functionTable[i] = functionOffsets.value(irModule->functions.at(i)); - } + memcpy(data + unit->offsetToFunctionTable, functionOffsets, unit->functionTableSize * sizeof(CompiledData::LEUInt32)); char *f = data + unitSize; for (int i = 0; i < irModule->functions.size(); ++i) {