init.Append(a)
}
-func maplit(n *Node, m *Node, init *Nodes) {
+func maplit(ctxt int, n *Node, m *Node, init *Nodes) {
+ ctxt = 0
+
// make the map var
nerr := nerrors
dowidth(tv)
// make and initialize static arrays
- vstatk := staticname(tk, 0)
- vstatv := staticname(tv, 0)
+ vstatk := staticname(tk, ctxt)
+ vstatv := staticname(tv, ctxt)
b := int64(0)
for _, r := range n.List.Slice() {
}
}
-func anylit(n *Node, var_ *Node, init *Nodes) {
+func anylit(ctxt int, n *Node, var_ *Node, init *Nodes) {
t := n.Type
switch n.Op {
default:
var_ = Nod(OIND, var_, nil)
var_ = typecheck(var_, Erv|Easgn)
- anylit(n.Left, var_, init)
+ anylit(ctxt, n.Left, var_, init)
case OSTRUCTLIT:
if !t.IsStruct() {
}
if var_.isSimpleName() && n.List.Len() > 4 {
- // lay out static data
- vstat := staticname(t, 0)
+ if ctxt == 0 {
+ // lay out static data
+ vstat := staticname(t, ctxt)
- structlit(0, 1, n, vstat, init)
+ structlit(ctxt, 1, n, vstat, init)
- // copy static to var
- a := Nod(OAS, var_, vstat)
+ // copy static to var
+ a := Nod(OAS, var_, vstat)
- a = typecheck(a, Etop)
- a = walkexpr(a, init)
- init.Append(a)
+ a = typecheck(a, Etop)
+ a = walkexpr(a, init)
+ init.Append(a)
- // add expressions to automatic
- structlit(0, 2, n, var_, init)
+ // add expressions to automatic
+ structlit(ctxt, 2, n, var_, init)
+ break
+ }
+
+ structlit(ctxt, 1, n, var_, init)
+ structlit(ctxt, 2, n, var_, init)
break
}
init.Append(a)
}
- structlit(0, 3, n, var_, init)
+ structlit(ctxt, 3, n, var_, init)
case OARRAYLIT:
if t.IsSlice() {
- slicelit(0, n, var_, init)
+ slicelit(ctxt, n, var_, init)
break
}
if !t.IsArray() {
}
if var_.isSimpleName() && n.List.Len() > 4 {
- // lay out static data
- vstat := staticname(t, 0)
+ if ctxt == 0 {
+ // lay out static data
+ vstat := staticname(t, ctxt)
- arraylit(1, 1, n, vstat, init)
+ arraylit(1, 1, n, vstat, init)
- // copy static to automatic
- a := Nod(OAS, var_, vstat)
- a = typecheck(a, Etop)
- a = walkexpr(a, init)
- init.Append(a)
+ // copy static to automatic
+ a := Nod(OAS, var_, vstat)
+
+ a = typecheck(a, Etop)
+ a = walkexpr(a, init)
+ init.Append(a)
+
+ // add expressions to automatic
+ arraylit(ctxt, 2, n, var_, init)
- // add expressions to automatic
- arraylit(0, 2, n, var_, init)
+ break
+ }
+ arraylit(ctxt, 1, n, var_, init)
+ arraylit(ctxt, 2, n, var_, init)
break
}
init.Append(a)
}
- arraylit(0, 3, n, var_, init)
+ arraylit(ctxt, 3, n, var_, init)
case OMAPLIT:
if !t.IsMap() {
Fatalf("anylit: not map")
}
- maplit(n, var_, init)
+ maplit(ctxt, n, var_, init)
}
}
return false
}
+ // context is init() function.
+ // implies generated data executed
+ // exactly once and not subject to races.
+ ctxt := 0
+
+ // if(n->dodata == 1)
+ // ctxt = 1;
+
switch n.Right.Op {
default:
// not a special composit literal assignment
// not a special composit literal assignment
return false
}
- anylit(n.Right, n.Left, init)
+ anylit(ctxt, n.Right, n.Left, init)
}
n.Op = OEMPTY