diff options
| author | Matthew Dempsky <mdempsky@google.com> | 2023-08-09 01:43:47 -0700 |
|---|---|---|
| committer | Matthew Dempsky <mdempsky@google.com> | 2023-08-11 17:45:02 +0000 |
| commit | 832212df9aba985bdc6a8378a821e1030554fa2f (patch) | |
| tree | 3ff8809afe792650337c1530acca744836c1fb3d /src/cmd/compile/internal/noder | |
| parent | 673d64ac7009b41c55b90b33ca346a86351959ee (diff) | |
| download | go-832212df9aba985bdc6a8378a821e1030554fa2f.tar.xz | |
cmd/compile: make use of types2.InitOrder
types2 already computes the order that package-level variables need to
be initialized in. Start using it.
Change-Id: Idf2740f963b8146f7c927f57effdbf245f41d355
Reviewed-on: https://go-review.googlesource.com/c/go/+/517617
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Diffstat (limited to 'src/cmd/compile/internal/noder')
| -rw-r--r-- | src/cmd/compile/internal/noder/reader.go | 44 | ||||
| -rw-r--r-- | src/cmd/compile/internal/noder/writer.go | 17 |
2 files changed, 33 insertions, 28 deletions
diff --git a/src/cmd/compile/internal/noder/reader.go b/src/cmd/compile/internal/noder/reader.go index 6dec060c8c..f63040ae13 100644 --- a/src/cmd/compile/internal/noder/reader.go +++ b/src/cmd/compile/internal/noder/reader.go @@ -3305,6 +3305,30 @@ func (r *reader) pkgInit(self *types.Pkg, target *ir.Package) { r.pkgDecls(target) + initOrder := make([]ir.Node, r.Len()) + for i := range initOrder { + lhs := make([]ir.Node, r.Len()) + for j := range lhs { + lhs[j] = r.obj() + } + rhs := r.expr() + pos := lhs[0].Pos() + + var as ir.Node + if len(lhs) == 1 { + as = typecheck.Stmt(ir.NewAssignStmt(pos, lhs[0], rhs)) + } else { + as = typecheck.Stmt(ir.NewAssignListStmt(pos, ir.OAS2, lhs, []ir.Node{rhs})) + } + + for _, v := range lhs { + v.(*ir.Name).Defn = as + } + + initOrder[i] = as + } + target.InitOrder = initOrder + r.Sync(pkgbits.SyncEOF) } @@ -3331,27 +3355,7 @@ func (r *reader) pkgDecls(target *ir.Package) { target.Decls = append(target.Decls, method.Nname.(*ir.Name).Func) case declVar: - pos := r.pos() names := r.pkgObjs(target) - values := r.exprList() - - if len(names) > 1 && len(values) == 1 { - as := ir.NewAssignListStmt(pos, ir.OAS2, nil, values) - for _, name := range names { - as.Lhs.Append(name) - name.Defn = as - } - target.Decls = append(target.Decls, as) - } else { - for i, name := range names { - as := ir.NewAssignStmt(pos, name, nil) - if i < len(values) { - as.Y = values[i] - } - name.Defn = as - target.Decls = append(target.Decls, as) - } - } if n := r.Len(); n > 0 { assert(len(names) == 1) diff --git a/src/cmd/compile/internal/noder/writer.go b/src/cmd/compile/internal/noder/writer.go index 1d8c0bf933..77708245ae 100644 --- a/src/cmd/compile/internal/noder/writer.go +++ b/src/cmd/compile/internal/noder/writer.go @@ -2534,6 +2534,15 @@ func (w *writer) pkgInit(noders []*noder) { } w.Code(declEnd) + w.Len(len(w.p.info.InitOrder)) + for _, init := range w.p.info.InitOrder { + w.Len(len(init.Lhs)) + for _, v := range init.Lhs { + w.obj(v, nil) + } + w.expr(init.Rhs) + } + w.Sync(pkgbits.SyncEOF) } @@ -2591,16 +2600,8 @@ func (w *writer) pkgDecl(decl syntax.Decl) { case *syntax.VarDecl: w.Code(declVar) - w.pos(decl) w.pkgObjs(decl.NameList...) - // TODO(mdempsky): It would make sense to use multiExpr here, but - // that results in IR that confuses pkginit/initorder.go. So we - // continue using exprList, and let typecheck handle inserting any - // implicit conversions. That's okay though, because package-scope - // assignments never require dictionaries. - w.exprList(decl.Values) - var embeds []pragmaEmbed if p, ok := decl.Pragma.(*pragmas); ok { embeds = p.Embeds |
