From 497ed0cd1f659fb01e2cb3cb8e4ce962c8edbd22 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Wed, 10 Jun 2015 16:20:54 -0700 Subject: [PATCH] cmd/compile: be explicit about NodeList List storage stealing This only matters in a couple of places. Be explicit about it. This helps to narrow the scope of any given NodeList-related change. Change-Id: I506f2ee0417bc6eb70d4bc0456d87a92cd6f7973 --- src/cmd/compile/internal/gc/go.y | 8 ++++---- src/cmd/compile/internal/gc/syntax.go | 27 ++++++++++++++++++--------- src/cmd/compile/internal/gc/y.go | 8 ++++---- 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/cmd/compile/internal/gc/go.y b/src/cmd/compile/internal/gc/go.y index 1e99647ae5bfde..5ad497ae7856e3 100644 --- a/src/cmd/compile/internal/gc/go.y +++ b/src/cmd/compile/internal/gc/go.y @@ -774,7 +774,7 @@ if_stmt: if nn.N.Op == OIF { popdcl(); } - n.Rlist = list1(nn.N); + n.Rlist = list1Steal(nn.N) n = nn.N; } } @@ -1811,7 +1811,7 @@ non_dcl_stmt: $1.Name.Defn = $4; l = list1($1); if $4 != nil { - l = list(l, $4); + l = listSteal(l, $4) } $$ = liststmt(l); } @@ -1868,14 +1868,14 @@ stmt_list: { $$ = nil; if $1 != nil { - $$ = list1($1); + $$ = list1Steal($1) } } | stmt_list ';' stmt { $$ = $1; if $3 != nil { - $$ = list($$, $3); + $$ = listSteal($$, $3) } } diff --git a/src/cmd/compile/internal/gc/syntax.go b/src/cmd/compile/internal/gc/syntax.go index ffd3c04aacdaea..6c396fd923dd59 100644 --- a/src/cmd/compile/internal/gc/syntax.go +++ b/src/cmd/compile/internal/gc/syntax.go @@ -387,15 +387,6 @@ func list1(n *Node) *NodeList { if n == nil { return nil } - if n.Op == OBLOCK && n.Ninit == nil { - // Flatten list and steal storage. - // Poison pointer to catch errant uses. - l := n.List - - n.List = nil - return l - } - l := new(NodeList) l.N = n l.End = l @@ -407,6 +398,24 @@ func list(l *NodeList, n *Node) *NodeList { return concat(l, list1(n)) } +func list1Steal(n *Node) *NodeList { + if n == nil { + return nil + } + if n.Op == OBLOCK && n.Ninit == nil { + // Flatten list and steal storage. + // Poison pointer to catch errant uses. + l := n.List + n.List = nil + return l + } + return list1(n) +} + +func listSteal(l *NodeList, n *Node) *NodeList { + return concat(l, list1Steal(n)) +} + // listsort sorts *l in place according to the 3-way comparison function f. // The algorithm is mergesort, so it is guaranteed to be O(n log n). func listsort(l **NodeList, f func(*Node, *Node) int) { diff --git a/src/cmd/compile/internal/gc/y.go b/src/cmd/compile/internal/gc/y.go index 37018af9220ace..546860ac2c3661 100644 --- a/src/cmd/compile/internal/gc/y.go +++ b/src/cmd/compile/internal/gc/y.go @@ -1882,7 +1882,7 @@ yydefault: if nn.N.Op == OIF { popdcl() } - n.Rlist = list1(nn.N) + n.Rlist = list1Steal(nn.N) n = nn.N } } @@ -2985,7 +2985,7 @@ yydefault: yyDollar[1].node.Name.Defn = yyDollar[4].node l = list1(yyDollar[1].node) if yyDollar[4].node != nil { - l = list(l, yyDollar[4].node) + l = listSteal(l, yyDollar[4].node) } yyVAL.node = liststmt(l) } @@ -3056,7 +3056,7 @@ yydefault: { yyVAL.list = nil if yyDollar[1].node != nil { - yyVAL.list = list1(yyDollar[1].node) + yyVAL.list = list1Steal(yyDollar[1].node) } } case 271: @@ -3065,7 +3065,7 @@ yydefault: { yyVAL.list = yyDollar[1].list if yyDollar[3].node != nil { - yyVAL.list = list(yyVAL.list, yyDollar[3].node) + yyVAL.list = listSteal(yyVAL.list, yyDollar[3].node) } } case 272: