[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