dbertoni    00/08/14 13:11:57

  Modified:    c/src/XSLT ElemCallTemplate.cpp Stylesheet.cpp
                        Stylesheet.hpp StylesheetRoot.cpp
  Log:
  Fixes for thread-safety problem with storing priority in MatchPattern2.
  
  Revision  Changes    Path
  1.8       +2 -1      xml-xalan/c/src/XSLT/ElemCallTemplate.cpp
  
  Index: ElemCallTemplate.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemCallTemplate.cpp,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- ElemCallTemplate.cpp      2000/08/01 19:45:13     1.7
  +++ ElemCallTemplate.cpp      2000/08/14 20:11:46     1.8
  @@ -68,6 +68,7 @@
   
   #include "AVT.hpp"
   #include "Constants.hpp"
  +#include "ElemTemplate.hpp"
   #include "Stylesheet.hpp"
   #include "StylesheetConstructionContext.hpp"
   #include "StylesheetExecutionContext.hpp"
  @@ -131,7 +132,7 @@
   
        if(!isEmpty(m_templateName.getLocalPart()))
        {
  -             ElemTemplateElement* const      theTemplate =
  +             const ElemTemplate* const       theTemplate =
                        
getStylesheet().getStylesheetRoot().findNamedTemplate(m_templateName,
                                        executionContext);
   
  
  
  
  1.31      +32 -36    xml-xalan/c/src/XSLT/Stylesheet.cpp
  
  Index: Stylesheet.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/Stylesheet.cpp,v
  retrieving revision 1.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- Stylesheet.cpp    2000/08/11 21:15:44     1.30
  +++ Stylesheet.cpp    2000/08/14 20:11:48     1.31
  @@ -513,35 +513,24 @@
          
   
   
  -/**
  - * Locate a macro via the "name" attribute.
  - * @exception XSLProcessorException thrown if the active ProblemListener and 
XMLParserLiaison decide 
  - * the error condition is severe enough to halt processing.
  - */
  -ElemTemplateElement*
  +const ElemTemplate*
   Stylesheet::findNamedTemplate(
                        const XalanDOMString&                   name,
                        StylesheetExecutionContext&     executionContext) const
  -//throws XSLProcessorException
   {
        return findNamedTemplate(QName(name, m_namespaces), executionContext);
   }
   
   
   
  -/**
  - * Locate a macro via the "name" attribute.
  - * @exception XSLProcessorException thrown if the active ProblemListener and 
XMLParserLiaison decide 
  - * the error condition is severe enough to halt processing.
  - */
  -ElemTemplateElement*
  +const ElemTemplate*
   Stylesheet::findNamedTemplate(
                        const QName&                                    qname,
                        StylesheetExecutionContext&     executionContext) const
   {
  -     ElemTemplateElement     *namedTemplate = 0;
  +     const ElemTemplate*             namedTemplate = 0;
   
  -     ElemTemplateElementMapType::const_iterator it = 
m_namedTemplates.find(qname);
  +     ElemTemplateMapType::const_iterator it = m_namedTemplates.find(qname);
   
        // Look for the template in the imports
        if(it == m_namedTemplates.end())
  @@ -551,7 +540,9 @@
                for(int i = 0; i < nImports; i++)
                {
                        const Stylesheet* const stylesheet = m_imports[i];
  +
                        namedTemplate = stylesheet->findNamedTemplate(qname, 
executionContext);
  +
                        if(0 != namedTemplate)
                                break;
                }
  @@ -572,7 +563,7 @@
        
   
   
  -ElemTemplate*
  +const ElemTemplate*
   Stylesheet::findTemplate(
                        StylesheetExecutionContext&     executionContext,
                        XalanNode*                                              
sourceTree, 
  @@ -585,7 +576,7 @@
   
   
   
  -ElemTemplate*
  +const ElemTemplate*
   Stylesheet::findTemplate(
                        StylesheetExecutionContext&     executionContext,
                        XalanNode*                                              
sourceTree, 
  @@ -597,7 +588,7 @@
        assert(sourceTree != 0);
        assert(targetNode != 0);
   
  -     ElemTemplate*   theResult = 0;
  +     const ElemTemplate*             theResult = 0;
   
        if(m_isWrapperless)
        {
  @@ -607,16 +598,14 @@
        {
                bool                                    usedWildcard = false;
   
  -             ElemTemplate*                   bestMatchedRule = 0;
  +             const ElemTemplate*             bestMatchedRule = 0;
                const MatchPattern2*    bestMatchedPattern = 0; // Syncs with 
bestMatchedRule
  +             double                                  bestMatchPatPriority = 
XPath::s_MatchScoreNone;
   
                PatternTableVectorType  conflicts;
   
                if(useImports == false)
                {
  -                     //odd that this variable is only set, never read
  -                     double highScore = XPath::s_MatchScoreNone;
  -
                        // Points to the current list of match patterns.  Note
                        // that this may point to more than one table.
                        const PatternTableListType*     matchPatternList = 0;
  @@ -663,6 +652,7 @@
                        {
                                XalanDOMString                  prevPat;
                                const MatchPattern2*    prevMatchPat = 0;
  +                             double                                  
prevMatchPatPriority = XPath::s_MatchScoreNone;
   
                                // These are iterators into the current table.
                                // Note that we may re-seat these iterators to
  @@ -677,9 +667,10 @@
                                while(theCurrentEntry != theTableEnd)
                                {
                                        const MatchPattern2*    matchPat = 
*theCurrentEntry;
  +                                     double                                  
matchPatPriority = XPath::s_MatchScoreNone;
                                        assert(matchPat != 0);
   
  -                                     ElemTemplate*                   rule = 
matchPat->getTemplate();
  +                                     const ElemTemplate*             rule = 
matchPat->getTemplate();
   
                                        // We'll be needing to match rules 
according to what 
                                        // mode we're in.
  @@ -705,6 +696,8 @@
                                                {
                                                        prevPat = patterns;
                                                        prevMatchPat = matchPat;
  +                                                     prevMatchPatPriority = 
matchPatPriority;
  +                                                     matchPatPriority = 
XPath::s_MatchScoreNone;
   
                                                        const XPath* const      
xpath = matchPat->getExpression();
   
  @@ -718,26 +711,26 @@
                                                                          = 
(XPath::s_MatchScoreNone != priorityVal) 
                                                                                
                                          ? priorityVal : score;
   
  -                                                             
matchPat->setPriority(priorityOfRule);
  +                                                             
matchPatPriority = priorityOfRule;
                                                                const double 
priorityOfBestMatched =
                                                                                
(0 != bestMatchedPattern) ?
  -                                                                             
                bestMatchedPattern->getPriority() : 
  +                                                                             
                bestMatchPatPriority : 
                                                                                
                XPath::s_MatchScoreNone;
   
                                                                
if(priorityOfRule > priorityOfBestMatched)
                                                                {
                                                                        
conflicts.clear();
  -                                                                     
highScore = score;
                                                                        
bestMatchedRule = rule;
                                                                        
bestMatchedPattern = matchPat;
  +                                                                     
bestMatchPatPriority = matchPatPriority;
                                                                }
                                                                else 
if(priorityOfRule == priorityOfBestMatched)
                                                                {
                                                                        
addObjectIfNotFound(bestMatchedPattern, conflicts);
                                                                        
conflicts.push_back(matchPat);
  -                                                                     
highScore = score;
                                                                        
bestMatchedRule = rule;
                                                                        
bestMatchedPattern = matchPat;
  +                                                                     
bestMatchPatPriority = matchPatPriority;
                                                                }
                                                        }
                                                }
  @@ -757,7 +750,7 @@
                                                {
                                                        
assert(usedWildcard==false);    // Should only be here once ??
                                                        usedWildcard = true;
  -                                                     
PatternTableMapType::const_iterator     theTableIterator =
  +                                                     const 
PatternTableMapType::const_iterator       theTableIterator =
                                                                
m_patternTable.find(XALAN_STATIC_UCODE_STRING("*"));
   
                                                        
assert(m_patternTable.size());
  @@ -780,9 +773,9 @@
                // else
                if(0 == bestMatchedRule)
                {
  -                     const int       nImports = m_imports.size();
  +                     const unsigned int      nImports = m_imports.size();
   
  -                     for(int i = 0; i < nImports; i++)
  +                     for(unsigned int i = 0; i < nImports; i++)
                        {
                                const Stylesheet* const         stylesheet =
                                        m_imports[i];
  @@ -798,15 +791,19 @@
                        }
                }
                
  -             const int       nConflicts = conflicts.size();
  +             const unsigned int      nConflicts = conflicts.size();
  +
                if(nConflicts > 0)
                {
  -                     const bool      quietConflictWarnings = 
executionContext.getQuietConflictWarnings();
  +                     const bool              quietConflictWarnings = 
executionContext.getQuietConflictWarnings();
  +
                        XalanDOMString  conflictsString = 
(quietConflictWarnings == false) 
                                                                         ? 
XALAN_STATIC_UCODE_STRING("Specificity conflicts found: ") : XalanDOMString();
  -                     for(int i = 0; i < nConflicts; i++)
  +
  +                     for(unsigned int i = 0; i < nConflicts; i++)
                        {
                                const MatchPattern2* const      conflictPat = 
conflicts[i];
  +
                                if(0 != i)
                                {
                                        if(quietConflictWarnings == false)
  @@ -1041,15 +1038,14 @@
   Stylesheet::MatchPattern2::MatchPattern2(
                        const XalanDOMString&   pat,
                        const XPath*                    exp,
  -                     ElemTemplate*                   theTemplate,
  +                     const ElemTemplate*             theTemplate,
                        int                                     
posInStylesheet, 
                        const XalanDOMString&   targetString,
  -                     Stylesheet*     stylesheet) :
  +                     const Stylesheet*       stylesheet) :
        m_stylesheet(stylesheet),
        m_targetString(targetString),
        m_expression(exp),
        m_posInStylesheet(posInStylesheet),
  -     m_priority(XPath::s_MatchScoreNone),
        m_pattern(pat),
        m_template(theTemplate)
   {
  
  
  
  1.22      +17 -48    xml-xalan/c/src/XSLT/Stylesheet.hpp
  
  Index: Stylesheet.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/Stylesheet.hpp,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- Stylesheet.hpp    2000/08/11 21:15:44     1.21
  +++ Stylesheet.hpp    2000/08/14 20:11:49     1.22
  @@ -128,7 +128,7 @@
   
   typedef XALAN_STD map<XalanDOMString, XalanDOMString>                
PrefixAliasesMapType;
   typedef XALAN_STD map<XalanDOMString, ExtensionNSHandler*>   
ExtensionNamespacesMapType;
  -typedef XALAN_STD map<QName, ElemTemplateElement*>                   
ElemTemplateElementMapType;
  +typedef XALAN_STD map<QName, ElemTemplate*>                                  
ElemTemplateMapType;
   typedef XALAN_STD vector<ElemAttributeSet*>                          
AttributeSetMapType;
   typedef XALAN_STD vector<ElemVariable*>                                      
ElemVariableVectorType;
   typedef XALAN_STD vector<KeyDeclaration>                                     
KeyDeclarationVectorType;
  @@ -604,7 +604,7 @@
         * Thus, for a given key or keyref, look up hashtable by name, 
         * look up the nodelist by the given reference.
         */
  -     virtual void
  +     void
        processKeyElement(
                        ElemTemplateElement*                    nsContext,
                        const AttributeList&                    atts,
  @@ -617,7 +617,7 @@
         * @param executionContext       current execution context
         * @return pointer to template found or 0 if none found
         */
  -     virtual ElemTemplateElement*
  +     const ElemTemplate*
        findNamedTemplate(
                        const XalanDOMString&                   name,
                        StylesheetExecutionContext&     executionContext) const;
  @@ -628,7 +628,7 @@
         * @param executionContext       current execution context
         * @return pointer to template found or 0 if none found
         */
  -     virtual ElemTemplateElement*
  +     const ElemTemplate*
        findNamedTemplate(
                        const QName&                                    qname,
                        StylesheetExecutionContext&     executionContext) const;
  @@ -642,8 +642,7 @@
         * @param targetNode       element that needs a rule
         * @return                                 pointer to rule that best 
matches targetNode
         */
  -     virtual
  -     ElemTemplate*
  +     const ElemTemplate*
        findTemplate(
                        StylesheetExecutionContext&     executionContext,
                        XalanNode*                                              
sourceTree,
  @@ -660,8 +659,7 @@
         * @param useImports        means that this is an xsl:apply-imports 
commend
         * @return pointer to rule that best matches targetElem
         */
  -     virtual
  -     ElemTemplate*
  +     const ElemTemplate*
        findTemplate(
                        StylesheetExecutionContext&     executionContext,
                        XalanNode*                                              
sourceTree, 
  @@ -691,10 +689,10 @@
                MatchPattern2(
                                const XalanDOMString&   pat,
                                const XPath*                    exp,
  -                             ElemTemplate*                   theTemplate,
  +                             const ElemTemplate*             theTemplate,
                                int                                     
posInStylesheet, 
                                const XalanDOMString&   targetString,
  -                             Stylesheet*                     stylesheet); 
  +                             const Stylesheet*               stylesheet); 
   
                ~MatchPattern2();
   
  @@ -703,7 +701,7 @@
                 * 
                 * @return stylesheet for pattern
                 */
  -             Stylesheet*
  +             const Stylesheet*
                getStylesheet() const
                {
                        return m_stylesheet;
  @@ -758,49 +756,20 @@
                 * 
                 * @return template node
                 */
  -             ElemTemplate*
  +             const ElemTemplate*
                getTemplate() const
                {
                        return m_template;
                }
                
  -             /**
  -              * Retrieve priority of pattern.
  -              * 
  -              * @return priority of pattern
  -              */
  -             double
  -             getPriority() const
  -             {
  -                     return m_priority;
  -             }
  -
  -             /**
  -              * Set priority of pattern.
  -              * 
  -              * @param thePriority priority of pattern
  -              */
  -             // This is const because m_priority is mutable, which is an 
artifact of
  -             // the design and our Java heritage.
  -             void
  -             setPriority(double      thePriority) const
  -             { 
  -                     m_priority = thePriority;
  -             }
  -
        private:
   
  -             Stylesheet*                     m_stylesheet;
  -             const XalanDOMString    m_targetString;
  -             const XPath*                    m_expression;
  -             const int                               m_posInStylesheet;
  -             const XalanDOMString    m_pattern;
  -             ElemTemplate*                   m_template; // ref to the 
corresponding template
  -             
  -             /**
  -              * Transient... only used to track priority while processing.
  -              */
  -             mutable double                  m_priority;
  +             const Stylesheet* const         m_stylesheet;
  +             const XalanDOMString            m_targetString;
  +             const XPath* const                      m_expression;
  +             const int                                       
m_posInStylesheet;
  +             const XalanDOMString            m_pattern;
  +             const ElemTemplate*     const   m_template; // ref to the 
corresponding template
   
                // Not implemented...
                MatchPattern2();
  @@ -1254,7 +1223,7 @@
         * in the XSL DOM tree. Initialized in initMacroLookupTable, and used in
         * findNamedTemplate.
         */
  -     ElemTemplateElementMapType      m_namedTemplates;
  +     ElemTemplateMapType                     m_namedTemplates;
     
        /**
         * Table for defined constants, keyed on the names.
  
  
  
  1.22      +1 -1      xml-xalan/c/src/XSLT/StylesheetRoot.cpp
  
  Index: StylesheetRoot.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetRoot.cpp,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- StylesheetRoot.cpp        2000/08/11 21:15:46     1.21
  +++ StylesheetRoot.cpp        2000/08/14 20:11:50     1.22
  @@ -168,7 +168,7 @@
                        StylesheetExecutionContext&             
executionContext) const
   {
        // Find the root pattern in the XSL.
  -     ElemTemplate* rootRule =
  +     const ElemTemplate* rootRule =
                        findTemplate(executionContext, sourceTree, sourceTree);
   
        if(0 == rootRule)
  
  
  

Reply via email to