return n.Op == OARRAYLIT || n.Op == OSTRUCTLIT
}
-// gen_as_init attempts to emit static data for n and reports whether it succeeded.
-// If reportOnly is true, it does not emit static data and does not modify the AST.
-func gen_as_init(n *Node, reportOnly bool) bool {
- success := genAsInitNoCheck(n, reportOnly)
- if !success && n.IsStatic {
- Dump("\ngen_as_init", n)
- Fatalf("gen_as_init couldn't generate static data")
- }
- return success
-}
-
-func genAsInitNoCheck(n *Node, reportOnly bool) bool {
- if !n.IsStatic {
- return false
- }
-
+func genAsInitNoCheck(n *Node) bool {
nr := n.Right
nl := n.Left
if nr == nil {
return false
}
- if !reportOnly {
- nam.Xoffset += int64(array_array)
- gdata(&nam, ptr, Widthptr)
+ nam.Xoffset += int64(array_array)
+ gdata(&nam, ptr, Widthptr)
- nam.Xoffset += int64(array_nel) - int64(array_array)
- var nod1 Node
- Nodconst(&nod1, Types[TINT], nr.Type.NumElem())
- gdata(&nam, &nod1, Widthint)
+ nam.Xoffset += int64(array_nel) - int64(array_array)
+ var nod1 Node
+ Nodconst(&nod1, Types[TINT], nr.Type.NumElem())
+ gdata(&nam, &nod1, Widthint)
- nam.Xoffset += int64(array_cap) - int64(array_nel)
- gdata(&nam, &nod1, Widthint)
- }
+ nam.Xoffset += int64(array_cap) - int64(array_nel)
+ gdata(&nam, &nod1, Widthint)
return true
case OLITERAL:
- if !reportOnly {
- gdata(&nam, nr, int(nr.Type.Width))
- }
+ gdata(&nam, nr, int(nr.Type.Width))
return true
}
}
case OAS, OASWB:
// Generate static data rather than code, if possible.
- if gen_as_init(n, true) {
- if !gen_as_init(n, false) {
- Fatalf("non-static data marked as static: %v\n\n", n)
+ if n.IsStatic {
+ if !genAsInitNoCheck(n) {
+ Dump("\ngen_as_init", n)
+ Fatalf("gen_as_init couldn't generate static data")
}
return
}