QVariant QDeclarativeExpressionPrivate::value(QObject *secondaryScope, bool *isUndefined) { Q_Q(QDeclarativeExpression); QVariant rv; if (!q->engine()) { qWarning("QDeclarativeExpression: Attempted to evaluate an expression in an invalid context"); return rv; } if (data->expression.isEmpty()) return rv; QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(q->engine()); QDeclarativeExpression *lastCurrentExpression = ep->currentExpression; bool lastCaptureProperties = ep->captureProperties; QPODVector<QDeclarativeEnginePrivate::CapturedProperty> lastCapturedProperties; ep->capturedProperties.copyAndClear(lastCapturedProperties); ep->currentExpression = q; ep->captureProperties = data->trackChange; // This object might be deleted during the eval QDeclarativeExpressionData *localData = data; localData->addref(); rv = evalQtScript(secondaryScope, isUndefined); ep->currentExpression = lastCurrentExpression; ep->captureProperties = lastCaptureProperties; // Check if we were deleted if (localData->q) { if ((!data->trackChange || !ep->capturedProperties.count()) && data->guardList) { clearGuards(); } else if(data->trackChange) { updateGuards(ep->capturedProperties); } } localData->release(); lastCapturedProperties.copyAndClear(ep->capturedProperties); return rv; }
/** * @brief Implementation of internal transition DEVS * function */ void internalTransition(vd::Time t) override { processOut(t, INTERNAL); updateGuards(t, INTERNAL); switch (devs_state) { case INIT: devs_state = COMPUTE; break; case COMPUTE: devs_state = OUTPUT; break; case OUTPUT: devs_state = COMPUTE; break; default: throw vu::InternalError("default 2"); } processIn(t, INTERNAL); }
void confluentTransitions(vd::Time t, const vd::ExternalEventList& ext) override { processOut(t, CONFLUENT); handleExtEvt(t, ext); updateGuards(t, CONFLUENT); switch (devs_state) { case INIT: devs_state = COMPUTE; break; case COMPUTE: devs_state=OUTPUT; break; case OUTPUT: devs_state = COMPUTE; break; default: throw vu::InternalError("default confluent"); } processIn(t, CONFLUENT); }
void externalTransition(const vd::ExternalEventList& event, vd::Time t) override { processOut(t, EXTERNAL); handleExtEvt(t, event); updateGuards(t, EXTERNAL); switch (devs_state) { case INIT: throw vu::InternalError("Error 3"); break; case COMPUTE: devs_state = COMPUTE; break; case OUTPUT: throw vu::InternalError("Error 4"); break; default: throw vu::InternalError("default"); } processIn(t, EXTERNAL); }
QScriptValue QDeclarativeQtScriptExpression::scriptValue(QObject *secondaryScope, bool *isUndefined) { Q_ASSERT(context() && context()->engine); Q_ASSERT(!trackChange || (guardObject && guardObjectNotifyIndex != -1)); if (!expressionFunction.isValid()) { if (isUndefined) *isUndefined = true; return QScriptValue(); } DeleteWatcher watcher(this); QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(context()->engine); bool lastCaptureProperties = ep->captureProperties; QPODVector<QDeclarativeEnginePrivate::CapturedProperty> lastCapturedProperties; ep->captureProperties = trackChange; ep->capturedProperties.copyAndClear(lastCapturedProperties); QScriptValue value = eval(secondaryScope, isUndefined); if (!watcher.wasDeleted() && trackChange) { if (ep->capturedProperties.count() == 0) { if (guardList) clearGuards(); } else { updateGuards(ep->capturedProperties); } } lastCapturedProperties.copyAndClear(ep->capturedProperties); ep->captureProperties = lastCaptureProperties; return value; }