diff options
author | Francois Ferrand <thetypz@gmail.com> | 2012-03-16 14:22:17 +0100 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@nokia.com> | 2012-03-19 10:35:21 +0100 |
commit | 558b6e08ae2709549cecdd9698b577c1f8b4f964 (patch) | |
tree | 65a74f04cd7882c47d0043c17866f50648ec3ab3 /src/libs/cplusplus/pp-macro-expander.cpp | |
parent | 3e9105e40150a413b65d21588a468e7914697bcc (diff) | |
download | qt-creator-558b6e08ae2709549cecdd9698b577c1f8b4f964.tar.gz |
Preprocessor: fix expanding macro arguments.
Expanding macro arguments can add or remove argument for a nested macro,
so the actual parameters list was not correct.
Also, remove unused arguments reference list and reserve space for the
expected number of arguments.
Change-Id: I4cf369cbb3909927c6bf65750bd715fa6f070fad
Reviewed-by: Erik Verbruggen <erik.verbruggen@nokia.com>
Diffstat (limited to 'src/libs/cplusplus/pp-macro-expander.cpp')
-rw-r--r-- | src/libs/cplusplus/pp-macro-expander.cpp | 48 |
1 files changed, 35 insertions, 13 deletions
diff --git a/src/libs/cplusplus/pp-macro-expander.cpp b/src/libs/cplusplus/pp-macro-expander.cpp index 3aa53c7d7e..cde82884c0 100644 --- a/src/libs/cplusplus/pp-macro-expander.cpp +++ b/src/libs/cplusplus/pp-macro-expander.cpp @@ -103,7 +103,6 @@ const char *MacroExpander::operator()(const char *first, const char *last, const char *MacroExpander::expand(const char *__first, const char *__last, QByteArray *__result) { - const char *start = __first; __first = skip_blanks (__first, __last); lines = skip_blanks.lines; @@ -362,20 +361,18 @@ const char *MacroExpander::expand(const char *__first, const char *__last, } QVector<QByteArray> actuals; - QVector<MacroArgumentReference> actuals_ref; - actuals.reserve (5); + actuals.reserve(macro->formals().size()); ++arg_it; // skip '(' MacroExpander expand_actual (env, frame); - const char *arg_end = skip_argument_variadics (actuals, macro, arg_it, __last); + const char *arg_end = skip_argument(arg_it, __last); if (arg_it != arg_end || (arg_end != __last && *arg_end == ',')) { - actuals_ref.append(MacroArgumentReference(start_offset + (arg_it-start), arg_end - arg_it)); - const QByteArray actual (arg_it, arg_end - arg_it); + const QByteArray actual(arg_it, arg_end - arg_it); QByteArray expanded; - expand_actual (actual.constBegin (), actual.constEnd (), &expanded); - actuals.push_back (expanded); + expand_actual(actual.constBegin (), actual.constEnd (), &expanded); + pushActuals(actuals, macro, expanded); arg_it = arg_end; } @@ -383,12 +380,11 @@ const char *MacroExpander::expand(const char *__first, const char *__last, { ++arg_it; // skip ',' - arg_end = skip_argument_variadics (actuals, macro, arg_it, __last); - actuals_ref.append(MacroArgumentReference(start_offset + (arg_it-start), arg_end - arg_it)); - const QByteArray actual (arg_it, arg_end - arg_it); + arg_end = skip_argument(arg_it, __last); + const QByteArray actual(arg_it, arg_end - arg_it); QByteArray expanded; - expand_actual (actual.constBegin (), actual.constEnd (), &expanded); - actuals.push_back (expanded); + expand_actual(actual.constBegin (), actual.constEnd (), &expanded); + pushActuals(actuals, macro, expanded); arg_it = arg_end; } @@ -425,3 +421,29 @@ const char *MacroExpander::skip_argument_variadics (QVector<QByteArray> const &_ return arg_end; } + +void MacroExpander::pushActuals(QVector<QByteArray> & actuals, Macro *__macro, const QByteArray& expanded) +{ + if (__macro->isVariadic() && actuals.count() == __macro->formals().count()) { + //already enough params --> append to the last one + QByteArray& b = actuals.last(); + b.append(","); + b.append(expanded.trimmed()); + } + else { + const char * __first = expanded.constData(); + const char * __last = __first + expanded.length(); + const char * arg_it = __first; + + const char *arg_end = skip_argument_variadics(actuals, __macro, arg_it, __last); + actuals.push_back(QByteArray(arg_it, arg_end - arg_it).trimmed()); + arg_it = arg_end; + + while (arg_it != __last) { + ++arg_it; // skip ',' + const char *arg_end = skip_argument_variadics(actuals, __macro, arg_it, __last); + actuals.push_back(QByteArray(arg_it, arg_end - arg_it).trimmed()); + arg_it = arg_end; + } + } +} |