Expression* Parser::parseStatement(const String& statement, PassRefPtr<XPathNSResolver> resolver, ExceptionCode& ec) { reset(statement); m_resolver = resolver; Parser* oldParser = currentParser; currentParser = this; int parseError = xpathyyparse(this); currentParser = oldParser; if (parseError) { deleteAllValues(m_parseNodes); m_parseNodes.clear(); HashSet<Vector<Predicate*>*>::iterator pend = m_predicateVectors.end(); for (HashSet<Vector<Predicate*>*>::iterator it = m_predicateVectors.begin(); it != pend; ++it) { deleteAllValues(**it); delete *it; } m_predicateVectors.clear(); HashSet<Vector<Expression*>*>::iterator eend = m_expressionVectors.end(); for (HashSet<Vector<Expression*>*>::iterator it = m_expressionVectors.begin(); it != eend; ++it) { deleteAllValues(**it); delete *it; } m_expressionVectors.clear(); deleteAllValues(m_strings); m_strings.clear(); m_topExpr = 0; if (m_gotNamespaceError) ec = NAMESPACE_ERR; else ec = INVALID_EXPRESSION_ERR; return 0; } ASSERT(m_parseNodes.size() == 1); ASSERT(*m_parseNodes.begin() == m_topExpr); ASSERT(m_expressionVectors.size() == 0); ASSERT(m_predicateVectors.size() == 0); ASSERT(m_strings.size() == 0); m_parseNodes.clear(); Expression* result = m_topExpr; m_topExpr = 0; return result; }
ExceptionOr<std::unique_ptr<Expression>> Parser::parseStatement(const String& statement, RefPtr<XPathNSResolver>&& resolver) { Parser parser { statement, WTFMove(resolver) }; int parseError = xpathyyparse(parser); if (parser.m_sawNamespaceError) return Exception { NAMESPACE_ERR }; if (parseError) return Exception { XPathException::INVALID_EXPRESSION_ERR }; return WTFMove(parser.m_result); }
std::unique_ptr<Expression> Parser::parseStatement(const String& statement, XPathNSResolver* resolver, ExceptionCode& ec) { Parser parser(statement, resolver); int parseError = xpathyyparse(parser); if (parser.m_sawNamespaceError) { ec = NAMESPACE_ERR; return nullptr; } if (parseError) { ec = XPathException::INVALID_EXPRESSION_ERR; return nullptr; } return std::move(parser.m_result); }