Exemple #1
0
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;
}