1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 
6 #include "txExpr.h"
7 #include "txIXPathContext.h"
8 #include "txNodeSet.h"
9 
10   //-------------/
11  //- UnionExpr -/
12 //-------------/
13 
14     //-----------------------------/
15   //- Virtual methods from Expr -/
16 //-----------------------------/
17 
18 /**
19  * Evaluates this Expr based on the given context node and processor state
20  * @param context the context node for evaluation of this Expr
21  * @param ps the ContextState containing the stack information needed
22  * for evaluation
23  * @return the result of the evaluation
24 **/
25 nsresult
evaluate(txIEvalContext * aContext,txAExprResult ** aResult)26 UnionExpr::evaluate(txIEvalContext* aContext, txAExprResult** aResult)
27 {
28     *aResult = nullptr;
29     RefPtr<txNodeSet> nodes;
30     nsresult rv = aContext->recycler()->getNodeSet(getter_AddRefs(nodes));
31     NS_ENSURE_SUCCESS(rv, rv);
32 
33     uint32_t i, len = mExpressions.Length();
34     for (i = 0; i < len; ++i) {
35         RefPtr<txAExprResult> exprResult;
36         rv = mExpressions[i]->evaluate(aContext, getter_AddRefs(exprResult));
37         NS_ENSURE_SUCCESS(rv, rv);
38 
39         if (exprResult->getResultType() != txAExprResult::NODESET) {
40             //XXX ErrorReport: report nonnodeset error
41             return NS_ERROR_XSLT_NODESET_EXPECTED;
42         }
43 
44         RefPtr<txNodeSet> resultSet, ownedSet;
45         resultSet = static_cast<txNodeSet*>
46                                (static_cast<txAExprResult*>(exprResult));
47         exprResult = nullptr;
48         rv = aContext->recycler()->
49             getNonSharedNodeSet(resultSet, getter_AddRefs(ownedSet));
50         NS_ENSURE_SUCCESS(rv, rv);
51 
52         rv = nodes->addAndTransfer(ownedSet);
53         NS_ENSURE_SUCCESS(rv, rv);
54     }
55 
56     *aResult = nodes;
57     NS_ADDREF(*aResult);
58 
59     return NS_OK;
60 } //-- evaluate
61 
62 Expr::ExprType
getType()63 UnionExpr::getType()
64 {
65   return UNION_EXPR;
66 }
67 
TX_IMPL_EXPR_STUBS_LIST(UnionExpr,NODESET_RESULT,mExpressions)68 TX_IMPL_EXPR_STUBS_LIST(UnionExpr, NODESET_RESULT, mExpressions)
69 
70 bool
71 UnionExpr::isSensitiveTo(ContextSensitivity aContext)
72 {
73     uint32_t i, len = mExpressions.Length();
74     for (i = 0; i < len; ++i) {
75         if (mExpressions[i]->isSensitiveTo(aContext)) {
76             return true;
77         }
78     }
79 
80     return false;
81 }
82 
83 #ifdef TX_TO_STRING
84 void
toString(nsAString & dest)85 UnionExpr::toString(nsAString& dest)
86 {
87     uint32_t i;
88     for (i = 0; i < mExpressions.Length(); ++i) {
89         if (i > 0)
90             dest.AppendLiteral(" | ");
91         mExpressions[i]->toString(dest);
92     }
93 }
94 #endif
95