dbertoni    01/12/19 20:20:52

  Modified:    c/src/XSLT VariablesStack.cpp VariablesStack.hpp
  Log:
  Detect when a variable is circularly defined.
  
  Revision  Changes    Path
  1.21      +22 -1     xml-xalan/c/src/XSLT/VariablesStack.cpp
  
  Index: VariablesStack.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/VariablesStack.cpp,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- VariablesStack.cpp        2001/09/26 21:30:23     1.20
  +++ VariablesStack.cpp        2001/12/20 04:20:52     1.21
  @@ -75,7 +75,8 @@
        m_stack(),
        m_globalStackFrameIndex(-1),
        m_globalStackFrameMarked(false),
  -     m_currentStackFrameIndex(0)
  +     m_currentStackFrameIndex(0),
  +     m_guardStack()
   {
        m_stack.reserve(eDefaultStackSize);
   }
  @@ -97,6 +98,7 @@
        }
   
        m_stack.clear();
  +     m_guardStack.clear();
   
        m_globalStackFrameMarked = false;
        m_globalStackFrameIndex = -1;
  @@ -413,6 +415,21 @@
                                XalanNode* const        doc = 
executionContext.getRootDocument();
                                assert(doc != 0);
   
  +#if !defined (XALAN_NO_NAMESPACES)
  +                             using std::find;
  +#endif
  +
  +                             // See if the ElemVariable instance is already 
being evaluated...
  +                             if (find(m_guardStack.begin(), 
m_guardStack.end(), var) != m_guardStack.end())
  +                             {
  +                                     executionContext.error(
  +                                             "A circular variable definition 
was detected",
  +                                             doc,
  +                                             var->getLocator());
  +                             }
  +
  +                             m_guardStack.push_back(var);
  +
                                // We need to set up a stack frame for the 
variable's execution...
                                typedef 
StylesheetExecutionContext::PushAndPopContextMarker     PushAndPopContextMarker;
   
  @@ -420,6 +437,10 @@
   
                                theNewValue = var->getValue(executionContext, 
doc);
                                assert(theNewValue.null() == false);
  +
  +                             assert(m_guardStack.empty() == false);
  +
  +                             m_guardStack.pop_back();
   
                                theEntry->setValue(theNewValue);
                                theEntry->activate();
  
  
  
  1.15      +14 -5     xml-xalan/c/src/XSLT/VariablesStack.hpp
  
  Index: VariablesStack.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/VariablesStack.hpp,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- VariablesStack.hpp        2001/08/13 17:08:54     1.14
  +++ VariablesStack.hpp        2001/12/20 04:20:52     1.15
  @@ -176,8 +176,10 @@
   
   #if defined(XALAN_NO_NAMESPACES)
        typedef vector<ParamsVectorEntry>               ParamsVectorType;
  +     typedef vector<const ElemVariable*>             RecursionGuardStackType;
   #else
  -     typedef std::vector<ParamsVectorEntry>  ParamsVectorType;
  +     typedef std::vector<ParamsVectorEntry>          ParamsVectorType;
  +     typedef std::vector<const ElemVariable*>        RecursionGuardStackType;
   #endif
   
        /**
  @@ -569,18 +571,25 @@
                        bool                            fSearchGlobalSpace);
   
   
  -     VariableStackStackType  m_stack;
  +     VariableStackStackType          m_stack;
   
  -     int                                             m_globalStackFrameIndex;
  +     int                                                     
m_globalStackFrameIndex;
   
  -     bool                                    m_globalStackFrameMarked;
  +     bool                                            
m_globalStackFrameMarked;
   
        /**
         * This is the top of the stack frame from where a search 
         * for a variable or param should take place.  It may not 
         * be the real stack top.
         */
  -     unsigned int                    m_currentStackFrameIndex;       
  +     unsigned int                            m_currentStackFrameIndex;       
  +
  +     /**
  +      * This will be a stack for any variable definitions
  +      * that are being evaluated dynamically, to protect
  +      * against circular definitions.
  +      */
  +     RecursionGuardStackType         m_guardStack;
   };
   
   
  
  
  

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

Reply via email to