aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml')
-rw-r--r--src/qml/animations/qabstractanimationjob.cpp15
-rw-r--r--src/qml/qml/qqmlcomponent_p.h2
-rw-r--r--src/qml/qml/qqmlmetatype_p.h1
-rw-r--r--src/qml/qml/v4/qv4bindings.cpp38
-rw-r--r--src/qml/qml/v4/qv4compiler.cpp46
-rw-r--r--src/qml/qml/v4/qv4instruction.cpp12
-rw-r--r--src/qml/qml/v4/qv4instruction_p.h4
-rw-r--r--src/qml/qml/v4/qv4ir.cpp12
-rw-r--r--src/qml/qml/v4/qv4ir_p.h4
-rw-r--r--src/qml/qml/v4/qv4irbuilder.cpp7
10 files changed, 130 insertions, 11 deletions
diff --git a/src/qml/animations/qabstractanimationjob.cpp b/src/qml/animations/qabstractanimationjob.cpp
index 2bfc66fea0..a540382847 100644
--- a/src/qml/animations/qabstractanimationjob.cpp
+++ b/src/qml/animations/qabstractanimationjob.cpp
@@ -499,8 +499,9 @@ void QAbstractAnimationJob::finished()
//TODO: update this code so it is valid to delete the animation in animationFinished
for (int i = 0; i < changeListeners.count(); ++i) {
const QAbstractAnimationJob::ChangeListener &change = changeListeners.at(i);
- if (change.types & QAbstractAnimationJob::Completion)
- change.listener->animationFinished(this);
+ if (change.types & QAbstractAnimationJob::Completion) {
+ RETURN_IF_DELETED(change.listener->animationFinished(this));
+ }
}
if (m_group && (duration() == -1 || loopCount() < 0)) {
@@ -513,8 +514,9 @@ void QAbstractAnimationJob::stateChanged(QAbstractAnimationJob::State newState,
{
for (int i = 0; i < changeListeners.count(); ++i) {
const QAbstractAnimationJob::ChangeListener &change = changeListeners.at(i);
- if (change.types & QAbstractAnimationJob::StateChange)
- change.listener->animationStateChanged(this, newState, oldState);
+ if (change.types & QAbstractAnimationJob::StateChange) {
+ RETURN_IF_DELETED(change.listener->animationStateChanged(this, newState, oldState));
+ }
}
}
@@ -523,8 +525,9 @@ void QAbstractAnimationJob::currentLoopChanged(int currentLoop)
Q_UNUSED(currentLoop);
for (int i = 0; i < changeListeners.count(); ++i) {
const QAbstractAnimationJob::ChangeListener &change = changeListeners.at(i);
- if (change.types & QAbstractAnimationJob::CurrentLoop)
- change.listener->animationCurrentLoopChanged(this);
+ if (change.types & QAbstractAnimationJob::CurrentLoop) {
+ RETURN_IF_DELETED(change.listener->animationCurrentLoopChanged(this));
+ }
}
}
diff --git a/src/qml/qml/qqmlcomponent_p.h b/src/qml/qml/qqmlcomponent_p.h
index b03dd68936..dda5bd0b71 100644
--- a/src/qml/qml/qqmlcomponent_p.h
+++ b/src/qml/qml/qqmlcomponent_p.h
@@ -62,7 +62,7 @@
#include "qqmlvme_p.h"
#include "qqmlerror.h"
#include "qqml.h"
-#include "../debugger/qqmlprofilerservice_p.h"
+#include <private/qqmlprofilerservice_p.h>
#include <QtCore/QString>
#include <QtCore/QStringList>
diff --git a/src/qml/qml/qqmlmetatype_p.h b/src/qml/qml/qqmlmetatype_p.h
index ad6a2aa055..b715d0c8f2 100644
--- a/src/qml/qml/qqmlmetatype_p.h
+++ b/src/qml/qml/qqmlmetatype_p.h
@@ -180,7 +180,6 @@ public:
int attachedPropertiesId() const;
int parserStatusCast() const;
- QVariant fromObject(QObject *) const;
const char *interfaceIId() const;
int propertyValueSourceCast() const;
int propertyValueInterceptorCast() const;
diff --git a/src/qml/qml/v4/qv4bindings.cpp b/src/qml/qml/v4/qv4bindings.cpp
index 4fd84945fc..93c7820ca2 100644
--- a/src/qml/qml/v4/qv4bindings.cpp
+++ b/src/qml/qml/v4/qv4bindings.cpp
@@ -1172,6 +1172,15 @@ void QV4Bindings::run(int instrIndex, quint32 &executedBlocks,
}
QML_V4_END_INSTR(MathCosReal, unaryop)
+ QML_V4_BEGIN_INSTR(MathAbsReal, unaryop)
+ {
+ const Register &src = registers[instr->unaryop.src];
+ Register &output = registers[instr->unaryop.output];
+ if (src.isUndefined()) output.setUndefined();
+ else output.setqreal(qAbs(src.getqreal()));
+ }
+ QML_V4_END_INSTR(MathAbsReal, unaryop)
+
QML_V4_BEGIN_INSTR(MathRoundReal, unaryop)
{
const Register &src = registers[instr->unaryop.src];
@@ -1190,6 +1199,15 @@ void QV4Bindings::run(int instrIndex, quint32 &executedBlocks,
}
QML_V4_END_INSTR(MathFloorReal, unaryop)
+ QML_V4_BEGIN_INSTR(MathCeilReal, unaryop)
+ {
+ const Register &src = registers[instr->unaryop.src];
+ Register &output = registers[instr->unaryop.output];
+ if (src.isUndefined()) output.setUndefined();
+ else output.setint(qCeil(src.getqreal()));
+ }
+ QML_V4_END_INSTR(MathCeilReal, unaryop)
+
QML_V4_BEGIN_INSTR(MathPIReal, unaryop)
{
static const qreal qmlPI = 2.0 * qAsin(1.0);
@@ -1480,6 +1498,26 @@ void QV4Bindings::run(int instrIndex, quint32 &executedBlocks,
}
QML_V4_END_INSTR(StrictNotEqualString, binaryop)
+ QML_V4_BEGIN_INSTR(MathMaxReal, binaryop)
+ {
+ const Register &left = registers[instr->binaryop.left];
+ const Register &right = registers[instr->binaryop.right];
+ Register &output = registers[instr->binaryop.output];
+ if (left.isUndefined() || right.isUndefined()) output.setUndefined();
+ else output.setqreal(qMax(left.getqreal(), right.getqreal()));
+ }
+ QML_V4_END_INSTR(MathMaxReal, binaryop)
+
+ QML_V4_BEGIN_INSTR(MathMinReal, binaryop)
+ {
+ const Register &left = registers[instr->binaryop.left];
+ const Register &right = registers[instr->binaryop.right];
+ Register &output = registers[instr->binaryop.output];
+ if (left.isUndefined() || right.isUndefined()) output.setUndefined();
+ else output.setqreal(qMin(left.getqreal(), right.getqreal()));
+ }
+ QML_V4_END_INSTR(MathMinReal, binaryop)
+
QML_V4_BEGIN_INSTR(NewString, construct)
{
Register &output = registers[instr->construct.reg];
diff --git a/src/qml/qml/v4/qv4compiler.cpp b/src/qml/qml/v4/qv4compiler.cpp
index 608368afc2..620d260053 100644
--- a/src/qml/qml/v4/qv4compiler.cpp
+++ b/src/qml/qml/v4/qv4compiler.cpp
@@ -803,6 +803,12 @@ void QV4CompilerPrivate::visitCall(IR::Call *call)
gen(i);
} return;
+ case IR::MathAbsBuiltinFunction: {
+ Instr::MathAbsReal i;
+ i.output = i.src = currentReg;
+ gen(i);
+ } return;
+
case IR::MathRoundBultinFunction: {
Instr::MathRoundReal i;
i.output = i.src = currentReg;
@@ -815,9 +821,49 @@ void QV4CompilerPrivate::visitCall(IR::Call *call)
gen(i);
} return;
+ case IR::MathCeilBuiltinFunction: {
+ Instr::MathCeilReal i;
+ i.output = i.src = currentReg;
+ gen(i);
+ } return;
+
case IR::MathPIBuiltinConstant:
+ default:
break;
} // switch
+ } else {
+ if (name->builtin == IR::MathMaxBuiltinFunction ||
+ name->builtin == IR::MathMinBuiltinFunction) {
+
+ //only handles the most common case of exactly two arguments
+ if (call->args && call->args->next && !call->args->next->next) {
+ IR::Expr *arg1 = call->args->expr;
+ IR::Expr *arg2 = call->args->next->expr;
+
+ if (arg1 != 0 && arg1->type == IR::RealType &&
+ arg2 != 0 && arg2->type == IR::RealType) {
+
+ traceExpression(arg1, currentReg);
+ traceExpression(arg2, currentReg + 1);
+
+ if (name->builtin == IR::MathMaxBuiltinFunction) {
+ Instr::MathMaxReal i;
+ i.left = currentReg;
+ i.right = currentReg + 1;
+ i.output = currentReg;
+ gen(i);
+ return;
+ } else if (name->builtin == IR::MathMinBuiltinFunction) {
+ Instr::MathMinReal i;
+ i.left = currentReg;
+ i.right = currentReg + 1;
+ i.output = currentReg;
+ gen(i);
+ return;
+ }
+ }
+ }
+ }
}
}
diff --git a/src/qml/qml/v4/qv4instruction.cpp b/src/qml/qml/v4/qv4instruction.cpp
index efbd2b2c1c..a392c9392c 100644
--- a/src/qml/qml/v4/qv4instruction.cpp
+++ b/src/qml/qml/v4/qv4instruction.cpp
@@ -195,12 +195,18 @@ void Bytecode::dump(const V4Instr *i, int address) const
case V4Instr::MathCosReal:
INSTR_DUMP << "\t" << "MathCosReal" << "\t\t" << "Input_Reg(" << i->unaryop.src << ") -> Output_Reg(" << i->unaryop.output << ")";
break;
+ case V4Instr::MathAbsReal:
+ INSTR_DUMP << "\t" << "MathAbsReal" << "\t\t" << "Input_Reg(" << i->unaryop.src << ") -> Output_Reg(" << i->unaryop.output << ")";
+ break;
case V4Instr::MathRoundReal:
INSTR_DUMP << "\t" << "MathRoundReal" << "\t\t" << "Input_Reg(" << i->unaryop.src << ") -> Output_Reg(" << i->unaryop.output << ")";
break;
case V4Instr::MathFloorReal:
INSTR_DUMP << "\t" << "MathFloorReal" << "\t\t" << "Input_Reg(" << i->unaryop.src << ") -> Output_Reg(" << i->unaryop.output << ")";
break;
+ case V4Instr::MathCeilReal:
+ INSTR_DUMP << "\t" << "MathCeilReal" << "\t\t" << "Input_Reg(" << i->unaryop.src << ") -> Output_Reg(" << i->unaryop.output << ")";
+ break;
case V4Instr::MathPIReal:
INSTR_DUMP << "\t" << "MathPIReal" << "\t\t" << "Input_Reg(" << i->unaryop.src << ") -> Output_Reg(" << i->unaryop.output << ")";
break;
@@ -306,6 +312,12 @@ void Bytecode::dump(const V4Instr *i, int address) const
case V4Instr::StrictNotEqualString:
INSTR_DUMP << "\t" << "StrictNotEqualString" << "\t" << "Input_Reg(" << i->binaryop.left << ") Input_Reg(" << i->binaryop.right << ") -> Output_Reg(" << i->binaryop.output << ")";
break;
+ case V4Instr::MathMaxReal:
+ INSTR_DUMP << "\t" << "MathMaxReal" << "\t" << "Input_Reg(" << i->binaryop.left << ") Input_Reg(" << i->binaryop.right << ") -> Output_Reg(" << i->binaryop.output << ")";
+ break;
+ case V4Instr::MathMinReal:
+ INSTR_DUMP << "\t" << "MathMinReal" << "\t" << "Input_Reg(" << i->binaryop.left << ") Input_Reg(" << i->binaryop.right << ") -> Output_Reg(" << i->binaryop.output << ")";
+ break;
case V4Instr::NewString:
INSTR_DUMP << "\t" << "NewString" << "\t\t" << "Register(" << i->construct.reg << ")";
break;
diff --git a/src/qml/qml/v4/qv4instruction_p.h b/src/qml/qml/v4/qv4instruction_p.h
index 964c95513f..9727c23959 100644
--- a/src/qml/qml/v4/qv4instruction_p.h
+++ b/src/qml/qml/v4/qv4instruction_p.h
@@ -100,8 +100,10 @@ QT_BEGIN_NAMESPACE
F(ResolveUrl, unaryop) \
F(MathSinReal, unaryop) \
F(MathCosReal, unaryop) \
+ F(MathAbsReal, unaryop) \
F(MathRoundReal, unaryop) \
F(MathFloorReal, unaryop) \
+ F(MathCeilReal, unaryop) \
F(MathPIReal, unaryop) \
F(LoadReal, real_value) \
F(LoadInt, int_value) \
@@ -137,6 +139,8 @@ QT_BEGIN_NAMESPACE
F(NotEqualString, binaryop) \
F(StrictEqualString, binaryop) \
F(StrictNotEqualString, binaryop) \
+ F(MathMaxReal, binaryop) \
+ F(MathMinReal, binaryop) \
F(NewString, construct) \
F(NewUrl, construct) \
F(CleanupRegister, cleanup) \
diff --git a/src/qml/qml/v4/qv4ir.cpp b/src/qml/qml/v4/qv4ir.cpp
index 68175d3bf4..54679c3d8c 100644
--- a/src/qml/qml/v4/qv4ir.cpp
+++ b/src/qml/qml/v4/qv4ir.cpp
@@ -219,10 +219,18 @@ void Name::init(Name *base, Type type, const QString *id, Symbol symbol, quint32
builtin = MathSinBultinFunction;
} else if (id->length() == 8 && *id == QLatin1String("Math.cos")) {
builtin = MathCosBultinFunction;
+ } else if (id->length() == 8 && *id == QLatin1String("Math.abs")) {
+ builtin = MathAbsBuiltinFunction;
} else if (id->length() == 10 && *id == QLatin1String("Math.round")) {
builtin = MathRoundBultinFunction;
} else if (id->length() == 10 && *id == QLatin1String("Math.floor")) {
builtin = MathFloorBultinFunction;
+ } else if (id->length() == 9 && *id == QLatin1String("Math.ceil")) {
+ builtin = MathCeilBuiltinFunction;
+ } else if (id->length() == 8 && *id == QLatin1String("Math.max")) {
+ builtin = MathMaxBuiltinFunction;
+ } else if (id->length() == 8 && *id == QLatin1String("Math.min")) {
+ builtin = MathMinBuiltinFunction;
} else if (id->length() == 7 && *id == QLatin1String("Math.PI")) {
builtin = MathPIBuiltinConstant;
this->type = RealType;
@@ -353,10 +361,14 @@ Type Call::typeForFunction(Expr *base)
switch (name->builtin) {
case MathSinBultinFunction:
case MathCosBultinFunction:
+ case MathAbsBuiltinFunction: //### type could also be Int if input was Int
+ case MathMaxBuiltinFunction:
+ case MathMinBuiltinFunction:
return RealType;
case MathRoundBultinFunction:
case MathFloorBultinFunction:
+ case MathCeilBuiltinFunction:
return IntType;
case NoBuiltinSymbol:
diff --git a/src/qml/qml/v4/qv4ir_p.h b/src/qml/qml/v4/qv4ir_p.h
index 3d3288b65f..79f50cd6c9 100644
--- a/src/qml/qml/v4/qv4ir_p.h
+++ b/src/qml/qml/v4/qv4ir_p.h
@@ -239,6 +239,10 @@ enum BuiltinSymbol {
MathCosBultinFunction,
MathRoundBultinFunction,
MathFloorBultinFunction,
+ MathCeilBuiltinFunction,
+ MathAbsBuiltinFunction,
+ MathMaxBuiltinFunction,
+ MathMinBuiltinFunction,
MathPIBuiltinConstant
};
diff --git a/src/qml/qml/v4/qv4irbuilder.cpp b/src/qml/qml/v4/qv4irbuilder.cpp
index 36e88e5276..06f4024423 100644
--- a/src/qml/qml/v4/qv4irbuilder.cpp
+++ b/src/qml/qml/v4/qv4irbuilder.cpp
@@ -628,7 +628,8 @@ bool QV4IRBuilder::visit(AST::FieldMemberExpression *ast)
case IR::Name::Property:
if (baseName->type == IR::ObjectType && baseName->meta && baseName->property->isFinal()) {
- QQmlPropertyCache *cache = m_engine->cache(baseName->meta);
+ const QMetaObject *meta = m_engine->metaObjectForType(baseName->property->propType);
+ QQmlPropertyCache *cache = m_engine->cache(meta);
if (!cache)
return false;
@@ -640,9 +641,9 @@ bool QV4IRBuilder::visit(AST::FieldMemberExpression *ast)
return false; // We don't know enough about this property
}
- IR::Type irType = irTypeFromVariantType(data->propType, m_engine, baseName->meta);
+ IR::Type irType = irTypeFromVariantType(data->propType, m_engine, meta);
_expr.code = _block->SYMBOL(baseName, irType, name,
- baseName->meta, data, line, column);
+ meta, data, line, column);
}
}
break;