summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordsmith <dsmith>2007-05-02 21:27:10 +0000
committerdsmith <dsmith>2007-05-02 21:27:10 +0000
commit94603dabf2f75cad1d43cf778f2d69e3b22790f5 (patch)
treeb7e213b91d120dedfc019f51e0e91d86ec9f7360
parent1ae2676e68a7dd10b64d25a4862f9506718284e2 (diff)
downloadsystemtap-steved-94603dabf2f75cad1d43cf778f2d69e3b22790f5.tar.gz
systemtap-steved-94603dabf2f75cad1d43cf778f2d69e3b22790f5.tar.xz
systemtap-steved-94603dabf2f75cad1d43cf778f2d69e3b22790f5.zip
2007-05-02 David Smith <dsmith@redhat.com>
* translate.cxx (c_tmpcounter::visit_functioncall): Updated temporary handling. (c_unparser::visit_functioncall): No longer copies numeric and string constants to temporary variables.
-rw-r--r--ChangeLog7
-rw-r--r--translate.cxx21
2 files changed, 22 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 2677c85b..505bac06 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2007-05-02 David Smith <dsmith@redhat.com>
+
+ * translate.cxx (c_tmpcounter::visit_functioncall): Updated
+ temporary handling.
+ (c_unparser::visit_functioncall): No longer copies numeric and
+ string constants to temporary variables.
+
2007-05-01 David Smith <dsmith@redhat.com>
* translate.cxx (c_tmpcounter::visit_binary_expression): Updated
diff --git a/translate.cxx b/translate.cxx
index c48fccdd..8996bc4c 100644
--- a/translate.cxx
+++ b/translate.cxx
@@ -3785,11 +3785,13 @@ c_tmpcounter::visit_functioncall (functioncall *e)
{
assert (e->referent != 0);
functiondecl* r = e->referent;
- // one temporary per argument
+ // one temporary per argument, unless literal numbers or strings
for (unsigned i=0; i<r->formal_args.size(); i++)
{
tmpvar t = parent->gensym (r->formal_args[i]->type);
- t.declare (*parent);
+ if (e->args[i]->tok->type != tok_number
+ && e->args[i]->tok->type != tok_string)
+ t.declare (*parent);
e->args[i]->visit (this);
}
}
@@ -3816,15 +3818,22 @@ c_unparser::visit_functioncall (functioncall* e)
for (unsigned i=0; i<e->args.size(); i++)
{
tmpvar t = gensym(e->args[i]->type);
- tmp.push_back(t);
if (r->formal_args[i]->type != e->args[i]->type)
throw semantic_error ("function argument type mismatch",
e->args[i]->tok, "vs", r->formal_args[i]->tok);
- o->newline() << "c->last_stmt = "
- << lex_cast_qstring(*e->args[i]->tok) << ";";
- c_assign (t.value(), e->args[i], "function actual argument evaluation");
+ if (e->args[i]->tok->type == tok_number
+ || e->args[i]->tok->type == tok_string)
+ t.override(c_expression(e->args[i]));
+ else
+ {
+ o->newline() << "c->last_stmt = "
+ << lex_cast_qstring(*e->args[i]->tok) << ";";
+ c_assign (t.value(), e->args[i],
+ "function actual argument evaluation");
+ }
+ tmp.push_back(t);
}
o->newline();