]> Cypherpunks repositories - gostls13.git/commitdiff
gc: better linenumbers for inlined functions
authorLuuk van Dijk <lvd@golang.org>
Thu, 22 Dec 2011 16:31:54 +0000 (17:31 +0100)
committerLuuk van Dijk <lvd@golang.org>
Thu, 22 Dec 2011 16:31:54 +0000 (17:31 +0100)
Fixes #2580 up to a point.

R=rsc
CC=golang-dev
https://golang.org/cl/5498068

src/cmd/gc/inl.c

index e2d122c91dc64726c4b760a38c6281fa81551551..982013619de2cfe18f402e94a03bc2ee3550ff36 100644 (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);
+}