aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/compiler/qv4isel_p.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml/compiler/qv4isel_p.cpp')
-rw-r--r--src/qml/compiler/qv4isel_p.cpp119
1 files changed, 61 insertions, 58 deletions
diff --git a/src/qml/compiler/qv4isel_p.cpp b/src/qml/compiler/qv4isel_p.cpp
index 429688090c..2acf97f8c2 100644
--- a/src/qml/compiler/qv4isel_p.cpp
+++ b/src/qml/compiler/qv4isel_p.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the QtQml module of the Qt Toolkit.
@@ -93,54 +93,54 @@ QV4::CompiledData::CompilationUnit *EvalInstructionSelection::compile(bool gener
void IRDecoder::visitMove(IR::Move *s)
{
if (IR::Name *n = s->target->asName()) {
- if (s->source->asTemp() || s->source->asConst()) {
+ if (s->source->asTemp() || s->source->asConst() || s->source->asArgLocal()) {
setActivationProperty(s->source, *n->id);
return;
}
- } else if (IR::Temp *t = s->target->asTemp()) {
+ } else if (s->target->asTemp() || s->target->asArgLocal()) {
if (IR::Name *n = s->source->asName()) {
if (n->id && *n->id == QStringLiteral("this")) // TODO: `this' should be a builtin.
- loadThisObject(t);
+ loadThisObject(s->target);
else if (n->builtin == IR::Name::builtin_qml_id_array)
- loadQmlIdArray(t);
+ loadQmlIdArray(s->target);
else if (n->builtin == IR::Name::builtin_qml_context_object)
- loadQmlContextObject(t);
+ loadQmlContextObject(s->target);
else if (n->builtin == IR::Name::builtin_qml_scope_object)
- loadQmlScopeObject(t);
+ loadQmlScopeObject(s->target);
else if (n->builtin == IR::Name::builtin_qml_imported_scripts_object)
- loadQmlImportedScripts(t);
+ loadQmlImportedScripts(s->target);
else if (n->qmlSingleton)
- loadQmlSingleton(*n->id, t);
+ loadQmlSingleton(*n->id, s->target);
else
- getActivationProperty(n, t);
+ getActivationProperty(n, s->target);
return;
} else if (IR::Const *c = s->source->asConst()) {
- loadConst(c, t);
+ loadConst(c, s->target);
return;
- } else if (IR::Temp *t2 = s->source->asTemp()) {
+ } else if (s->source->asTemp() || s->source->asArgLocal()) {
if (s->swap)
- swapValues(t2, t);
+ swapValues(s->source, s->target);
else
- copyValue(t2, t);
+ copyValue(s->source, s->target);
return;
} else if (IR::String *str = s->source->asString()) {
- loadString(*str->value, t);
+ loadString(*str->value, s->target);
return;
} else if (IR::RegExp *re = s->source->asRegExp()) {
- loadRegexp(re, t);
+ loadRegexp(re, s->target);
return;
} else if (IR::Closure *clos = s->source->asClosure()) {
- initClosure(clos, t);
+ initClosure(clos, s->target);
return;
} else if (IR::New *ctor = s->source->asNew()) {
if (Name *func = ctor->base->asName()) {
- constructActivationProperty(func, ctor->args, t);
+ constructActivationProperty(func, ctor->args, s->target);
return;
} else if (IR::Member *member = ctor->base->asMember()) {
- constructProperty(member->base->asTemp(), *member->name, ctor->args, t);
+ constructProperty(member->base, *member->name, ctor->args, s->target);
return;
- } else if (IR::Temp *value = ctor->base->asTemp()) {
- constructValue(value, ctor->args, t);
+ } else if (ctor->base->asTemp() || ctor->base->asArgLocal()) {
+ constructValue(ctor->base, ctor->args, s->target);
return;
}
} else if (IR::Member *m = s->source->asMember()) {
@@ -152,6 +152,7 @@ void IRDecoder::visitMove(IR::Move *s)
Q_ASSERT(m->kind != IR::Member::MemberOfEnum);
const int attachedPropertiesId = m->attachedPropertiesIdOrEnumValue;
+ const bool isSingletonProperty = m->kind == IR::Member::MemberOfSingletonObject;
if (_function && attachedPropertiesId == 0 && !m->property->isConstant()) {
if (m->kind == IR::Member::MemberOfQmlContextObject) {
@@ -162,46 +163,44 @@ void IRDecoder::visitMove(IR::Move *s)
captureRequired = false;
}
}
- getQObjectProperty(m->base, m->property->coreIndex, captureRequired, attachedPropertiesId, t);
+ getQObjectProperty(m->base, m->property->coreIndex, captureRequired, isSingletonProperty, attachedPropertiesId, s->target);
#endif // V4_BOOTSTRAP
return;
- } else if (m->base->asTemp() || m->base->asConst()) {
- getProperty(m->base, *m->name, t);
+ } else if (m->base->asTemp() || m->base->asConst() || m->base->asArgLocal()) {
+ getProperty(m->base, *m->name, s->target);
return;
}
} else if (IR::Subscript *ss = s->source->asSubscript()) {
- getElement(ss->base, ss->index, t);
+ getElement(ss->base, ss->index, s->target);
return;
} else if (IR::Unop *u = s->source->asUnop()) {
- if (IR::Temp *e = u->expr->asTemp()) {
- unop(u->op, e, t);
- return;
- }
+ unop(u->op, u->expr, s->target);
+ return;
} else if (IR::Binop *b = s->source->asBinop()) {
- binop(b->op, b->left, b->right, t);
+ binop(b->op, b->left, b->right, s->target);
return;
} else if (IR::Call *c = s->source->asCall()) {
if (c->base->asName()) {
- callBuiltin(c, t);
+ callBuiltin(c, s->target);
return;
} else if (Member *member = c->base->asMember()) {
- callProperty(member->base, *member->name, c->args, t);
+ callProperty(member->base, *member->name, c->args, s->target);
return;
} else if (Subscript *ss = c->base->asSubscript()) {
- callSubscript(ss->base, ss->index, c->args, t);
+ callSubscript(ss->base, ss->index, c->args, s->target);
return;
- } else if (IR::Temp *value = c->base->asTemp()) {
- callValue(value, c->args, t);
+ } else if (c->base->asTemp() || c->base->asArgLocal()) {
+ callValue(c->base, c->args, s->target);
return;
}
} else if (IR::Convert *c = s->source->asConvert()) {
- Q_ASSERT(c->expr->asTemp());
- convertType(c->expr->asTemp(), t);
+ Q_ASSERT(c->expr->asTemp() || c->expr->asArgLocal());
+ convertType(c->expr, s->target);
return;
}
} else if (IR::Member *m = s->target->asMember()) {
- if (m->base->asTemp() || m->base->asConst()) {
- if (s->source->asTemp() || s->source->asConst()) {
+ if (m->base->asTemp() || m->base->asConst() || m->base->asArgLocal()) {
+ if (s->source->asTemp() || s->source->asConst() || s->source->asArgLocal()) {
Q_ASSERT(m->kind != IR::Member::MemberOfEnum);
const int attachedPropertiesId = m->attachedPropertiesIdOrEnumValue;
if (m->property && attachedPropertiesId == 0) {
@@ -218,7 +217,7 @@ void IRDecoder::visitMove(IR::Move *s)
}
}
} else if (IR::Subscript *ss = s->target->asSubscript()) {
- if (s->source->asTemp() || s->source->asConst()) {
+ if (s->source->asTemp() || s->source->asConst() || s->source->asArgLocal()) {
setElement(s->source, ss->base, ss->index);
return;
}
@@ -226,7 +225,7 @@ void IRDecoder::visitMove(IR::Move *s)
// For anything else...:
Q_UNIMPLEMENTED();
- s->dump(qout, IR::Stmt::MIR);
+ IRPrinter(&qout).print(s);
qout << endl;
Q_ASSERT(!"TODO");
}
@@ -241,22 +240,22 @@ void IRDecoder::visitExp(IR::Exp *s)
// These are calls where the result is ignored.
if (c->base->asName()) {
callBuiltin(c, 0);
- } else if (Temp *value = c->base->asTemp()) {
- callValue(value, c->args, 0);
+ } else if (c->base->asTemp() || c->base->asArgLocal() || c->base->asConst()) {
+ callValue(c->base, c->args, 0);
} else if (Member *member = c->base->asMember()) {
- Q_ASSERT(member->base->asTemp());
- callProperty(member->base->asTemp(), *member->name, c->args, 0);
+ Q_ASSERT(member->base->asTemp() || member->base->asArgLocal());
+ callProperty(member->base, *member->name, c->args, 0);
} else if (Subscript *s = c->base->asSubscript()) {
callSubscript(s->base, s->index, c->args, 0);
} else {
- Q_UNIMPLEMENTED();
+ Q_UNREACHABLE();
}
} else {
- Q_UNIMPLEMENTED();
+ Q_UNREACHABLE();
}
}
-void IRDecoder::callBuiltin(IR::Call *call, IR::Temp *result)
+void IRDecoder::callBuiltin(IR::Call *call, Expr *result)
{
IR::Name *baseName = call->base->asName();
Q_ASSERT(baseName != 0);
@@ -276,7 +275,9 @@ void IRDecoder::callBuiltin(IR::Call *call, IR::Temp *result)
} else if (IR::Name *n = call->args->expr->asName()) {
callBuiltinTypeofName(*n->id, result);
return;
- } else if (call->args->expr->asTemp() || call->args->expr->asConst()){
+ } else if (call->args->expr->asTemp() ||
+ call->args->expr->asConst() ||
+ call->args->expr->asArgLocal()) {
callBuiltinTypeofValue(call->args->expr, result);
return;
}
@@ -284,15 +285,16 @@ void IRDecoder::callBuiltin(IR::Call *call, IR::Temp *result)
case IR::Name::builtin_delete: {
if (IR::Member *m = call->args->expr->asMember()) {
- callBuiltinDeleteMember(m->base->asTemp(), *m->name, result);
+ callBuiltinDeleteMember(m->base, *m->name, result);
return;
} else if (IR::Subscript *ss = call->args->expr->asSubscript()) {
- callBuiltinDeleteSubscript(ss->base->asTemp(), ss->index, result);
+ callBuiltinDeleteSubscript(ss->base, ss->index, result);
return;
} else if (IR::Name *n = call->args->expr->asName()) {
callBuiltinDeleteName(*n->id, result);
return;
- } else if (call->args->expr->asTemp()){
+ } else if (call->args->expr->asTemp() ||
+ call->args->expr->asArgLocal()) {
// TODO: should throw in strict mode
callBuiltinDeleteValue(result);
return;
@@ -301,7 +303,7 @@ void IRDecoder::callBuiltin(IR::Call *call, IR::Temp *result)
case IR::Name::builtin_throw: {
IR::Expr *arg = call->args->expr;
- Q_ASSERT(arg->asTemp() || arg->asConst());
+ Q_ASSERT(arg->asTemp() || arg->asConst() || arg->asArgLocal());
callBuiltinThrow(arg);
} return;
@@ -326,14 +328,15 @@ void IRDecoder::callBuiltin(IR::Call *call, IR::Temp *result)
} return;
case IR::Name::builtin_foreach_next_property_name: {
- IR::Temp *arg = call->args->expr->asTemp();
+ IR::Expr *arg = call->args->expr;
Q_ASSERT(arg != 0);
callBuiltinForeachNextPropertyname(arg, result);
} return;
case IR::Name::builtin_push_with_scope: {
- IR::Temp *arg = call->args->expr->asTemp();
- Q_ASSERT(arg != 0);
- callBuiltinPushWithScope(arg);
+ if (call->args->expr->asTemp() || call->args->expr->asArgLocal())
+ callBuiltinPushWithScope(call->args->expr);
+ else
+ Q_UNIMPLEMENTED();
} return;
case IR::Name::builtin_pop_scope:
@@ -402,7 +405,7 @@ void IRDecoder::callBuiltin(IR::Call *call, IR::Temp *result)
}
Q_UNIMPLEMENTED();
- call->dump(qout); qout << endl;
+ IRPrinter(&qout).print(call); qout << endl;
Q_ASSERT(!"TODO!");
Q_UNREACHABLE();
}