Commit 86deacc0 authored by Luuk van Dijk's avatar Luuk van Dijk

gc: better linenumbers for inlined functions

Fixes #2580 up to a point.

R=rsc
CC=golang-dev
https://golang.org/cl/5498068
parent 7350c771
...@@ -28,6 +28,8 @@ static Node* newlabel(void); ...@@ -28,6 +28,8 @@ static Node* newlabel(void);
static Node* inlsubst(Node *n); static Node* inlsubst(Node *n);
static NodeList* inlsubstlist(NodeList *ll); static NodeList* inlsubstlist(NodeList *ll);
static void setlno(Node*, int);
// Used during inlsubst[list] // Used during inlsubst[list]
static Node *inlfn; // function currently being inlined static Node *inlfn; // function currently being inlined
static Node *inlretlabel; // target of the goto substituted in place of a return static Node *inlretlabel; // target of the goto substituted in place of a return
...@@ -496,9 +498,10 @@ mkinlcall(Node **np, Node *fn) ...@@ -496,9 +498,10 @@ mkinlcall(Node **np, Node *fn)
call->nbody = body; call->nbody = body;
call->rlist = inlretvars; call->rlist = inlretvars;
call->type = n->type; call->type = n->type;
call->lineno = n->lineno;
call->typecheck = 1; call->typecheck = 1;
setlno(call, n->lineno);
*np = call; *np = call;
inlfn = saveinlfn; inlfn = saveinlfn;
...@@ -686,3 +689,32 @@ inlsubst(Node *n) ...@@ -686,3 +689,32 @@ inlsubst(Node *n)
return m; 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);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment