void InternalSetupProjectJob::execute() { RulesEvaluationContextPtr evalContext(new RulesEvaluationContext(logger())); evalContext->setObserver(observer()); switch (m_parameters.restoreBehavior()) { case SetupProjectParameters::ResolveOnly: resolveProjectFromScratch(evalContext->engine()); resolveBuildDataFromScratch(evalContext); break; case SetupProjectParameters::RestoreOnly: m_newProject = restoreProject(evalContext).loadedProject; break; case SetupProjectParameters::RestoreAndTrackChanges: { const BuildGraphLoadResult loadResult = restoreProject(evalContext); m_newProject = loadResult.newlyResolvedProject; if (!m_newProject) m_newProject = loadResult.loadedProject; if (!m_newProject) { resolveProjectFromScratch(evalContext->engine()); resolveBuildDataFromScratch(evalContext); } else { QBS_CHECK(m_newProject->buildData); } break; } } if (!m_parameters.dryRun()) storeBuildGraph(m_newProject); // The evalutation context cannot be re-used for building, which runs in a different thread. m_newProject->buildData->evaluationContext.clear(); }
EvaluationResult ResolveExpression::Evaluate(IEvaluationContext* context) { Object::Pointer variable= context->ResolveVariable(fVariable, fArgs); if (variable.IsNull()) { throw CoreException("Variable not defined", fVariable); } EvaluationContext evalContext(context, variable); return this->EvaluateAnd(&evalContext); }
bool txStepPattern::matches(const txXPathNode& aNode, txIMatchContext* aContext) { NS_ASSERTION(mNodeTest, "Internal error"); if (!mNodeTest->matches(aNode, aContext)) return false; txXPathTreeWalker walker(aNode); if ((!mIsAttr && txXPathNodeUtils::isAttribute(walker.getCurrentPosition())) || !walker.moveToParent()) { return false; } if (isEmpty()) { return true; } /* * Evaluate Predicates * * Copy all siblings/attributes matching mNodeTest to nodes * Up to the last Predicate do * Foreach node in nodes * evaluate Predicate with node as context node * if the result is a number, check the context position, * otherwise convert to bool * if result is true, copy node to newNodes * if aNode is not member of newNodes, return false * nodes = newNodes * * For the last Predicate, evaluate Predicate with aNode as * context node, if the result is a number, check the position, * otherwise return the result converted to boolean */ // Create the context node set for evaluating the predicates nsRefPtr<txNodeSet> nodes; nsresult rv = aContext->recycler()->getNodeSet(getter_AddRefs(nodes)); NS_ENSURE_SUCCESS(rv, false); bool hasNext = mIsAttr ? walker.moveToFirstAttribute() : walker.moveToFirstChild(); while (hasNext) { if (mNodeTest->matches(walker.getCurrentPosition(), aContext)) { nodes->append(walker.getCurrentPosition()); } hasNext = mIsAttr ? walker.moveToNextAttribute() : walker.moveToNextSibling(); } Expr* predicate = mPredicates[0]; nsRefPtr<txNodeSet> newNodes; rv = aContext->recycler()->getNodeSet(getter_AddRefs(newNodes)); NS_ENSURE_SUCCESS(rv, false); PRUint32 i, predLen = mPredicates.Length(); for (i = 1; i < predLen; ++i) { newNodes->clear(); bool contextIsInPredicate = false; txNodeSetContext predContext(nodes, aContext); while (predContext.hasNext()) { predContext.next(); nsRefPtr<txAExprResult> exprResult; rv = predicate->evaluate(&predContext, getter_AddRefs(exprResult)); NS_ENSURE_SUCCESS(rv, false); switch(exprResult->getResultType()) { case txAExprResult::NUMBER: // handle default, [position() == numberValue()] if ((double)predContext.position() == exprResult->numberValue()) { const txXPathNode& tmp = predContext.getContextNode(); if (tmp == aNode) contextIsInPredicate = true; newNodes->append(tmp); } break; default: if (exprResult->booleanValue()) { const txXPathNode& tmp = predContext.getContextNode(); if (tmp == aNode) contextIsInPredicate = true; newNodes->append(tmp); } break; } } // Move new NodeSet to the current one nodes->clear(); nodes->append(*newNodes); if (!contextIsInPredicate) { return false; } predicate = mPredicates[i]; } txForwardContext evalContext(aContext, aNode, nodes); nsRefPtr<txAExprResult> exprResult; rv = predicate->evaluate(&evalContext, getter_AddRefs(exprResult)); NS_ENSURE_SUCCESS(rv, false); if (exprResult->getResultType() == txAExprResult::NUMBER) // handle default, [position() == numberValue()] return ((double)evalContext.position() == exprResult->numberValue()); return exprResult->booleanValue(); } // matches