diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2013-08-20 16:54:29 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2013-08-20 16:54:29 +0200 |
commit | 461892e492e0bef399714557498380703b3e029b (patch) | |
tree | ad82e1ae8286bbe650b2ee19ad393a4ab8996bb1 /src/qml/jsruntime/qv4engine.cpp | |
parent | a71e35a95c9f352db91fb82d8a564d01ba961341 (diff) | |
parent | 90aaff37be419ca1f1da40df64424c0d88bfaf19 (diff) |
Merge branch 'wip/v4' of ssh://codereview.qt-project.org/qt/qtdeclarative into dev
Conflicts:
src/qml/compiler/qv4codegen.cpp
src/qml/compiler/qv4codegen_p.h
src/qml/compiler/qv4isel_moth.cpp
src/qml/jsruntime/qv4context_p.h
src/qml/jsruntime/qv4functionobject.cpp
src/qml/jsruntime/qv4runtime.cpp
src/qml/jsruntime/qv4runtime_p.h
src/qml/jsruntime/qv4script.cpp
sync.profile
Change-Id: I1d785e2134bffac9553a1c16eed12816cbd1ad2c
Diffstat (limited to 'src/qml/jsruntime/qv4engine.cpp')
-rw-r--r-- | src/qml/jsruntime/qv4engine.cpp | 46 |
1 files changed, 16 insertions, 30 deletions
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp index 84ea7ca036..b272e69fb0 100644 --- a/src/qml/jsruntime/qv4engine.cpp +++ b/src/qml/jsruntime/qv4engine.cpp @@ -87,7 +87,6 @@ ExecutionEngine::ExecutionEngine(QQmlJS::EvalISelFactory *factory) , debugger(0) , globalObject(0) , globalCode(0) - , functionsNeedSort(false) , m_engineId(engineSerial.fetchAndAddOrdered(1)) , regExpCache(0) , m_multiplyWrappedQObjects(0) @@ -284,7 +283,6 @@ ExecutionEngine::~ExecutionEngine() emptyClass->destroy(); delete bumperPointerAllocator; delete regExpCache; - UnwindHelper::deregisterFunctions(functions); delete regExpAllocator; delete executableAllocator; } @@ -371,14 +369,6 @@ ExecutionContext *ExecutionEngine::pushGlobalContext() return current; } -Function *ExecutionEngine::newFunction(const QString &name) -{ - Function *f = new Function(this, newIdentifier(name)); - functions.append(f); - functionsNeedSort = true; - return f; -} - FunctionObject *ExecutionEngine::newBuiltinFunction(ExecutionContext *scope, String *name, Value (*code)(SimpleCallContext *)) { BuiltinFunctionOld *f = new (memoryManager) BuiltinFunctionOld(scope, name, code); @@ -620,7 +610,7 @@ QVector<ExecutionEngine::StackFrame> ExecutionEngine::stackTrace(int frameLimit) if (CallContext *callCtx = c->asCallContext()) { StackFrame frame; if (callCtx->function->function) - frame.source = callCtx->function->function->sourceFile; + frame.source = callCtx->function->function->sourceFile(); frame.function = callCtx->function->name->toQString(); frame.line = -1; frame.column = -1; @@ -636,7 +626,7 @@ QVector<ExecutionEngine::StackFrame> ExecutionEngine::stackTrace(int frameLimit) if (frameLimit && globalCode) { StackFrame frame; - frame.source = globalCode->sourceFile; + frame.source = globalCode->sourceFile(); frame.function = globalCode->name->toQString(); frame.line = -1; frame.column = -1; @@ -672,14 +662,14 @@ QUrl ExecutionEngine::resolvedUrl(const QString &file) while (c) { if (CallContext *callCtx = c->asCallContext()) { if (callCtx->function->function) - base.setUrl(callCtx->function->function->sourceFile); + base.setUrl(callCtx->function->function->sourceFile()); break; } c = c->parent; } if (base.isEmpty() && globalCode) - base.setUrl(globalCode->sourceFile); + base.setUrl(globalCode->sourceFile()); if (base.isEmpty()) return src; @@ -727,9 +717,6 @@ void ExecutionEngine::markObjects() c = c->parent; } - for (int i = 0; i < functions.size(); ++i) - functions.at(i)->mark(); - id_length->mark(); id_prototype->mark(); id_constructor->mark(); @@ -784,14 +771,13 @@ void ExecutionEngine::markObjects() if (m_qmlExtensions) m_qmlExtensions->markObjects(); + + for (QSet<CompiledData::CompilationUnit*>::ConstIterator it = compilationUnits.constBegin(), end = compilationUnits.constEnd(); + it != end; ++it) + (*it)->markObjects(); } namespace { - bool functionSortHelper(Function *lhs, Function *rhs) - { - return reinterpret_cast<quintptr>(lhs->code) < reinterpret_cast<quintptr>(rhs->code); - } - struct FindHelper { bool operator()(Function *function, quintptr pc) @@ -809,15 +795,15 @@ namespace { Function *ExecutionEngine::functionForProgramCounter(quintptr pc) const { - if (functionsNeedSort) { - qSort(functions.begin(), functions.end(), functionSortHelper); - functionsNeedSort = false; + for (QSet<QV4::CompiledData::CompilationUnit*>::ConstIterator unitIt = compilationUnits.constBegin(), unitEnd = compilationUnits.constEnd(); + unitIt != unitEnd; ++unitIt) { + const QVector<Function*> &functions = (*unitIt)->runtimeFunctionsSortedByAddress; + QVector<Function*>::ConstIterator it = qBinaryFind(functions.constBegin(), + functions.constEnd(), + pc, FindHelper()); + if (it != functions.constEnd()) + return *it; } - - QVector<Function*>::ConstIterator it = qBinaryFind(functions.constBegin(), functions.constEnd(), - pc, FindHelper()); - if (it != functions.constEnd()) - return *it; return 0; } |