[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdevelop/languages/cpp/parser/rpp
From:       David Nolden <david.nolden.kde () art-master ! de>
Date:       2009-03-01 0:38:20
Message-ID: 1235867900.983901.9321.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 933475 by zwabel:

- Track macro-expansion depth, and break expansion if a maximum depth of 50 has been \
                reached
- Correctly respect the "hidden" flag that is set while expanding a macro to prevent \
endless recursion Each of these fixes a recently introduced crash during \
preprocessing/parsing due to endless recursion


 M  +20 -7     pp-macro-expander.cpp  
 M  +1 -0      pp-macro-expander.h  


--- trunk/KDE/kdevelop/languages/cpp/parser/rpp/pp-macro-expander.cpp #933474:933475
@@ -38,6 +38,8 @@
 #include "preprocessor.h"
 #include "chartools.h"
 
+const int maxMacroExpansionDepth = 50;
+
 using namespace KDevelop;
 
 QString joinIndexVector(const uint* arrays, uint size, QString between) {
@@ -70,6 +72,7 @@
 pp_frame::pp_frame(pp_macro* __expandingMacro, const QList<pp_actual>& __actuals)
   : expandingMacro(__expandingMacro)
   , actuals(__actuals)
+  , depth(0)
 {
 }
 
@@ -388,7 +391,7 @@
         
         pp_macro* macro = m_engine->environment()->retrieveMacro(previous, false);
         
-        if(!macro || !macro->function_like) {
+        if(!macro || !macro->function_like || !macro->defined || macro->hidden) {
           output << input;
           ++input;
           continue;
@@ -494,12 +497,22 @@
         EnableMacroExpansion enable(output, input.inputPosition()); //Configure the \
output-stream so it marks all stored input-positions as transformed through a macro  
         pp_frame frame(macro, actuals);
-        pp_macro_expander expand_macro(m_engine, &frame);
-        macro->hidden = true;
-        Stream ms(macro->definition(), macro->definitionSize(), \
                Anchor(input.inputPosition(), true));
-        ms.setOriginalInputPosition(input.originalInputPosition());
-        expand_macro(ms, output);
-        macro->hidden = false;
+        if(m_frame)
+          frame.depth = m_frame->depth + 1;
+        
+        if(frame.depth >= maxMacroExpansionDepth) 
+        {
+          kDebug() << "reached maximum macro-expansion depth while expanding" << \
macro->name.str(); +          output << input;
+          ++input;
+        }else{
+          pp_macro_expander expand_macro(m_engine, &frame);
+          macro->hidden = true;
+          Stream ms(macro->definition(), macro->definitionSize(), \
Anchor(input.inputPosition(), true)); +          \
ms.setOriginalInputPosition(input.originalInputPosition()); +          \
expand_macro(ms, output); +          macro->hidden = false;
+        }
       } else {
         output << input;
         ++input;
--- trunk/KDE/kdevelop/languages/cpp/parser/rpp/pp-macro-expander.h #933474:933475
@@ -76,6 +76,7 @@
 public:
   pp_frame (pp_macro* __expandingMacro, const QList<pp_actual>& __actuals);
 
+  int depth;
   pp_macro* expandingMacro;
   QList<pp_actual> actuals;
 };


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic