dbertoni    02/04/02 21:13:10

  Modified:    c/src/XPath XPath.cpp XPathExpression.cpp
                        XPathExpression.hpp XPathProcessorImpl.cpp
                        XPathProcessorImpl.hpp
  Log:
  Experimental implementation that encodes information about position 
predicates in match patterns.
  
  Revision  Changes    Path
  1.68      +13 -6     xml-xalan/c/src/XPath/XPath.cpp
  
  Index: XPath.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XPath.cpp,v
  retrieving revision 1.67
  retrieving revision 1.68
  diff -u -r1.67 -r1.68
  --- XPath.cpp 4 Jan 2002 17:29:07 -0000       1.67
  +++ XPath.cpp 3 Apr 2002 05:13:09 -0000       1.68
  @@ -391,6 +391,7 @@
                        const int       nextOp = 
m_expression.m_opMap[nextStepPos];
   
                        if(nextOp == XPathExpression::eOP_PREDICATE ||
  +                        nextOp == 
XPathExpression::eOP_PREDICATE_WITH_POSITION ||
                           nextOp == XPathExpression::eENDOP)
                        {
                                const int       stepType = 
m_expression.m_opMap[opPos];
  @@ -1270,7 +1271,8 @@
   
        int             nextStepType = 
currentExpression.getOpCodeMapValue(opPos);
   
  -     if(XPathExpression::eOP_PREDICATE == nextStepType)
  +     if(XPathExpression::eOP_PREDICATE == nextStepType ||
  +        XPathExpression::eOP_PREDICATE_WITH_POSITION == nextStepType)
        {
                predicates(executionContext,
                                   context,
  @@ -1631,7 +1633,8 @@
   
        nextStepType = currentExpression.getOpCodeMapValue(opPos);
   
  -     if(score != eMatchScoreNone && XPathExpression::eOP_PREDICATE == 
nextStepType)
  +     if(score != eMatchScoreNone &&
  +        (XPathExpression::eOP_PREDICATE == nextStepType || 
XPathExpression::eOP_PREDICATE_WITH_POSITION == nextStepType))
        {
                score = eMatchScoreOther;
   
  @@ -1642,11 +1645,13 @@
                {
                        executionContext.setThrowFoundIndex(true);
   
  -                     while(XPathExpression::eOP_PREDICATE == nextStepType)
  +                     while(XPathExpression::eOP_PREDICATE == nextStepType ||
  +                               XPathExpression::eOP_PREDICATE_WITH_POSITION 
== nextStepType)
                        {
                                // This is a quick hack to look ahead and see 
if we have
                                // number literal as the predicate, i.e. 
match="foo[1]".
  -                             if (m_expression.getOpCodeMapValue(opPos + 2) 
== XPathExpression::eOP_NUMBERLIT)
  +                             if (m_expression.getOpCodeMapValue(opPos + 2) 
== XPathExpression::eOP_NUMBERLIT,
  +                                     
XPathExpression::eOP_PREDICATE_WITH_POSITION == nextStepType)
                                {
                                        score = 
handleFoundIndex(executionContext, context, startOpPos);
                                }
  @@ -2923,7 +2928,8 @@
        int     nextStepType =
                        currentExpression.getOpCodeMapValue(opPos);
   
  -     while(XPathExpression::eOP_PREDICATE == nextStepType)
  +     while(XPathExpression::eOP_PREDICATE == nextStepType ||
  +               XPathExpression::eOP_PREDICATE_WITH_POSITION == nextStepType)
        {
                const NodeRefListBase::size_type        theLength = 
subQueryResults.getLength();
   
  @@ -3007,7 +3013,8 @@
   
                nextStepType = currentExpression.getOpCodeMapValue(opPos);
   
  -             if(XPathExpression::eOP_PREDICATE == nextStepType)
  +             if(XPathExpression::eOP_PREDICATE == nextStepType ||
  +                XPathExpression::eOP_PREDICATE_WITH_POSITION == nextStepType)
                {
                        executionContext.setContextNodeList(subQueryResults);
                }
  
  
  
  1.34      +22 -1     xml-xalan/c/src/XPath/XPathExpression.cpp
  
  Index: XPathExpression.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathExpression.cpp,v
  retrieving revision 1.33
  retrieving revision 1.34
  diff -u -r1.33 -r1.34
  --- XPathExpression.cpp       4 Jan 2002 17:29:07 -0000       1.33
  +++ XPathExpression.cpp       3 Apr 2002 05:13:09 -0000       1.34
  @@ -166,7 +166,8 @@
        XPathExpression::s_opCodeMapLengthIndex + 1,
        XPathExpression::s_opCodeMapLengthIndex + 1,
        XPathExpression::s_opCodeMapLengthIndex + 2,
  -     XPathExpression::s_opCodeMapLengthIndex + 2
  +     XPathExpression::s_opCodeMapLengthIndex + 2,
  +     XPathExpression::s_opCodeMapLengthIndex + 1
   };
   
   static const int     theOpCodeLengthArraySize =
  @@ -537,6 +538,26 @@
        }
   
        assert(opCodeMapSize() == OpCodeMapSizeType(opCodeMapLength()));
  +}
  +
  +
  +
  +void
  +XPathExpression::replaceOpCode(
  +                     OpCodeMapSizeType       theIndex,
  +                     eOpCodes                        theOldOpCode,
  +                     eOpCodes                        theNewOpCode)
  +{
  +     if (theIndex >= m_opMap.size() ||
  +             m_opMap[theIndex] != theOldOpCode ||
  +             getOpCodeLength(theOldOpCode) != getOpCodeLength(theNewOpCode))
  +     {
  +             throw InvalidOpCodeException(theNewOpCode);
  +     }
  +     else
  +     {
  +             m_opMap[theIndex] = theNewOpCode;
  +     }
   }
   
   
  
  
  
  1.26      +25 -1     xml-xalan/c/src/XPath/XPathExpression.hpp
  
  Index: XPathExpression.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathExpression.hpp,v
  retrieving revision 1.25
  retrieving revision 1.26
  diff -u -r1.25 -r1.26
  --- XPathExpression.hpp       4 Jan 2002 17:29:07 -0000       1.25
  +++ XPathExpression.hpp       3 Apr 2002 05:13:09 -0000       1.26
  @@ -438,7 +438,7 @@
                 *      XBoolean or XNumber
                 */
                eOP_PREDICATE = 26,
  -  
  +
                /**
                 * [NODETYPE_COMMENT]
                 * No size or arguments.
  @@ -555,6 +555,17 @@
                eMATCH_ANY_ANCESTOR_WITH_PREDICATE = 53,
                eMATCH_ANY_ANCESTOR_WITH_FUNCTION_CALL = 54,
   
  +             /**
  +              * [OP_PREDICATE_WITH_POSITION]
  +              * [length]
  +              *      {expression}
  +              * [ENDOP] (For safety)
  +              * 
  +              * returns: 
  +              *      XBoolean or XNumber
  +              */
  +             eOP_PREDICATE_WITH_POSITION = 55,
  +  
                // Always add _before_ this one and update
                // s_opCodeLengthArray.
                eOpCodeNextAvailable
  @@ -896,6 +907,19 @@
                                          m_lastOpCodeIndex,
                                          theArgs);
        }
  +
  +     /**
  +      * Replace an operation code with supplied code.
  +      * 
  +      * @param theIndex  The index of the old operation code
  +      * @param theOldOpCode The old operation code
  +      * @param theNewOpCode The new operation code
  +      */
  +     void
  +     replaceOpCode(
  +                     OpCodeMapSizeType       theIndex,
  +                     eOpCodes                        theOldOpCode,
  +                     eOpCodes                        theNewOpCode);
   
        /**
         * Insert an operation code at a specified index in the list.
  
  
  
  1.52      +34 -13    xml-xalan/c/src/XPath/XPathProcessorImpl.cpp
  
  Index: XPathProcessorImpl.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathProcessorImpl.cpp,v
  retrieving revision 1.51
  retrieving revision 1.52
  diff -u -r1.51 -r1.52
  --- XPathProcessorImpl.cpp    8 Mar 2002 05:11:31 -0000       1.51
  +++ XPathProcessorImpl.cpp    3 Apr 2002 05:13:10 -0000       1.52
  @@ -91,7 +91,8 @@
        m_xpath(0),
        m_expression(0),
        m_prefixResolver(0),
  -     m_requireLiterals(false)
  +     m_requireLiterals(false),
  +     m_positionPredicateStack()
   {
   }
   
  @@ -139,6 +140,7 @@
        m_expression = 0;
        m_prefixResolver = 0;
        m_locator = 0;
  +     m_positionPredicateStack.clear();
   }
   
   
  @@ -210,6 +212,7 @@
                m_expression = 0;
                m_prefixResolver = 0;
                m_locator = 0;
  +             m_positionPredicateStack.clear();
        }
   }
   
  @@ -1579,16 +1582,6 @@
                
m_expression->updateOpCodeLength(XPathExpression::eOP_LOCATIONPATH,
                                                                                
 opPos);
        }
  -
  -     /*
  -     if(tokenIs(XalanUnicode::charLeftSquareBracket) == true)
  -     {
  -             Predicate();
  -
  -             
m_expression->updateOpCodeLength(XPathExpression::eOP_LOCATIONPATH,
  -                                                                             
 opPos);
  -     }  
  -     */
   }
     
   
  @@ -1779,6 +1772,16 @@
                                int             theFunctionID =
                                        
XPath::getFunctionTable().nameToID(m_token);
   
  +                             // This code is disabled for the time being, as
  +                             // it needs more testing.
  +#if 0
  +                             if (equals(m_token, s_positionString) == true &&
  +                                     m_positionPredicateStack.empty() == 
false)
  +                             {
  +                                     m_positionPredicateStack.back() = true;
  +                             }
  +#endif
  +
                                XPathExpression::OpCodeMapValueVectorType       
theArgs(2, 0);
                
                                theArgs[0] = theFunctionID;
  @@ -2142,6 +2145,8 @@
   
        m_expression->appendOpCode(XPathExpression::eOP_PREDICATE);
   
  +     m_positionPredicateStack.push_back(false);
  +
        Expr();
   
        // Terminate for safety.
  @@ -2149,6 +2154,18 @@
   
        m_expression->updateOpCodeLength(XPathExpression::eOP_PREDICATE,
                                                                         opPos);
  +
  +     assert(m_positionPredicateStack.empty() == false);
  +
  +     if (m_positionPredicateStack.back() == true)
  +     {
  +             m_expression->replaceOpCode(
  +                     opPos,
  +                     XPathExpression::eOP_PREDICATE,
  +                     XPathExpression::eOP_PREDICATE_WITH_POSITION);
  +     }
  +
  +     m_positionPredicateStack.pop_back();
   }
   
   
  @@ -2271,8 +2288,6 @@
   
        m_expression->appendOpCode(XPathExpression::eOP_LOCATIONPATHPATTERN);
   
  -     // These token s_functionKeyString should not be here, as it is really
  -     // part of the XSLT standard, and not the XPATH standard.
        if(lookahead(XalanUnicode::charLeftParenthesis, 1) == true &&
                                (tokenIs(s_functionIDString) == true ||
                                 tokenIs(s_functionKeyString) == true))
  @@ -2653,6 +2668,8 @@
   
   static XalanDOMString        s_childString;
   
  +static XalanDOMString        s_positionString;
  +
   
   
   const XalanDOMString XPathProcessorImpl::s_emptyString;
  @@ -2684,6 +2701,8 @@
   
   const XalanDOMString&        XPathProcessorImpl::s_childString = 
::s_childString;
   
  +const XalanDOMString&        XPathProcessorImpl::s_positionString = 
::s_positionString;
  +
   
   
   static XPathProcessorImpl::KeywordsMapType           s_keywords;
  @@ -2719,6 +2738,7 @@
        ::s_axisString = XALAN_STATIC_UCODE_STRING("::");
        ::s_attributeString = XALAN_STATIC_UCODE_STRING("attribute");
        ::s_childString = XALAN_STATIC_UCODE_STRING("child");
  +     ::s_positionString = XALAN_STATIC_UCODE_STRING("position");
   }
   
   
  @@ -2742,4 +2762,5 @@
        releaseMemory(::s_axisString);
        releaseMemory(::s_attributeString);
        releaseMemory(::s_childString);
  +     releaseMemory(::s_positionString);
   }
  
  
  
  1.19      +8 -0      xml-xalan/c/src/XPath/XPathProcessorImpl.hpp
  
  Index: XPathProcessorImpl.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathProcessorImpl.hpp,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- XPathProcessorImpl.hpp    26 Nov 2001 23:16:02 -0000      1.18
  +++ XPathProcessorImpl.hpp    3 Apr 2002 05:13:10 -0000       1.19
  @@ -109,6 +109,8 @@
                                less<XalanDOMString> >          
NodeTypesMapType;
   
        typedef vector<XalanDOMString>                  DOMStringVectorType;
  +
  +     typedef vector<bool>                                    BoolVectorType;
   #else
        typedef std::map<XalanDOMString,
                                         int>                                   
                KeywordsMapType;
  @@ -120,6 +122,8 @@
                                         XPathExpression::eOpCodes>             
NodeTypesMapType;
   
        typedef std::vector<XalanDOMString>                             
DOMStringVectorType;
  +
  +     typedef std::vector<bool>                                               
BoolVectorType;
   #endif
   
        /**
  @@ -819,6 +823,8 @@
   
        const Locator*                                  m_locator;
   
  +     BoolVectorType                                  
m_positionPredicateStack;
  +
        enum eDummy
        {
                TARGETEXTRA = 10000
  @@ -853,6 +859,8 @@
        static const XalanDOMString&    s_attributeString;
   
        static const XalanDOMString&    s_childString;
  +
  +     static const XalanDOMString&    s_positionString;
   
        /**
         * Map of keyword names to token values.
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to