aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4engine.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2013-08-20 16:54:29 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2013-08-20 16:54:29 +0200
commit461892e492e0bef399714557498380703b3e029b (patch)
treead82e1ae8286bbe650b2ee19ad393a4ab8996bb1 /src/qml/jsruntime/qv4engine.cpp
parenta71e35a95c9f352db91fb82d8a564d01ba961341 (diff)
parent90aaff37be419ca1f1da40df64424c0d88bfaf19 (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.cpp46
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;
}