diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2013-10-28 17:02:54 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-10-31 18:55:14 +0100 |
commit | f0ad3a5943804e9eb8e03434a4584eaafa5c5aea (patch) | |
tree | 8d2cb4402d63ced4e89c6c610fc839e0260d8e92 /src/qml/compiler/qv4jsir.cpp | |
parent | b0afac3daf1cbb9daacbeac0183ef6254de6cc95 (diff) |
Implement loading of resolved imported scripts
We can resolve the use of names that refer to imported scripts at compile
time and load them at run-time by index through context->importedScripts.
Change-Id: I681b19e7d68dbf3b9a68af00b4cea2a9254c2d78
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/qml/compiler/qv4jsir.cpp')
-rw-r--r-- | src/qml/compiler/qv4jsir.cpp | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/src/qml/compiler/qv4jsir.cpp b/src/qml/compiler/qv4jsir.cpp index a3654a1bea..2e80fc1f31 100644 --- a/src/qml/compiler/qv4jsir.cpp +++ b/src/qml/compiler/qv4jsir.cpp @@ -424,6 +424,8 @@ static const char *builtin_to_string(Name::Builtin b) return "builtin_setup_argument_object"; case V4IR::Name::builtin_qml_id_scope: return "builtin_qml_id_scope"; + case V4IR::Name::builtin_qml_imported_scripts_scope: + return "builtin_qml_imported_scripts_scope"; case V4IR::Name::builtin_qml_scope_object: return "builtin_qml_scope_object"; case V4IR::Name::builtin_qml_context_object: @@ -826,11 +828,10 @@ Expr *BasicBlock::MEMBER(Expr *base, const QString *name) return e; } -Expr *BasicBlock::QML_CONTEXT_ID_MEMBER(Expr *base, const QString *id, int objectId) +Expr *BasicBlock::QML_CONTEXT_MEMBER(Expr *base, const QString *id, int memberIndex) { Member*e = function->New<Member>(); - Q_ASSERT(base->asName() && base->asName()->builtin == Name::builtin_qml_id_scope); - e->initQmlIdObject(base, id, objectId); + e->initQmlContextMember(base, id, memberIndex); return e; } @@ -1029,8 +1030,8 @@ void CloneExpr::visitMember(Member *e) { if (e->type == Member::MemberByName) cloned = block->MEMBER(clone(e->base), e->name); - else if (e->type == Member::MemberByObjectId) - cloned = block->QML_CONTEXT_ID_MEMBER(clone(e->base), e->name, e->objectId); + else if (e->type == Member::MemberOfQmlContext) + cloned = block->QML_CONTEXT_MEMBER(clone(e->base), e->name, e->memberIndex); else if (e->type == Member::MemberOfQObject) cloned = block->QML_QOBJECT_PROPERTY(clone(e->base), e->name, e->property); else @@ -1039,9 +1040,12 @@ void CloneExpr::visitMember(Member *e) void QmlDependenciesCollector::visitMember(Member *e) { e->base->accept(this); - if (e->type == Member::MemberByObjectId) - _usedIdObjects.insert(e->objectId); - else if (e->type == Member::MemberOfQObject + if (e->type == Member::MemberOfQmlContext) { + V4IR::Name *base = e->base->asName(); + Q_ASSERT(base); + if (base->builtin == V4IR::Name::builtin_qml_id_scope) + _usedIdObjects.insert(e->memberIndex); + } else if (e->type == Member::MemberOfQObject && !e->property->isFunction()) { // only non-functions have notifyIndex if (Name *base = e->base->asName()) { |