From 4658491eb23c99c140e9b261fc708b2d43c9023d Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Wed, 29 May 2013 09:59:40 +0200 Subject: [PATCH] Fix Qt.include related autotests Resolve relative file names correctly. This works, but is not how it should look finally, as the whole context handling for include() and imports will still change somewhat. Change-Id: I64cdda222f13c3ca650a1dfe2f97e97adafe53a8 Reviewed-by: Simon Hausmann --- src/qml/qml/v4/qv4engine.cpp | 26 ++++++++++++++++++++++++++ src/qml/qml/v4/qv4engine_p.h | 1 + src/qml/qml/v4/qv4include.cpp | 19 +------------------ 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/qml/qml/v4/qv4engine.cpp b/src/qml/qml/v4/qv4engine.cpp index cc3a5e2..f4f80a4 100644 --- a/src/qml/qml/v4/qv4engine.cpp +++ b/src/qml/qml/v4/qv4engine.cpp @@ -724,6 +724,32 @@ ExecutionEngine::StackFrame ExecutionEngine::currentStackFrame() const return frame; } +QUrl ExecutionEngine::resolvedUrl(const QString &file) +{ + QUrl src(file); + if (!src.isRelative()) + return src; + + QUrl base; + QV4::ExecutionContext *c = current; + while (c) { + if (CallContext *callCtx = c->asCallContext()) { + if (callCtx->function->function) + base.setUrl(callCtx->function->function->sourceFile); + break; + } + c = c->parent; + } + + if (base.isEmpty() && globalCode) + base.setUrl(globalCode->sourceFile); + + if (base.isEmpty()) + return src; + + return base.resolved(src); +} + void ExecutionEngine::requireArgumentsAccessors(int n) { if (n <= argumentsAccessors.size()) diff --git a/src/qml/qml/v4/qv4engine_p.h b/src/qml/qml/v4/qv4engine_p.h index d2ea9db..84818f7 100644 --- a/src/qml/qml/v4/qv4engine_p.h +++ b/src/qml/qml/v4/qv4engine_p.h @@ -282,6 +282,7 @@ struct Q_QML_EXPORT ExecutionEngine typedef QVector StackTrace; StackTrace stackTrace(int frameLimit = -1) const; StackFrame currentStackFrame() const; + QUrl resolvedUrl(const QString &file); void requireArgumentsAccessors(int n); diff --git a/src/qml/qml/v4/qv4include.cpp b/src/qml/qml/v4/qv4include.cpp index 8354277..d4c2c13 100644 --- a/src/qml/qml/v4/qv4include.cpp +++ b/src/qml/qml/v4/qv4include.cpp @@ -140,18 +140,9 @@ void QV4Include::finished() QString code = QString::fromUtf8(data); QQmlScript::Parser::extractPragmas(code); - QQmlContextData *importContext = new QQmlContextData; - importContext->isInternal = true; - importContext->isJSContext = true; - importContext->url = m_url; - importContext->isPragmaLibraryContext = m_context->isPragmaLibraryContext; - importContext->setParent(m_context, true); - QV4::Script script(v4, m_qmlglobal.value().asObject(), code, m_url.toString()); QV4::ExecutionContext *ctx = v4->current; - // ### Only used for debugging info - //m_engine->contextWrapper()->addSubContext(m_qmlglobal.value(), script, importContext); QV4::Object *o = m_resultObject.value().asObject(); try { script.parse(); @@ -187,7 +178,7 @@ QV4::Value QV4Include::include(QV4::SimpleCallContext *ctx) if (!context || !context->isJSContext) V4THROW_ERROR("Qt.include(): Can only be called from JavaScript files"); - QUrl url(context->resolvedUrl(QUrl(ctx->arguments[0].toQString()))); + QUrl url(ctx->engine->resolvedUrl(ctx->arguments[0].toQString())); QV4::Value callbackFunction; if (ctx->argumentCount >= 2 && ctx->arguments[1].asFunctionObject()) @@ -213,17 +204,9 @@ QV4::Value QV4Include::include(QV4::SimpleCallContext *ctx) QString code = QString::fromUtf8(data); QQmlScript::Parser::extractPragmas(code); - QQmlContextData *importContext = new QQmlContextData; - importContext->isInternal = true; - importContext->isJSContext = true; - importContext->url = url; - importContext->setParent(context, true); - QV4::Object *qmlglobal = v4->qmlContextObject(); QV4::Script script(v4, qmlglobal, code, url.toString()); - // ### Only used for debugging info - // engine->contextWrapper()->addSubContext(qmlglobal, script, importContext); QV4::ExecutionContext *ctx = v4->current; try { script.parse(); -- 2.7.4