1
0
mirror of https://github.com/golang/go synced 2024-11-21 23:24:41 -07:00

gc: better linenumbers for inlined functions

Fixes #2580 up to a point.

R=rsc
CC=golang-dev
https://golang.org/cl/5498068
This commit is contained in:
Luuk van Dijk 2011-12-22 17:31:54 +01:00
parent 7350c771f8
commit 86deacc0bc

View File

@ -28,6 +28,8 @@ static Node* newlabel(void);
static Node* inlsubst(Node *n);
static NodeList* inlsubstlist(NodeList *ll);
static void setlno(Node*, int);
// Used during inlsubst[list]
static Node *inlfn; // function currently being inlined
static Node *inlretlabel; // target of the goto substituted in place of a return
@ -496,9 +498,10 @@ mkinlcall(Node **np, Node *fn)
call->nbody = body;
call->rlist = inlretvars;
call->type = n->type;
call->lineno = n->lineno;
call->typecheck = 1;
setlno(call, n->lineno);
*np = call;
inlfn = saveinlfn;
@ -686,3 +689,32 @@ inlsubst(Node *n)
return m;
}
// Plaster over linenumbers
static void
setlnolist(NodeList *ll, int lno)
{
for(;ll;ll=ll->next)
setlno(ll->n, lno);
}
static void
setlno(Node *n, int lno)
{
if(!n)
return;
// don't clobber names, unless they're freshly synthesized
if(n->op != ONAME || n->lineno == 0)
n->lineno = lno;
setlno(n->left, lno);
setlno(n->right, lno);
setlnolist(n->list, lno);
setlnolist(n->rlist, lno);
setlnolist(n->ninit, lno);
setlno(n->ntest, lno);
setlno(n->nincr, lno);
setlnolist(n->nbody, lno);
setlnolist(n->nelse, lno);
}