diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | translate.cxx | 21 |
2 files changed, 22 insertions, 6 deletions
@@ -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(); |