summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWenji Huang <wenji.huang@oracle.com>2008-12-02 19:50:02 -0500
committerWenji Huang <wenji.huang@oracle.com>2008-12-02 19:50:02 -0500
commit271d408e09e033857658c83cb722078fab02edda (patch)
tree805f69decf55f5f10dfcd48f26bd08724ab89a2d
parent23e151ca1065f3003f53f4fb8e388f0989da887a (diff)
downloadsystemtap-steved-271d408e09e033857658c83cb722078fab02edda.tar.gz
systemtap-steved-271d408e09e033857658c83cb722078fab02edda.tar.xz
systemtap-steved-271d408e09e033857658c83cb722078fab02edda.zip
PR7053: Add checking empty aggregate and default print where @count==0.
-rw-r--r--elaborate.cxx38
-rw-r--r--testsuite/ChangeLog4
-rw-r--r--testsuite/systemtap.base/global_stat.exp13
3 files changed, 54 insertions, 1 deletions
diff --git a/elaborate.cxx b/elaborate.cxx
index 84866c35..edd4668d 100644
--- a/elaborate.cxx
+++ b/elaborate.cxx
@@ -1243,7 +1243,43 @@ void add_global_var_display (systemtap_session& s)
}
else
pf->args.push_back(g_sym);
- b->statements.push_back(feb);
+
+ /* PR7053: Checking empty aggregate for global variable */
+ if (l->type == pe_stats) {
+ stat_op *so= new stat_op;
+ so->ctype = sc_count;
+ so->type = pe_long;
+ so->stat = g_sym;
+ so->tok = l->tok;
+ comparison *be = new comparison;
+ be->op = ">";
+ be->tok = l->tok;
+ be->left = so;
+ be->right = new literal_number(0);
+
+ /* Create printf @count=0x0 in else block */
+ print_format* pf_0 = new print_format;
+ pf_0->print_to_stream = true;
+ pf_0->print_with_format = true;
+ pf_0->print_with_delim = false;
+ pf_0->print_with_newline = false;
+ pf_0->print_char = false;
+ pf_0->raw_components += l->name;
+ pf_0->raw_components += " @count=0x0\\n";
+ pf_0->tok = print_tok;
+ pf_0->components = print_format::string_to_components(pf_0->raw_components);
+ expr_statement* feb_else = new expr_statement;
+ feb_else->value = pf_0;
+ feb_else->tok = print_tok;
+ if_statement *ifs = new if_statement;
+ ifs->tok = l->tok;
+ ifs->condition = be;
+ ifs->thenblock = feb ;
+ ifs->elseblock = feb_else;
+ b->statements.push_back(ifs);
+ }
+ else /* other non-stat cases */
+ b->statements.push_back(feb);
}
else // Array
{
diff --git a/testsuite/ChangeLog b/testsuite/ChangeLog
index c1ae1420..c38a2eb2 100644
--- a/testsuite/ChangeLog
+++ b/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2008-12-02 Wenji Huang <wenji.huang@oracle.com>
+ PR7053.
+ * systemtap.base/global_stat.exp: New test.
+
2008-11-29 Frank Ch. Eigler <fche@elastic.org>
* systemtap.base/uprobes.exp: Simplify -p5 test.
diff --git a/testsuite/systemtap.base/global_stat.exp b/testsuite/systemtap.base/global_stat.exp
new file mode 100644
index 00000000..704556f6
--- /dev/null
+++ b/testsuite/systemtap.base/global_stat.exp
@@ -0,0 +1,13 @@
+if {![installtest_p]} {
+ untested global_stat
+ return
+}
+
+spawn stap -e {global var; probe never {var<<<1} probe begin {exit()}}
+expect {
+ -timeout 60
+ "var @count=0x0" { pass "global_stat" }
+ timeout {fail "global_stat: unexpected timeout"}
+ eof {fail "global_stat: unexpected EOF"}
+}
+wait;close