15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright 2005 Maksim Orlovich <maksim@kde.org> 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006 Apple Computer, Inc. 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 1502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/xml/XPathParser.h" 3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 31df95704c49daea886ddad70775bda23618d6274dBen Murdoch#include "bindings/v8/ExceptionState.h" 325d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/XPathGrammar.h" 3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ExceptionCode.h" 3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/xml/XPathEvaluator.h" 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/xml/XPathNSResolver.h" 3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/xml/XPathPath.h" 37e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "wtf/StdLibExtras.h" 38e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "wtf/text/StringHash.h" 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace WebCore; 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace WTF; 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace Unicode; 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace XPath; 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Parser* Parser::currentParser = 0; 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum XMLCat { NameStart, NameCont, NotPartOfName }; 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef HashMap<String, Step::Axis> AxisNamesMap; 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static XMLCat charCat(UChar aChar) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // might need to add some special cases from the XML spec. 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (aChar == '_') 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return NameStart; 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (aChar == '.' || aChar == '-') 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return NameCont; 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CharCategory category = Unicode::category(aChar); 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (category & (Letter_Uppercase | Letter_Lowercase | Letter_Other | Letter_Titlecase | Number_Letter)) 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return NameStart; 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (category & (Mark_NonSpacing | Mark_SpacingCombining | Mark_Enclosing | Letter_Modifier | Number_DecimalDigit)) 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return NameCont; 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return NotPartOfName; 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static void setUpAxisNamesMap(AxisNamesMap& axisNames) 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) struct AxisName { 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const char* name; 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Step::Axis axis; 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const AxisName axisNameList[] = { 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { "ancestor", Step::AncestorAxis }, 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { "ancestor-or-self", Step::AncestorOrSelfAxis }, 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { "attribute", Step::AttributeAxis }, 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { "child", Step::ChildAxis }, 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { "descendant", Step::DescendantAxis }, 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { "descendant-or-self", Step::DescendantOrSelfAxis }, 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { "following", Step::FollowingAxis }, 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { "following-sibling", Step::FollowingSiblingAxis }, 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { "namespace", Step::NamespaceAxis }, 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { "parent", Step::ParentAxis }, 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { "preceding", Step::PrecedingAxis }, 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { "preceding-sibling", Step::PrecedingSiblingAxis }, 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { "self", Step::SelfAxis } 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned i = 0; i < sizeof(axisNameList) / sizeof(axisNameList[0]); ++i) 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) axisNames.set(axisNameList[i].name, axisNameList[i].axis); 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool isAxisName(const String& name, Step::Axis& type) 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DEFINE_STATIC_LOCAL(AxisNamesMap, axisNames, ()); 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (axisNames.isEmpty()) 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setUpAxisNamesMap(axisNames); 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) AxisNamesMap::iterator it = axisNames.find(name); 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (it == axisNames.end()) 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) type = it->value; 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool isNodeTypeName(const String& name) 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DEFINE_STATIC_LOCAL(HashSet<String>, nodeTypeNames, ()); 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (nodeTypeNames.isEmpty()) { 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) nodeTypeNames.add("comment"); 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) nodeTypeNames.add("text"); 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) nodeTypeNames.add("processing-instruction"); 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) nodeTypeNames.add("node"); 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return nodeTypeNames.contains(name); 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Returns whether the current token can possibly be a binary operator, given 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// the previous token. Necessary to disambiguate some of the operators 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// (* (multiply), div, and, or, mod) in the [32] Operator rule 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// (check http://www.w3.org/TR/xpath#exprlex). 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Parser::isBinaryOperatorContext() const 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (m_lastTokenType) { 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case 0: 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case '@': case AXISNAME: case '(': case '[': case ',': 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case AND: case OR: case MULOP: 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case '/': case SLASHSLASH: case '|': case PLUS: case MINUS: 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case EQOP: case RELOP: 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Parser::skipWS() 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (m_nextPos < m_data.length() && isSpaceOrNewline(m_data[m_nextPos])) 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++m_nextPos; 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Token Parser::makeTokenAndAdvance(int code, int advance) 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_nextPos += advance; 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Token(code); 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Token Parser::makeTokenAndAdvance(int code, NumericOp::Opcode val, int advance) 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_nextPos += advance; 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Token(code, val); 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Token Parser::makeTokenAndAdvance(int code, EqTestOp::Opcode val, int advance) 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_nextPos += advance; 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Token(code, val); 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Returns next char if it's there and interesting, 0 otherwise 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)char Parser::peekAheadHelper() 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_nextPos + 1 >= m_data.length()) 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) UChar next = m_data[m_nextPos + 1]; 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (next >= 0xff) 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return next; 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)char Parser::peekCurHelper() 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_nextPos >= m_data.length()) 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) UChar next = m_data[m_nextPos]; 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (next >= 0xff) 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return next; 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Token Parser::lexString() 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) UChar delimiter = m_data[m_nextPos]; 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int startPos = m_nextPos + 1; 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (m_nextPos = startPos; m_nextPos < m_data.length(); ++m_nextPos) { 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_data[m_nextPos] == delimiter) { 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String value = m_data.substring(startPos, m_nextPos - startPos); 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (value.isNull()) 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) value = ""; 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++m_nextPos; // Consume the char. 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Token(LITERAL, value); 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Ouch, went off the end -- report error. 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Token(XPATH_ERROR); 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Token Parser::lexNumber() 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int startPos = m_nextPos; 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool seenDot = false; 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Go until end or a non-digits character. 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (; m_nextPos < m_data.length(); ++m_nextPos) { 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) UChar aChar = m_data[m_nextPos]; 2095d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (aChar >= 0xff) 2105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) break; 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (aChar < '0' || aChar > '9') { 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (aChar == '.' && !seenDot) 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) seenDot = true; 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Token(NUMBER, m_data.substring(startPos, m_nextPos - startPos)); 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Parser::lexNCName(String& name) 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int startPos = m_nextPos; 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_nextPos >= m_data.length()) 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (charCat(m_data[m_nextPos]) != NameStart) 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Keep going until we get a character that's not good for names. 2335d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) for (; m_nextPos < m_data.length(); ++m_nextPos) { 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (charCat(m_data[m_nextPos]) == NotPartOfName) 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 2365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) } 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) name = m_data.substring(startPos, m_nextPos - startPos); 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool Parser::lexQName(String& name) 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String n1; 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!lexNCName(n1)) 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) skipWS(); 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If the next character is :, what we just got it the prefix, if not, 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // it's the whole thing. 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (peekAheadHelper() != ':') { 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) name = n1; 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String n2; 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!lexNCName(n2)) 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) name = n1 + ":" + n2; 2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Token Parser::nextTokenInternal() 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) skipWS(); 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_nextPos >= m_data.length()) 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Token(0); 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) char code = peekCurHelper(); 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (code) { 2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case '(': case ')': case '[': case ']': 2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case '@': case ',': case '|': 2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return makeTokenAndAdvance(code); 2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case '\'': 2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case '\"': 2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return lexString(); 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case '0': case '1': case '2': case '3': case '4': 2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case '5': case '6': case '7': case '8': case '9': 2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return lexNumber(); 2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case '.': { 2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) char next = peekAheadHelper(); 2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (next == '.') 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return makeTokenAndAdvance(DOTDOT, 2); 2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (next >= '0' && next <= '9') 2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return lexNumber(); 2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return makeTokenAndAdvance('.'); 2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case '/': 2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (peekAheadHelper() == '/') 2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return makeTokenAndAdvance(SLASHSLASH, 2); 2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return makeTokenAndAdvance('/'); 2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case '+': 2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return makeTokenAndAdvance(PLUS); 2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case '-': 2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return makeTokenAndAdvance(MINUS); 2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case '=': 3005d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return makeTokenAndAdvance(EQOP, EqTestOp::OpcodeEqual); 3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case '!': 3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (peekAheadHelper() == '=') 3035d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return makeTokenAndAdvance(EQOP, EqTestOp::OpcodeNotEqual, 2); 3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Token(XPATH_ERROR); 3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case '<': 3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (peekAheadHelper() == '=') 3075d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return makeTokenAndAdvance(RELOP, EqTestOp::OpcodeLessOrEqual, 2); 3085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return makeTokenAndAdvance(RELOP, EqTestOp::OpcodeLessThan); 3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case '>': 3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (peekAheadHelper() == '=') 3115d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return makeTokenAndAdvance(RELOP, EqTestOp::OpcodeGreaterOrEqual, 2); 3125d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return makeTokenAndAdvance(RELOP, EqTestOp::OpcodeGreaterThan); 3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case '*': 3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isBinaryOperatorContext()) 3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return makeTokenAndAdvance(MULOP, NumericOp::OP_Mul); 3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++m_nextPos; 3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Token(NAMETEST, "*"); 3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case '$': { // $ QName 3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_nextPos++; 3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String name; 3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!lexQName(name)) 3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Token(XPATH_ERROR); 3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Token(VARIABLEREFERENCE, name); 3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String name; 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!lexNCName(name)) 3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Token(XPATH_ERROR); 3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) skipWS(); 3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If we're in an operator context, check for any operator names 3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isBinaryOperatorContext()) { 3345d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (name == "and") // ### hash? 3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Token(AND); 3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (name == "or") 3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Token(OR); 3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (name == "mod") 3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Token(MULOP, NumericOp::OP_Mod); 3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (name == "div") 3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Token(MULOP, NumericOp::OP_Div); 3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // See whether we are at a : 3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (peekCurHelper() == ':') { 3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_nextPos++; 3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Any chance it's an axis name? 3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (peekCurHelper() == ':') { 3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_nextPos++; 35002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 3515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // It might be an axis name. 3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Step::Axis axis; 3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isAxisName(name, axis)) 3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Token(AXISNAME, axis); 3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Ugh, :: is only valid in axis names -> error 3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Token(XPATH_ERROR); 3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3595d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // Seems like this is a fully qualified qname, or perhaps the * modified 3605d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // one from NameTest 3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) skipWS(); 3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (peekCurHelper() == '*') { 3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_nextPos++; 3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Token(NAMETEST, name + ":*"); 3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 36602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Make a full qname. 3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String n2; 3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!lexNCName(n2)) 3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Token(XPATH_ERROR); 37102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) name = name + ":" + n2; 3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) skipWS(); 3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (peekCurHelper() == '(') { 3775d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // Note: we don't swallow the ( here! 37802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 3795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // Either node type of function name 3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isNodeTypeName(name)) { 3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (name == "processing-instruction") 3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Token(PI, name); 3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Token(NODETYPE, name); 3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // Must be a function name. 3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Token(FUNCTIONNAME, name); 3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // At this point, it must be NAMETEST. 3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Token(NAMETEST, name); 3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Token Parser::nextToken() 3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Token toRet = nextTokenInternal(); 3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_lastTokenType = toRet.type; 3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return toRet; 3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Parser::Parser() 4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) reset(String()); 4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Parser::~Parser() 4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Parser::reset(const String& data) 4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_nextPos = 0; 4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_data = data; 4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_lastTokenType = 0; 41502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 416d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) m_topExpr = nullptr; 4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_gotNamespaceError = false; 4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int Parser::lex(void* data) 4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) YYSTYPE* yylval = static_cast<YYSTYPE*>(data); 4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Token tok = nextToken(); 4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (tok.type) { 4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case AXISNAME: 4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) yylval->axis = tok.axis; 4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case MULOP: 4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) yylval->numop = tok.numop; 4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case RELOP: 4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case EQOP: 4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) yylval->eqop = tok.eqop; 4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case NODETYPE: 4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case PI: 4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case FUNCTIONNAME: 4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case LITERAL: 4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case VARIABLEREFERENCE: 4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case NUMBER: 4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case NAMETEST: 4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) yylval->str = new String(tok.str); 4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) registerString(yylval->str); 4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return tok.type; 4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 451a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)bool Parser::expandQName(const String& qName, AtomicString& localName, AtomicString& namespaceURI) 4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t colon = qName.find(':'); 45406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) if (colon != kNotFound) { 4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_resolver) 4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) namespaceURI = m_resolver->lookupNamespaceURI(qName.left(colon)); 4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (namespaceURI.isNull()) 4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 460a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) localName = AtomicString(qName.substring(colon + 1)); 461a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) } else { 462a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) localName = AtomicString(qName); 463a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) } 46402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 468d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassOwnPtrWillBeRawPtr<Expression> Parser::parseStatement(const String& statement, PassRefPtrWillBeRawPtr<XPathNSResolver> resolver, ExceptionState& exceptionState) 4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) reset(statement); 4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_resolver = resolver; 47302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Parser* oldParser = currentParser; 4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) currentParser = this; 4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int parseError = xpathyyparse(this); 4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) currentParser = oldParser; 4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (parseError) { 480d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN) 481d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) while (!m_parseNodes.isEmpty()) 482d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) delete m_parseNodes.takeAny(); 4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 484bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) HashSet<Vector<OwnPtr<Predicate> >*>::iterator pend = m_predicateVectors.end(); 485bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) for (HashSet<Vector<OwnPtr<Predicate> >*>::iterator it = m_predicateVectors.begin(); it != pend; ++it) 4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) delete *it; 4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_predicateVectors.clear(); 4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 489bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) HashSet<Vector<OwnPtr<Expression> >*>::iterator eend = m_expressionVectors.end(); 490bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) for (HashSet<Vector<OwnPtr<Expression> >*>::iterator it = m_expressionVectors.begin(); it != eend; ++it) 4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) delete *it; 4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_expressionVectors.clear(); 4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_nodeTests.clear(); 495d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif 4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 497d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) m_strings.clear(); 498d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 499d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) m_topExpr = nullptr; 5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_gotNamespaceError) 502a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) exceptionState.throwDOMException(NamespaceError, "The string '" + statement + "' contains unresolvable namespaces."); 5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 504a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) exceptionState.throwDOMException(SyntaxError, "The string '" + statement + "' is not a valid XPath expression."); 505d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) return nullptr; 5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 507d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) ASSERT(m_strings.size() == 0); 508d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN) 5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_parseNodes.size() == 1); 5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(*m_parseNodes.begin() == m_topExpr); 5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_expressionVectors.size() == 0); 5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_predicateVectors.size() == 0); 5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_nodeTests.size() == 0); 5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_parseNodes.clear(); 515d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif 516d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Expression* result = m_topExpr; 518d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) m_topExpr = nullptr; 5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 520d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) return adoptPtrWillBeNoop(result); 5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Parser::registerParseNode(ParseNode* node) 5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 525d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN) 5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (node == 0) 5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 52802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_parseNodes.contains(node)); 53002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_parseNodes.add(node); 532d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif 5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Parser::unregisterParseNode(ParseNode* node) 5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 537d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN) 5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (node == 0) 5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 54002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_parseNodes.contains(node)); 5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_parseNodes.remove(node); 544d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif 5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 547d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void Parser::registerPredicateVector(WillBeHeapVector<OwnPtrWillBeMember<Predicate> >* vector) 5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 549d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN) 5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (vector == 0) 5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_predicateVectors.contains(vector)); 55402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_predicateVectors.add(vector); 556d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif 5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 559d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void Parser::deletePredicateVector(WillBeHeapVector<OwnPtrWillBeMember<Predicate> >* vector) 5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 561d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN) 5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (vector == 0) 5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_predicateVectors.contains(vector)); 56602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_predicateVectors.remove(vector); 5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) delete vector; 569d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif 5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 573d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void Parser::registerExpressionVector(WillBeHeapVector<OwnPtrWillBeMember<Expression> >* vector) 5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 575d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN) 5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (vector == 0) 5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_expressionVectors.contains(vector)); 58002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 58102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch m_expressionVectors.add(vector); 582d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif 5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 585d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void Parser::deleteExpressionVector(WillBeHeapVector<OwnPtrWillBeMember<Expression> >* vector) 5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 587d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN) 5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (vector == 0) 5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_expressionVectors.contains(vector)); 59202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_expressionVectors.remove(vector); 5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) delete vector; 595d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif 5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Parser::registerString(String* s) 5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (s == 0) 6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 60202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_strings.contains(s)); 60402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 605f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu m_strings.add(adoptPtr(s)); 6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Parser::deleteString(String* s) 6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (s == 0) 6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 61202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_strings.contains(s)); 61402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_strings.remove(s); 6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Parser::registerNodeTest(Step::NodeTest* t) 6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 620d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN) 6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (t == 0) 6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 62302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_nodeTests.contains(t)); 62502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 626f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu m_nodeTests.add(adoptPtr(t)); 627d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif 6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Parser::deleteNodeTest(Step::NodeTest* t) 6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 632d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN) 6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (t == 0) 6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 63502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_nodeTests.contains(t)); 63702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_nodeTests.remove(t); 639d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif 6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 642