aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/qml/compiler/qqmlirbuilder.cpp7
-rw-r--r--src/qml/compiler/qqmlirbuilder_p.h1
-rw-r--r--src/qml/compiler/qqmltypecompiler.cpp3
-rw-r--r--src/qml/compiler/qv4instr_moth_p.h6
-rw-r--r--src/qml/compiler/qv4isel_moth.cpp7
-rw-r--r--src/qml/compiler/qv4isel_moth_p.h1
-rw-r--r--src/qml/compiler/qv4isel_p.cpp2
-rw-r--r--src/qml/compiler/qv4isel_p.h1
-rw-r--r--src/qml/compiler/qv4jsir.cpp2
-rw-r--r--src/qml/compiler/qv4jsir_p.h1
-rw-r--r--src/qml/jit/qv4isel_masm.cpp5
-rw-r--r--src/qml/jit/qv4isel_masm_p.h1
-rw-r--r--src/qml/jit/qv4regalloc.cpp6
-rw-r--r--src/qml/jsruntime/qv4engine.cpp12
-rw-r--r--src/qml/jsruntime/qv4engine_p.h1
-rw-r--r--src/qml/jsruntime/qv4runtime.cpp5
-rw-r--r--src/qml/jsruntime/qv4runtime_p.h11
-rw-r--r--src/qml/jsruntime/qv4vme_moth.cpp4
18 files changed, 66 insertions, 10 deletions
diff --git a/src/qml/compiler/qqmlirbuilder.cpp b/src/qml/compiler/qqmlirbuilder.cpp
index cc9da2817a..d70b04a51a 100644
--- a/src/qml/compiler/qqmlirbuilder.cpp
+++ b/src/qml/compiler/qqmlirbuilder.cpp
@@ -1456,6 +1456,7 @@ JSCodeGen::JSCodeGen(const QString &fileName, const QString &sourceCode, QV4::IR
, _disableAcceleratedLookups(false)
, _contextObject(0)
, _scopeObject(0)
+ , _qmlContextTemp(-1)
, _contextObjectTemp(-1)
, _scopeObjectTemp(-1)
, _importedScriptsTemp(-1)
@@ -1764,13 +1765,17 @@ static void initMetaObjectResolver(QV4::IR::MemberExpressionResolver *resolver,
void JSCodeGen::beginFunctionBodyHook()
{
+ _qmlContextTemp = _block->newTemp();
_contextObjectTemp = _block->newTemp();
_scopeObjectTemp = _block->newTemp();
_importedScriptsTemp = _block->newTemp();
_idArrayTemp = _block->newTemp();
#ifndef V4_BOOTSTRAP
- QV4::IR::Temp *temp = _block->TEMP(_contextObjectTemp);
+ QV4::IR::Temp *temp = _block->TEMP(_qmlContextTemp);
+ move(temp, _block->NAME(QV4::IR::Name::builtin_qml_context, 0, 0));
+
+ temp = _block->TEMP(_contextObjectTemp);
temp->memberResolver = _function->New<QV4::IR::MemberExpressionResolver>();
initMetaObjectResolver(temp->memberResolver, _contextObject);
move(temp, _block->NAME(QV4::IR::Name::builtin_qml_context_object, 0, 0));
diff --git a/src/qml/compiler/qqmlirbuilder_p.h b/src/qml/compiler/qqmlirbuilder_p.h
index 5653cc1094..63bf677ce1 100644
--- a/src/qml/compiler/qqmlirbuilder_p.h
+++ b/src/qml/compiler/qqmlirbuilder_p.h
@@ -495,6 +495,7 @@ private:
ObjectIdMapping _idObjects;
QQmlPropertyCache *_contextObject;
QQmlPropertyCache *_scopeObject;
+ int _qmlContextTemp;
int _contextObjectTemp;
int _scopeObjectTemp;
int _importedScriptsTemp;
diff --git a/src/qml/compiler/qqmltypecompiler.cpp b/src/qml/compiler/qqmltypecompiler.cpp
index 4a20959330..9beeda0b08 100644
--- a/src/qml/compiler/qqmltypecompiler.cpp
+++ b/src/qml/compiler/qqmltypecompiler.cpp
@@ -2623,7 +2623,8 @@ void QQmlJavaScriptBindingExpressionSimplificationPass::visitMove(QV4::IR::Move
}
if (QV4::IR::Name *n = move->source->asName()) {
- if (n->builtin == QV4::IR::Name::builtin_qml_id_array
+ if (n->builtin == QV4::IR::Name::builtin_qml_context
+ || n->builtin == QV4::IR::Name::builtin_qml_id_array
|| n->builtin == QV4::IR::Name::builtin_qml_imported_scripts_object
|| n->builtin == QV4::IR::Name::builtin_qml_context_object
|| n->builtin == QV4::IR::Name::builtin_qml_scope_object) {
diff --git a/src/qml/compiler/qv4instr_moth_p.h b/src/qml/compiler/qv4instr_moth_p.h
index 5c2ad45da2..c4b4d101f9 100644
--- a/src/qml/compiler/qv4instr_moth_p.h
+++ b/src/qml/compiler/qv4instr_moth_p.h
@@ -125,6 +125,7 @@ QT_BEGIN_NAMESPACE
F(Sub, sub) \
F(BinopContext, binopContext) \
F(LoadThis, loadThis) \
+ F(LoadQmlContext, loadQmlContext) \
F(LoadQmlIdArray, loadQmlIdArray) \
F(LoadQmlImportedScripts, loadQmlImportedScripts) \
F(LoadQmlContextObject, loadQmlContextObject) \
@@ -684,6 +685,10 @@ union Instr
MOTH_INSTR_HEADER
Param result;
};
+ struct instr_loadQmlContext {
+ MOTH_INSTR_HEADER
+ Param result;
+ };
struct instr_loadQmlIdArray {
MOTH_INSTR_HEADER
Param result;
@@ -789,6 +794,7 @@ union Instr
instr_sub sub;
instr_binopContext binopContext;
instr_loadThis loadThis;
+ instr_loadQmlContext loadQmlContext;
instr_loadQmlIdArray loadQmlIdArray;
instr_loadQmlImportedScripts loadQmlImportedScripts;
instr_loadQmlContextObject loadQmlContextObject;
diff --git a/src/qml/compiler/qv4isel_moth.cpp b/src/qml/compiler/qv4isel_moth.cpp
index 59099159c1..30ec6f2d01 100644
--- a/src/qml/compiler/qv4isel_moth.cpp
+++ b/src/qml/compiler/qv4isel_moth.cpp
@@ -565,6 +565,13 @@ void InstructionSelection::loadThisObject(IR::Expr *e)
addInstruction(load);
}
+void InstructionSelection::loadQmlContext(IR::Expr *e)
+{
+ Instruction::LoadQmlContext load;
+ load.result = getResultParam(e);
+ addInstruction(load);
+}
+
void InstructionSelection::loadQmlIdArray(IR::Expr *e)
{
Instruction::LoadQmlIdArray load;
diff --git a/src/qml/compiler/qv4isel_moth_p.h b/src/qml/compiler/qv4isel_moth_p.h
index 4ea0f1d07f..bda65561d6 100644
--- a/src/qml/compiler/qv4isel_moth_p.h
+++ b/src/qml/compiler/qv4isel_moth_p.h
@@ -102,6 +102,7 @@ protected:
virtual void constructProperty(IR::Expr *base, const QString &name, IR::ExprList *args, IR::Expr *result);
virtual void constructValue(IR::Expr *value, IR::ExprList *args, IR::Expr *result);
virtual void loadThisObject(IR::Expr *e);
+ virtual void loadQmlContext(IR::Expr *e);
virtual void loadQmlIdArray(IR::Expr *e);
virtual void loadQmlImportedScripts(IR::Expr *e);
virtual void loadQmlContextObject(IR::Expr *e);
diff --git a/src/qml/compiler/qv4isel_p.cpp b/src/qml/compiler/qv4isel_p.cpp
index 46b9c784d2..36d8422cd4 100644
--- a/src/qml/compiler/qv4isel_p.cpp
+++ b/src/qml/compiler/qv4isel_p.cpp
@@ -91,6 +91,8 @@ void IRDecoder::visitMove(IR::Move *s)
if (IR::Name *n = s->source->asName()) {
if (n->id && *n->id == QStringLiteral("this")) // TODO: `this' should be a builtin.
loadThisObject(s->target);
+ else if (n->builtin == IR::Name::builtin_qml_context)
+ loadQmlContext(s->target);
else if (n->builtin == IR::Name::builtin_qml_id_array)
loadQmlIdArray(s->target);
else if (n->builtin == IR::Name::builtin_qml_context_object)
diff --git a/src/qml/compiler/qv4isel_p.h b/src/qml/compiler/qv4isel_p.h
index 1e273df93e..d1ad4c8dca 100644
--- a/src/qml/compiler/qv4isel_p.h
+++ b/src/qml/compiler/qv4isel_p.h
@@ -136,6 +136,7 @@ public: // to implement by subclasses:
virtual void constructProperty(IR::Expr *base, const QString &name, IR::ExprList *args, IR::Expr *result) = 0;
virtual void constructValue(IR::Expr *value, IR::ExprList *args, IR::Expr *result) = 0;
virtual void loadThisObject(IR::Expr *target) = 0;
+ virtual void loadQmlContext(IR::Expr *target) = 0;
virtual void loadQmlIdArray(IR::Expr *target) = 0;
virtual void loadQmlImportedScripts(IR::Expr *target) = 0;
virtual void loadQmlContextObject(IR::Expr *target) = 0;
diff --git a/src/qml/compiler/qv4jsir.cpp b/src/qml/compiler/qv4jsir.cpp
index 5c9cc98ade..e15d511fb5 100644
--- a/src/qml/compiler/qv4jsir.cpp
+++ b/src/qml/compiler/qv4jsir.cpp
@@ -341,6 +341,8 @@ const char *builtin_to_string(Name::Builtin b)
return "builtin_setup_argument_object";
case IR::Name::builtin_convert_this_to_object:
return "builtin_convert_this_to_object";
+ case IR::Name::builtin_qml_context:
+ return "builtin_qml_context";
case IR::Name::builtin_qml_id_array:
return "builtin_qml_id_array";
case IR::Name::builtin_qml_imported_scripts_object:
diff --git a/src/qml/compiler/qv4jsir_p.h b/src/qml/compiler/qv4jsir_p.h
index 8daad97e8b..391c22678e 100644
--- a/src/qml/compiler/qv4jsir_p.h
+++ b/src/qml/compiler/qv4jsir_p.h
@@ -337,6 +337,7 @@ struct Name: Expr {
builtin_define_object_literal,
builtin_setup_argument_object,
builtin_convert_this_to_object,
+ builtin_qml_context,
builtin_qml_id_array,
builtin_qml_imported_scripts_object,
builtin_qml_context_object,
diff --git a/src/qml/jit/qv4isel_masm.cpp b/src/qml/jit/qv4isel_masm.cpp
index 87a7a4a895..fd1edb0dc9 100644
--- a/src/qml/jit/qv4isel_masm.cpp
+++ b/src/qml/jit/qv4isel_masm.cpp
@@ -574,6 +574,11 @@ void InstructionSelection::loadThisObject(IR::Expr *temp)
#endif
}
+void InstructionSelection::loadQmlContext(IR::Expr *temp)
+{
+ generateFunctionCall(temp, Runtime::getQmlContext, Assembler::EngineRegister);
+}
+
void InstructionSelection::loadQmlIdArray(IR::Expr *temp)
{
generateFunctionCall(temp, Runtime::getQmlIdArray, Assembler::EngineRegister);
diff --git a/src/qml/jit/qv4isel_masm_p.h b/src/qml/jit/qv4isel_masm_p.h
index 87b4a20bfc..072e867dd7 100644
--- a/src/qml/jit/qv4isel_masm_p.h
+++ b/src/qml/jit/qv4isel_masm_p.h
@@ -95,6 +95,7 @@ protected:
virtual void callSubscript(IR::Expr *base, IR::Expr *index, IR::ExprList *args, IR::Expr *result);
virtual void convertType(IR::Expr *source, IR::Expr *target);
virtual void loadThisObject(IR::Expr *temp);
+ virtual void loadQmlContext(IR::Expr *target);
virtual void loadQmlIdArray(IR::Expr *target);
virtual void loadQmlImportedScripts(IR::Expr *target);
virtual void loadQmlContextObject(IR::Expr *target);
diff --git a/src/qml/jit/qv4regalloc.cpp b/src/qml/jit/qv4regalloc.cpp
index 48b7badd56..90076945fc 100644
--- a/src/qml/jit/qv4regalloc.cpp
+++ b/src/qml/jit/qv4regalloc.cpp
@@ -421,6 +421,12 @@ protected: // IRDecoder
addDef(temp);
}
+ virtual void loadQmlContext(IR::Expr *temp)
+ {
+ addDef(temp);
+ addCall();
+ }
+
virtual void loadQmlIdArray(IR::Expr *temp)
{
addDef(temp);
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp
index 016187f488..a55755c6d1 100644
--- a/src/qml/jsruntime/qv4engine.cpp
+++ b/src/qml/jsruntime/qv4engine.cpp
@@ -720,7 +720,7 @@ Heap::Object *ExecutionEngine::newForEachIteratorObject(Object *o)
return obj->d();
}
-Heap::QmlContextWrapper *ExecutionEngine::qmlContextObject() const
+Heap::QmlContext *ExecutionEngine::qmlContext() const
{
Heap::ExecutionContext *ctx = currentContext();
@@ -737,8 +737,14 @@ Heap::QmlContextWrapper *ExecutionEngine::qmlContextObject() const
if (ctx->type != Heap::ExecutionContext::Type_QmlContext)
return 0;
- Q_ASSERT(static_cast<Heap::QmlContext *>(ctx)->qml);
- return static_cast<Heap::QmlContext *>(ctx)->qml;
+ return static_cast<Heap::QmlContext *>(ctx);
+}
+
+Heap::QmlContextWrapper *ExecutionEngine::qmlContextObject() const
+{
+ Heap::QmlContext *ctx = qmlContext();
+ Q_ASSERT(ctx->qml);
+ return ctx->qml;
}
QObject *ExecutionEngine::qmlScopeObject() const
diff --git a/src/qml/jsruntime/qv4engine_p.h b/src/qml/jsruntime/qv4engine_p.h
index 7643e1fa66..9f44745e4c 100644
--- a/src/qml/jsruntime/qv4engine_p.h
+++ b/src/qml/jsruntime/qv4engine_p.h
@@ -387,6 +387,7 @@ public:
Heap::Object *newForEachIteratorObject(Object *o);
+ Heap::QmlContext *qmlContext() const;
QV4::Heap::QmlContextWrapper *qmlContextObject() const;
QObject *qmlScopeObject() const;
QQmlContextData *callingQmlContext() const;
diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp
index 059df275db..923909435f 100644
--- a/src/qml/jsruntime/qv4runtime.cpp
+++ b/src/qml/jsruntime/qv4runtime.cpp
@@ -1325,6 +1325,11 @@ unsigned Runtime::doubleToUInt(const double &d)
return Primitive::toUInt32(d);
}
+ReturnedValue Runtime::getQmlContext(NoThrowEngine *engine)
+{
+ return engine->qmlContext()->asReturnedValue();
+}
+
#ifndef V4_BOOTSTRAP
ReturnedValue Runtime::regexpLiteral(ExecutionEngine *engine, int id)
diff --git a/src/qml/jsruntime/qv4runtime_p.h b/src/qml/jsruntime/qv4runtime_p.h
index c2a0b5ec48..109caebd3a 100644
--- a/src/qml/jsruntime/qv4runtime_p.h
+++ b/src/qml/jsruntime/qv4runtime_p.h
@@ -207,11 +207,12 @@ struct Q_QML_PRIVATE_EXPORT Runtime {
static unsigned doubleToUInt(const double &d);
// qml
- static ReturnedValue getQmlIdArray(NoThrowEngine *ctx);
- static ReturnedValue getQmlImportedScripts(NoThrowEngine *ctx);
- static ReturnedValue getQmlContextObject(NoThrowEngine *ctx);
- static ReturnedValue getQmlScopeObject(NoThrowEngine *ctx);
- static ReturnedValue getQmlSingleton(NoThrowEngine *ctx, int nameIndex);
+ static ReturnedValue getQmlContext(NoThrowEngine *engine);
+ static ReturnedValue getQmlIdArray(NoThrowEngine *engine);
+ static ReturnedValue getQmlImportedScripts(NoThrowEngine *engine);
+ static ReturnedValue getQmlContextObject(NoThrowEngine *engine);
+ static ReturnedValue getQmlScopeObject(NoThrowEngine *engine);
+ static ReturnedValue getQmlSingleton(NoThrowEngine *engine, int nameIndex);
static ReturnedValue getQmlAttachedProperty(ExecutionEngine *engine, int attachedPropertiesId, int propertyIndex);
static ReturnedValue getQmlQObjectProperty(ExecutionEngine *engine, const Value &object, int propertyIndex, bool captureRequired);
static ReturnedValue getQmlSingletonQObjectProperty(ExecutionEngine *engine, const Value &object, int propertyIndex, bool captureRequired);
diff --git a/src/qml/jsruntime/qv4vme_moth.cpp b/src/qml/jsruntime/qv4vme_moth.cpp
index 761e377f75..e7b2a18e70 100644
--- a/src/qml/jsruntime/qv4vme_moth.cpp
+++ b/src/qml/jsruntime/qv4vme_moth.cpp
@@ -865,6 +865,10 @@ QV4::ReturnedValue VME::run(ExecutionEngine *engine, const uchar *code
VALUE(instr.result) = context->thisObject();
MOTH_END_INSTR(LoadThis)
+ MOTH_BEGIN_INSTR(LoadQmlContext)
+ VALUE(instr.result) = Runtime::getQmlContext(static_cast<QV4::NoThrowEngine*>(engine));
+ MOTH_END_INSTR(LoadQmlContext)
+
MOTH_BEGIN_INSTR(LoadQmlIdArray)
VALUE(instr.result) = Runtime::getQmlIdArray(static_cast<QV4::NoThrowEngine*>(engine));
MOTH_END_INSTR(LoadQmlIdArray)