dbertoni    00/06/07 11:35:07

  Modified:    c/src/XSLT Stylesheet.cpp Stylesheet.hpp
                        StylesheetConstructionContext.hpp
                        StylesheetConstructionContextDefault.cpp
                        StylesheetConstructionContextDefault.hpp
                        StylesheetHandler.cpp XSLTEngineImpl.cpp
  Log:
  Raise an error when more than one named template of the same name exists in a 
stylesheet.  Also added code to better manage object lifetime to plug memory 
leaks during exceptions.
  
  Revision  Changes    Path
  1.20      +29 -7     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.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- Stylesheet.cpp    2000/05/29 22:47:30     1.19
  +++ Stylesheet.cpp    2000/06/07 18:35:01     1.20
  @@ -415,7 +415,9 @@
    * Add a template to the template list.
    */
   void
  -Stylesheet::addTemplate(ElemTemplate *tmpl)
  +Stylesheet::addTemplate(
  +                     ElemTemplate*                                   tmpl,
  +                     StylesheetConstructionContext&  constructionContext)
   {
        unsigned int    pos = 0;
   
  @@ -443,9 +445,30 @@
                }
        }
   
  -     if(tmpl->getName().isEmpty() == false)
  +     const QName&    theName = tmpl->getName();
  +
  +     if(theName.isEmpty() == false)
        {
  -             
m_namedTemplates.insert(ElemTemplateElementMapType::value_type(tmpl->getName(), 
tmpl));
  +             if (m_namedTemplates.find(theName) != m_namedTemplates.end())
  +             {
  +                     XalanDOMString  theMessage("The stylesheet already has 
a template with the name ");
  +
  +                     const XalanDOMString&   theNamespace = 
theName.getNamespace();
  +
  +                     if (length(theNamespace) != 0)
  +                     {
  +                             theMessage += theNamespace;
  +                             theMessage += ":";
  +                     }
  +
  +                     theMessage += theName.getLocalPart();
  +
  +                     constructionContext.error(theMessage, 0, tmpl);
  +             }
  +             else
  +             {
  +                     m_namedTemplates[theName] = tmpl;
  +             }
        }
   
        const XPath* const      xp = tmpl->getMatchPattern();
  @@ -556,11 +579,11 @@
   
        if(0 == theResult)
        {
  -             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++)
                {
  -                     Stylesheet* const       stylesheet = m_imports[i];
  +                     const Stylesheet* const         stylesheet = 
m_imports[i];
                        assert(stylesheet != 0);
   
                        theResult = stylesheet->getTopLevelVariable(name, 
executionContext);
  @@ -635,7 +658,6 @@
                        {
                        case XalanNode::ELEMENT_NODE:
                                {
  -                                     //java: XalanDOMString targetName = 
m_processor->getParserLiaison().getLocalNameOfNode(targetNode);
                                        const XalanDOMString    targetName = 
DOMServices::getLocalNameOfNode(*targetNode);
                                        matchPatternList = 
locateMatchPatternList2(targetName, true);
                                }
  
  
  
  1.13      +15 -9     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.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- Stylesheet.hpp    2000/05/29 22:47:30     1.12
  +++ Stylesheet.hpp    2000/06/07 18:35:01     1.13
  @@ -138,7 +138,7 @@
   typedef XALAN_STD vector<NameSpace>                            
NamespaceVectorType;
   typedef XALAN_STD vector<NamespaceVectorType>                  
NamespacesStackType;
   typedef XALAN_STD vector<QName>                                        
QNameVectorType;
  -typedef XALAN_STD vector<Stylesheet*>                                  
StylesheetVectorType;
  +typedef XALAN_STD vector<const Stylesheet*>                          
StylesheetVectorType;
   typedef XALAN_STD vector<const XMLURL*>                        URLStackType;
   typedef XALAN_STD vector<const XPath*>                                 
XPathVectorType;
   typedef XALAN_STD vector<ElemDecimalFormat*>                 
ElemDecimalFormatVectorType;
  @@ -313,16 +313,19 @@
         * Add a template to the list of names templates
         * 
         * @param tmpl template to add
  +      * @param constructionContext context for construction
         */
        void
  -     addTemplate(ElemTemplate *tmpl);
  +     addTemplate(
  +                     ElemTemplate*                                   tmpl,
  +                     StylesheetConstructionContext&  constructionContext);
   
        /**
         * Process an attribute that has the value of 'yes' or 'no'.
         * 
         * @param aname name of attribute
         * @param val value
  -      * @param constructionContext context for evaluation
  +      * @param constructionContext context for construction
         * @return true if value equals string constant for "yes," false 
otherwise
         */
        virtual bool
  @@ -463,14 +466,17 @@
        }
   
        /**
  -      * Retrieve the list of imported stylesheets
  -      * 
  -      * @return vector of imported stylesheets
  +      * Add an imported stylesheet.
  +      *
  +      * @param theStylesheet The stylesheet to add.
  +      * @param fFront If true, the stylesheet is added to the front of the 
imports, instead of the end.
         */
  -     StylesheetVectorType&
  -     getImports()
  +     void
  +     addImport(
  +                     const Stylesheet*       theStylesheet,
  +                     bool                            fFront)
        {
  -             return m_imports;
  +             m_imports.insert(fFront ? m_imports.begin() : m_imports.end(), 
theStylesheet);
        }
   
        /**
  
  
  
  1.8       +16 -2     xml-xalan/c/src/XSLT/StylesheetConstructionContext.hpp
  
  Index: StylesheetConstructionContext.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetConstructionContext.hpp,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- StylesheetConstructionContext.hpp 2000/05/29 22:47:55     1.7
  +++ StylesheetConstructionContext.hpp 2000/06/07 18:35:01     1.8
  @@ -82,6 +82,7 @@
   class DocumentHandler;
   class Locator;
   class PrefixResolver;
  +class Stylesheet;
   class StylesheetRoot;
   class XalanDocument;
   class XPath;
  @@ -137,9 +138,22 @@
        create(XSLTInputSource&         theInputSource) = 0;
   
        /**
  +      * Create a new Stylesheet instance.  The StylesheetConstructionContext
  +      * instance owns the Stylesheet instance, and will delete it when asked
  +      * or when the StylesheetConstructionContext instance is destroyed.
  +      *
  +      * @param A reference to the StylesheetRoot instance.
  +      * @param theBaseIdentifier A URI to the stylesheet file.
  +      * @return A pointer to a new StylesheetRoot instance.
  +      */
  +     virtual Stylesheet*
  +     create(
  +                     StylesheetRoot&                 theStylesheetRoot,
  +                     const XalanDOMString&   theBaseIdentifier) = 0;
  +
  +     /**
         * Destroy a StylesheetRoot instance.  If this 
StylesheetConstructionContext
  -      * instance does not own the StylesheetRoot, it will not delete the
  -      * StylesheetRoot.
  +      * instance does not own the StylesheetRoot, it will not delete it
         *
         * @param theStylesheet A pointer to the StylesheetRoot instance to 
delete.
         */
  
  
  
  1.7       +16 -0     
xml-xalan/c/src/XSLT/StylesheetConstructionContextDefault.cpp
  
  Index: StylesheetConstructionContextDefault.cpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XSLT/StylesheetConstructionContextDefault.cpp,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- StylesheetConstructionContextDefault.cpp  2000/05/29 22:47:55     1.6
  +++ StylesheetConstructionContextDefault.cpp  2000/06/07 18:35:01     1.7
  @@ -184,6 +184,22 @@
   
   
   
  +Stylesheet*
  +StylesheetConstructionContextDefault::create(
  +                     StylesheetRoot&                 theStylesheetRoot,
  +                     const XalanDOMString&   theBaseIdentifier)
  +{
  +     Stylesheet* const       theStylesheet =
  +             new Stylesheet(
  +                     theStylesheetRoot,
  +                     theBaseIdentifier,
  +                     *this);
  +
  +     return theStylesheet;
  +}
  +
  +
  +
   void
   StylesheetConstructionContextDefault::destroy(StylesheetRoot*        
theStylesheetRoot)
   {
  
  
  
  1.8       +5 -0      
xml-xalan/c/src/XSLT/StylesheetConstructionContextDefault.hpp
  
  Index: StylesheetConstructionContextDefault.hpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XSLT/StylesheetConstructionContextDefault.hpp,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- StylesheetConstructionContextDefault.hpp  2000/05/29 22:47:55     1.7
  +++ StylesheetConstructionContextDefault.hpp  2000/06/07 18:35:01     1.8
  @@ -135,6 +135,11 @@
        virtual StylesheetRoot*
        create(XSLTInputSource&         theInputSource);
   
  +     virtual Stylesheet*
  +     create(
  +                     StylesheetRoot&                 theStylesheetRoot,
  +                     const XalanDOMString&   theBaseIdentifier);
  +
        virtual void
        destroy(StylesheetRoot*         theStylesheetRoot);
   
  
  
  
  1.31      +34 -15    xml-xalan/c/src/XSLT/StylesheetHandler.cpp
  
  Index: StylesheetHandler.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetHandler.cpp,v
  retrieving revision 1.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- StylesheetHandler.cpp     2000/05/31 15:02:46     1.30
  +++ StylesheetHandler.cpp     2000/06/07 18:35:01     1.31
  @@ -56,16 +56,19 @@
    */
   #include "StylesheetHandler.hpp"
   
  +
  +
   #include <algorithm>
  -#include <PlatformSupport/STLHelper.hpp>
  +#include <memory>
  +
   
   
   #include <sax/Locator.hpp>
   #include <sax/SAXException.hpp>
  -
   #include <util/XMLURL.hpp>
   
   
  +
   #include <XMLSupport/Formatter.hpp>
   
   
  @@ -73,6 +76,7 @@
   #include <PlatformSupport/AttributeListImpl.hpp>
   #include <PlatformSupport/DOMStringHelper.hpp>
   #include <PlatformSupport/StringTokenizer.hpp>
  +#include <PlatformSupport/STLHelper.hpp>
   
   
   
  @@ -305,7 +309,7 @@
                                                                                
                name, atts, lineNumber, columnNumber);
                                        m_elemStack.push_back(m_pTemplate);
                                        m_inTemplate = true;
  -                                     m_stylesheet.addTemplate(m_pTemplate);
  +                                     m_stylesheet.addTemplate(m_pTemplate, 
m_constructionContext);
                                        break;
   
                                case Constants::ELEMNAME_EXTENSION:
  @@ -1015,16 +1019,24 @@
        {
                m_exceptionPending = true;
   
  -             m_pendingException = e.getMessage();
  +             // Pop anything that's not an empty element...
  +             while(m_elemStack.back()->getXSLToken() != 
Constants::ELEMNAME_UNDEFINED)
  +             {
  +                     m_elemStack.pop_back();
  +             }
   
  -             m_elemStack.clear();
  +             m_pendingException = e.getMessage();
        }
        catch(...)
        {
                // $$$ ToDo: This probably should't happen, but it does...
                m_exceptionPending = true;
   
  -             m_elemStack.clear();
  +             // Pop anything that's not an empty element...
  +             while(m_elemStack.back()->getXSLToken() != 
Constants::ELEMNAME_UNDEFINED)
  +             {
  +                     m_elemStack.pop_back();
  +             }
   
                throw;
        }
  @@ -1112,6 +1124,9 @@
   
                if(equals(aname, Constants::ATTRNAME_HREF))
                {
  +#if !defined(XALAN_NO_NAMESPACES)
  +                     using std::auto_ptr;
  +#endif
                        foundIt = true;
                        
                        if(m_foundNotImport)
  @@ -1145,19 +1160,23 @@
   
                        const XalanDOMString    
theImportURI(hrefUrl->getURLText());
   
  -                     Stylesheet* pImportedStylesheet = new Stylesheet(
  +                     // This will take care of cleaning up the stylesheet if 
an exception
  +                     // is thrown.
  +                     auto_ptr<Stylesheet>    importedStylesheet( 
  +                             m_constructionContext.create(
                                m_stylesheet.getStylesheetRoot(), 
  -                             theImportURI,
  -                             m_constructionContext);
  +                             theImportURI));
  +
  +                     StylesheetHandler tp(*importedStylesheet.get(), 
m_constructionContext);
   
  -                     StylesheetHandler tp(*pImportedStylesheet, 
m_constructionContext);
  +                     m_constructionContext.parseXML(*hrefUrl, &tp, 
importedStylesheet.get());
   
  -                     m_constructionContext.parseXML(*hrefUrl, &tp, 
pImportedStylesheet);
  +                     // Add it to the front of the imports
  +                     m_stylesheet.addImport(importedStylesheet.get(), true);
   
  -                     // I'm going to insert the elements in backwards order, 
  -                     // so I can walk them 0 to n.
  -                     
m_stylesheet.getImports().insert(m_stylesheet.getImports().begin(),
  -                             pImportedStylesheet);
  +                     // The imported stylesheet is now owned by the 
stylesheet, so
  +                     // release the auto_ptr.
  +                     importedStylesheet.release();
   
                        importStack.pop_back();
                        
  
  
  
  1.44      +2 -2      xml-xalan/c/src/XSLT/XSLTEngineImpl.cpp
  
  Index: XSLTEngineImpl.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/XSLTEngineImpl.cpp,v
  retrieving revision 1.43
  retrieving revision 1.44
  diff -u -r1.43 -r1.44
  --- XSLTEngineImpl.cpp        2000/06/01 16:28:37     1.43
  +++ XSLTEngineImpl.cpp        2000/06/07 18:35:02     1.44
  @@ -463,7 +463,7 @@
   
                                if(false == isRoot)
                                {
  -                                     
prevStylesheet->getImports().push_back(stylesheet);
  +                                     prevStylesheet->addImport(stylesheet, 
false);
                                }
   
                                prevStylesheet = stylesheet;
  @@ -856,7 +856,7 @@
                        }
                        else
                        {
  -                             stylesheet = new 
Stylesheet(*const_cast<StylesheetRoot*>(m_stylesheetRoot), stringHolder, 
constructionContext);
  +                             stylesheet = 
constructionContext.create(*const_cast<StylesheetRoot*>(m_stylesheetRoot), 
stringHolder);
                        }
   
                        StylesheetHandler stylesheetProcessor(*stylesheet, 
constructionContext);
  
  
  

Reply via email to