summaryrefslogtreecommitdiffstats
path: root/src/scxml/qscxmlecmascriptdatamodel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/scxml/qscxmlecmascriptdatamodel.cpp')
-rw-r--r--src/scxml/qscxmlecmascriptdatamodel.cpp101
1 files changed, 59 insertions, 42 deletions
diff --git a/src/scxml/qscxmlecmascriptdatamodel.cpp b/src/scxml/qscxmlecmascriptdatamodel.cpp
index 32c49f0..e517989 100644
--- a/src/scxml/qscxmlecmascriptdatamodel.cpp
+++ b/src/scxml/qscxmlecmascriptdatamodel.cpp
@@ -121,25 +121,26 @@ public:
QJSEngine *engine = assertEngine();
dataModel = engine->globalObject();
- qCDebug(qscxmlLog) << stateMachine() << "initializing the datamodel";
+ qCDebug(qscxmlLog) << m_stateMachine << "initializing the datamodel";
setupSystemVariables();
}
void setupSystemVariables()
{
setReadonlyProperty(&dataModel, QStringLiteral("_sessionid"),
- stateMachine()->sessionId());
+ m_stateMachine->sessionId());
- setReadonlyProperty(&dataModel, QStringLiteral("_name"), stateMachine()->name());
+ setReadonlyProperty(&dataModel, QStringLiteral("_name"), m_stateMachine->name());
QJSEngine *engine = assertEngine();
auto scxml = engine->newObject();
- scxml.setProperty(QStringLiteral("location"), QStringLiteral("#_scxml_%1").arg(stateMachine()->sessionId()));
+ scxml.setProperty(QStringLiteral("location"), QStringLiteral("#_scxml_%1")
+ .arg(m_stateMachine->sessionId()));
auto ioProcs = engine->newObject();
setReadonlyProperty(&ioProcs, QStringLiteral("scxml"), scxml);
setReadonlyProperty(&dataModel, QStringLiteral("_ioprocessors"), ioProcs);
- auto platformVars = QScxmlPlatformProperties::create(engine, stateMachine());
+ auto platformVars = QScxmlPlatformProperties::create(engine, m_stateMachine);
dataModel.setProperty(QStringLiteral("_x"), platformVars->jsValue());
dataModel.setProperty(QStringLiteral("In"), engine->evaluate(
@@ -204,12 +205,6 @@ public:
return engine->toScriptValue(data);
}
- QScxmlStateMachine *stateMachine() const
- {
- Q_Q(const QScxmlEcmaScriptDataModel);
- return q->stateMachine();
- }
-
QJSEngine *assertEngine()
{
if (!jsEngine) {
@@ -230,8 +225,7 @@ public:
QString string(StringId id) const
{
- Q_Q(const QScxmlEcmaScriptDataModel);
- return q->tableData()->string(id);
+ return m_stateMachine->tableData()->string(id);
}
bool hasProperty(const QString &name) const
@@ -265,7 +259,7 @@ public:
void submitError(const QString &type, const QString &msg, const QString &sendid = QString())
{
- QScxmlStateMachinePrivate::get(stateMachine())->submitError(type, msg, sendid);
+ QScxmlStateMachinePrivate::get(m_stateMachine)->submitError(type, msg, sendid);
}
public:
@@ -370,11 +364,6 @@ QScxmlEcmaScriptDataModel::QScxmlEcmaScriptDataModel(QObject *parent)
: QScxmlDataModel(*(new QScxmlEcmaScriptDataModelPrivate), parent)
{}
-/*! \internal */
-QScxmlEcmaScriptDataModel::~QScxmlEcmaScriptDataModel()
-{
-}
-
/*!
\reimp
*/
@@ -386,7 +375,7 @@ bool QScxmlEcmaScriptDataModel::setup(const QVariantMap &initialDataValues)
bool ok = true;
QJSValue undefined(QJSValue::UndefinedValue); // See B.2.1, and test456.
int count;
- StringId *names = tableData()->dataNames(&count);
+ StringId *names = d->m_stateMachine->tableData()->dataNames(&count);
for (int i = 0; i < count; ++i) {
auto name = d->string(names[i]);
QJSValue v = undefined;
@@ -404,44 +393,64 @@ bool QScxmlEcmaScriptDataModel::setup(const QVariantMap &initialDataValues)
return ok;
}
-QString QScxmlEcmaScriptDataModel::evaluateToString(EvaluatorId id, bool *ok)
+/*!
+ \reimp
+ */
+QString QScxmlEcmaScriptDataModel::evaluateToString(QScxmlExecutableContent::EvaluatorId id,
+ bool *ok)
{
Q_D(QScxmlEcmaScriptDataModel);
- const EvaluatorInfo &info = tableData()->evaluatorInfo(id);
+ const EvaluatorInfo &info = d->m_stateMachine->tableData()->evaluatorInfo(id);
return d->evalStr(d->string(info.expr), d->string(info.context), ok);
}
-bool QScxmlEcmaScriptDataModel::evaluateToBool(EvaluatorId id, bool *ok)
+/*!
+ \reimp
+ */
+bool QScxmlEcmaScriptDataModel::evaluateToBool(QScxmlExecutableContent::EvaluatorId id,
+ bool *ok)
{
Q_D(QScxmlEcmaScriptDataModel);
- const EvaluatorInfo &info = tableData()->evaluatorInfo(id);
+ const EvaluatorInfo &info = d->m_stateMachine->tableData()->evaluatorInfo(id);
return d->evalBool(d->string(info.expr), d->string(info.context), ok);
}
-QVariant QScxmlEcmaScriptDataModel::evaluateToVariant(EvaluatorId id, bool *ok)
+/*!
+ \reimp
+ */
+QVariant QScxmlEcmaScriptDataModel::evaluateToVariant(QScxmlExecutableContent::EvaluatorId id,
+ bool *ok)
{
Q_D(QScxmlEcmaScriptDataModel);
- const EvaluatorInfo &info = tableData()->evaluatorInfo(id);
+ const EvaluatorInfo &info = d->m_stateMachine->tableData()->evaluatorInfo(id);
return d->evalJSValue(d->string(info.expr), d->string(info.context), ok).toVariant();
}
-void QScxmlEcmaScriptDataModel::evaluateToVoid(EvaluatorId id, bool *ok)
+/*!
+ \reimp
+ */
+void QScxmlEcmaScriptDataModel::evaluateToVoid(QScxmlExecutableContent::EvaluatorId id,
+ bool *ok)
{
Q_D(QScxmlEcmaScriptDataModel);
- const EvaluatorInfo &info = tableData()->evaluatorInfo(id);
+ const EvaluatorInfo &info = d->m_stateMachine->tableData()->evaluatorInfo(id);
d->eval(d->string(info.expr), d->string(info.context), ok);
}
-void QScxmlEcmaScriptDataModel::evaluateAssignment(EvaluatorId id, bool *ok)
+/*!
+ \reimp
+ */
+void QScxmlEcmaScriptDataModel::evaluateAssignment(QScxmlExecutableContent::EvaluatorId id,
+ bool *ok)
{
Q_D(QScxmlEcmaScriptDataModel);
Q_ASSERT(ok);
- const AssignmentInfo &info = tableData()->assignmentInfo(id);
+ const AssignmentInfo &info = d->m_stateMachine->tableData()->assignmentInfo(id);
QString dest = d->string(info.dest);
@@ -456,10 +465,14 @@ void QScxmlEcmaScriptDataModel::evaluateAssignment(EvaluatorId id, bool *ok)
}
}
-void QScxmlEcmaScriptDataModel::evaluateInitialization(EvaluatorId id, bool *ok)
+/*!
+ \reimp
+ */
+void QScxmlEcmaScriptDataModel::evaluateInitialization(QScxmlExecutableContent::EvaluatorId id,
+ bool *ok)
{
Q_D(QScxmlEcmaScriptDataModel);
- const AssignmentInfo &info = tableData()->assignmentInfo(id);
+ const AssignmentInfo &info = d->m_stateMachine->tableData()->assignmentInfo(id);
QString dest = d->string(info.dest);
if (d->initialDataNames.contains(dest)) {
*ok = true; // silently ignore the <data> tag
@@ -469,18 +482,22 @@ void QScxmlEcmaScriptDataModel::evaluateInitialization(EvaluatorId id, bool *ok)
evaluateAssignment(id, ok);
}
-bool QScxmlEcmaScriptDataModel::evaluateForeach(EvaluatorId id, bool *ok, ForeachLoopBody *body)
+/*!
+ \reimp
+ */
+void QScxmlEcmaScriptDataModel::evaluateForeach(QScxmlExecutableContent::EvaluatorId id, bool *ok,
+ ForeachLoopBody *body)
{
Q_D(QScxmlEcmaScriptDataModel);
Q_ASSERT(ok);
Q_ASSERT(body);
- const ForeachInfo &info = tableData()->foreachInfo(id);
+ const ForeachInfo &info = d->m_stateMachine->tableData()->foreachInfo(id);
QJSValue jsArray = d->property(d->string(info.array));
if (!jsArray.isArray()) {
d->submitError(QStringLiteral("error.execution"), QStringLiteral("invalid array '%1' in %2").arg(d->string(info.array), d->string(info.context)));
*ok = false;
- return false;
+ return;
}
QString item = d->string(info.item);
@@ -490,7 +507,7 @@ bool QScxmlEcmaScriptDataModel::evaluateForeach(EvaluatorId id, bool *ok, Foreac
d->submitError(QStringLiteral("error.execution"), QStringLiteral("invalid item '%1' in %2")
.arg(d->string(info.item), d->string(info.context)));
*ok = false;
- return false;
+ return;
}
const int length = jsArray.property(QStringLiteral("length")).toInt();
@@ -502,17 +519,17 @@ bool QScxmlEcmaScriptDataModel::evaluateForeach(EvaluatorId id, bool *ok, Foreac
QJSValue currentItem = jsArray.property(static_cast<quint32>(currentIndex));
*ok = d->setProperty(item, currentItem, context);
if (!*ok)
- return false;
+ return;
if (hasIndex) {
*ok = d->setProperty(idx, currentIndex, context);
if (!*ok)
- return false;
+ return;
}
- if (!body->run())
- return false;
+ body->run(ok);
+ if (!*ok)
+ return;
}
-
- return true;
+ *ok = true;
}
/*!