summaryrefslogtreecommitdiffstats
path: root/elaborate.cxx
diff options
context:
space:
mode:
authorddomingo <ddomingo@redhat.com>2008-09-29 16:08:16 +1000
committerddomingo <ddomingo@redhat.com>2008-09-29 16:08:16 +1000
commit2e66077954be9d219e0b87926af1dc87138d99dc (patch)
tree090acfc6e37967ec1e369d943f0a43764d47bfc5 /elaborate.cxx
parentc45b18d71eb8d57db62fced5774c12adcaf4eaba (diff)
parentb487a14d6d160f38dd1dbabe305b373b37972074 (diff)
downloadsystemtap-steved-2e66077954be9d219e0b87926af1dc87138d99dc.tar.gz
systemtap-steved-2e66077954be9d219e0b87926af1dc87138d99dc.tar.xz
systemtap-steved-2e66077954be9d219e0b87926af1dc87138d99dc.zip
Merge branch 'master' of ssh://sources.redhat.com/git/systemtap
Diffstat (limited to 'elaborate.cxx')
-rw-r--r--elaborate.cxx43
1 files changed, 30 insertions, 13 deletions
diff --git a/elaborate.cxx b/elaborate.cxx
index b476948b..94bfd1c5 100644
--- a/elaborate.cxx
+++ b/elaborate.cxx
@@ -1424,26 +1424,43 @@ systemtap_session::print_token (ostream& o, const token* tok)
void
systemtap_session::print_error (const semantic_error& e)
{
- string message_str;
- stringstream message;
+ string message_str[2];
// NB: we don't print error messages during listing mode.
if (listing_mode) return;
- message << "semantic error: " << e.what ();
- if (e.tok1 || e.tok2)
- message << ": ";
- if (e.tok1) print_token (message, e.tok1);
- message << e.msg2;
- if (e.tok2) print_token (message, e.tok2);
- message << endl;
- message_str = message.str();
+ // We generate two messages. The second one ([1]) is printed
+ // without token compression, for purposes of duplicate elimination.
+ // This way, the same message that may be generated once with a
+ // compressed and once with an uncompressed token still only gets
+ // printed once.
+ for (int i=0; i<2; i++)
+ {
+ stringstream message;
+
+ message << "semantic error: " << e.what ();
+ if (e.tok1 || e.tok2)
+ message << ": ";
+ if (e.tok1)
+ {
+ if (i == 0) print_token (message, e.tok1);
+ else message << *e.tok1;
+ }
+ message << e.msg2;
+ if (e.tok2)
+ {
+ if (i == 0) print_token (message, e.tok2);
+ else message << *e.tok2;
+ }
+ message << endl;
+ message_str[i] = message.str();
+ }
// Duplicate elimination
- if (seen_errors.find (message_str) == seen_errors.end())
+ if (seen_errors.find (message_str[1]) == seen_errors.end())
{
- seen_errors.insert (message_str);
- cerr << message_str;
+ seen_errors.insert (message_str[1]);
+ cerr << message_str[0];
}
if (e.chain)