diff options
Diffstat (limited to 'src/qml/compiler/qv4compileddata.cpp')
-rw-r--r-- | src/qml/compiler/qv4compileddata.cpp | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/src/qml/compiler/qv4compileddata.cpp b/src/qml/compiler/qv4compileddata.cpp index 59c6a9b7fd..7f02509a80 100644 --- a/src/qml/compiler/qv4compileddata.cpp +++ b/src/qml/compiler/qv4compileddata.cpp @@ -45,11 +45,19 @@ #include <private/qv4function_p.h> #include <private/qv4lookup_p.h> #include <private/qv4regexpobject_p.h> +#include <private/qv4unwindhelper_p.h> namespace QV4 { namespace CompiledData { +namespace { + bool functionSortHelper(QV4::Function *lhs, QV4::Function *rhs) + { + return reinterpret_cast<quintptr>(lhs->code) < reinterpret_cast<quintptr>(rhs->code); + } +} + CompilationUnit::~CompilationUnit() { engine->compilationUnits.erase(engine->compilationUnits.find(this)); @@ -121,7 +129,13 @@ QV4::Function *CompilationUnit::linkToEngine(ExecutionEngine *engine) } } - return linkBackendToEngine(engine); + QV4::Function *entry = linkBackendToEngine(engine); + + runtimeFunctionsSortedByAddress.resize(runtimeFunctions.size()); + memcpy(runtimeFunctionsSortedByAddress.data(), runtimeFunctions.data(), runtimeFunctions.size() * sizeof(QV4::Function*)); + qSort(runtimeFunctionsSortedByAddress.begin(), runtimeFunctionsSortedByAddress.end(), functionSortHelper); + + return entry; } void CompilationUnit::markObjects() @@ -130,6 +144,8 @@ void CompilationUnit::markObjects() runtimeStrings[i]->mark(); for (int i = 0; i < data->regexpTableSize; ++i) runtimeRegularExpressions[i].mark(); + for (int i = 0; i < runtimeFunctions.count(); ++i) + runtimeFunctions[i]->mark(); } } |