mirror of https://github.com/golang/go.git
[dev.unified] cmd/compile/internal/noder: add optExpr for optional expressions
Previously, {writer,reader}.expr would allow for nil
expressions (i.e., no expression at all, not a "nil" identifier). But
only a few contexts allow this, and it simplifies some logic if we can
assume the expression is non-nil.
So this CL introduces optExpr as a wrapper method for handling nil
expressions specially.
Change-Id: I438bae7a3191126f7790ec0bf5b77320fe855514
Reviewed-on: https://go-review.googlesource.com/c/go/+/410099
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
This commit is contained in:
parent
6c33f1d52e
commit
55fc07e164
|
|
@ -38,11 +38,10 @@ func (c codeExpr) Value() int { return int(c) }
|
||||||
|
|
||||||
// TODO(mdempsky): Split expr into addr, for lvalues.
|
// TODO(mdempsky): Split expr into addr, for lvalues.
|
||||||
const (
|
const (
|
||||||
exprNone codeExpr = iota
|
exprConst codeExpr = iota
|
||||||
exprConst
|
exprType // type expression
|
||||||
exprType // type expression
|
exprLocal // local variable
|
||||||
exprLocal // local variable
|
exprGlobal // global variable or function
|
||||||
exprGlobal // global variable or function
|
|
||||||
exprBlank
|
exprBlank
|
||||||
exprCompLit
|
exprCompLit
|
||||||
exprFuncLit
|
exprFuncLit
|
||||||
|
|
|
||||||
|
|
@ -1380,7 +1380,7 @@ func (r *reader) forStmt(label *types.Sym) ir.Node {
|
||||||
|
|
||||||
pos := r.pos()
|
pos := r.pos()
|
||||||
init := r.stmt()
|
init := r.stmt()
|
||||||
cond := r.expr()
|
cond := r.optExpr()
|
||||||
post := r.stmt()
|
post := r.stmt()
|
||||||
body := r.blockStmt()
|
body := r.blockStmt()
|
||||||
r.closeAnotherScope()
|
r.closeAnotherScope()
|
||||||
|
|
@ -1450,7 +1450,7 @@ func (r *reader) switchStmt(label *types.Sym) ir.Node {
|
||||||
iface = x.Type()
|
iface = x.Type()
|
||||||
tag = ir.NewTypeSwitchGuard(pos, ident, x)
|
tag = ir.NewTypeSwitchGuard(pos, ident, x)
|
||||||
} else {
|
} else {
|
||||||
tag = r.expr()
|
tag = r.optExpr()
|
||||||
}
|
}
|
||||||
|
|
||||||
clauses := make([]*ir.CaseClause, r.Len())
|
clauses := make([]*ir.CaseClause, r.Len())
|
||||||
|
|
@ -1551,9 +1551,6 @@ func (r *reader) expr() (res ir.Node) {
|
||||||
default:
|
default:
|
||||||
panic("unhandled expression")
|
panic("unhandled expression")
|
||||||
|
|
||||||
case exprNone:
|
|
||||||
return nil
|
|
||||||
|
|
||||||
case exprBlank:
|
case exprBlank:
|
||||||
// blank only allowed in LHS of assignments
|
// blank only allowed in LHS of assignments
|
||||||
// TODO(mdempsky): Handle directly in assignList instead?
|
// TODO(mdempsky): Handle directly in assignList instead?
|
||||||
|
|
@ -1622,7 +1619,7 @@ func (r *reader) expr() (res ir.Node) {
|
||||||
pos := r.pos()
|
pos := r.pos()
|
||||||
var index [3]ir.Node
|
var index [3]ir.Node
|
||||||
for i := range index {
|
for i := range index {
|
||||||
index[i] = r.expr()
|
index[i] = r.optExpr()
|
||||||
}
|
}
|
||||||
op := ir.OSLICE
|
op := ir.OSLICE
|
||||||
if index[2] != nil {
|
if index[2] != nil {
|
||||||
|
|
@ -1701,6 +1698,13 @@ func (r *reader) expr() (res ir.Node) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *reader) optExpr() ir.Node {
|
||||||
|
if r.Bool() {
|
||||||
|
return r.expr()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (r *reader) compLit() ir.Node {
|
func (r *reader) compLit() ir.Node {
|
||||||
r.Sync(pkgbits.SyncCompLit)
|
r.Sync(pkgbits.SyncCompLit)
|
||||||
pos := r.pos()
|
pos := r.pos()
|
||||||
|
|
|
||||||
|
|
@ -1077,7 +1077,7 @@ func (w *writer) forStmt(stmt *syntax.ForStmt) {
|
||||||
} else {
|
} else {
|
||||||
w.pos(stmt)
|
w.pos(stmt)
|
||||||
w.stmt(stmt.Init)
|
w.stmt(stmt.Init)
|
||||||
w.expr(stmt.Cond)
|
w.optExpr(stmt.Cond)
|
||||||
w.stmt(stmt.Post)
|
w.stmt(stmt.Post)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1136,7 +1136,7 @@ func (w *writer) switchStmt(stmt *syntax.SwitchStmt) {
|
||||||
}
|
}
|
||||||
w.expr(guard.X)
|
w.expr(guard.X)
|
||||||
} else {
|
} else {
|
||||||
w.expr(stmt.Tag)
|
w.optExpr(stmt.Tag)
|
||||||
}
|
}
|
||||||
|
|
||||||
w.Len(len(stmt.Body))
|
w.Len(len(stmt.Body))
|
||||||
|
|
@ -1201,6 +1201,8 @@ func (w *writer) optLabel(label *syntax.Name) {
|
||||||
// @@@ Expressions
|
// @@@ Expressions
|
||||||
|
|
||||||
func (w *writer) expr(expr syntax.Expr) {
|
func (w *writer) expr(expr syntax.Expr) {
|
||||||
|
base.Assertf(expr != nil, "missing expression")
|
||||||
|
|
||||||
expr = unparen(expr) // skip parens; unneeded after typecheck
|
expr = unparen(expr) // skip parens; unneeded after typecheck
|
||||||
|
|
||||||
obj, inst := lookupObj(w.p.info, expr)
|
obj, inst := lookupObj(w.p.info, expr)
|
||||||
|
|
@ -1254,9 +1256,6 @@ func (w *writer) expr(expr syntax.Expr) {
|
||||||
default:
|
default:
|
||||||
w.p.unexpected("expression", expr)
|
w.p.unexpected("expression", expr)
|
||||||
|
|
||||||
case nil: // absent slice index, for condition, or switch tag
|
|
||||||
w.Code(exprNone)
|
|
||||||
|
|
||||||
case *syntax.Name:
|
case *syntax.Name:
|
||||||
assert(expr.Value == "_")
|
assert(expr.Value == "_")
|
||||||
w.Code(exprBlank)
|
w.Code(exprBlank)
|
||||||
|
|
@ -1292,7 +1291,7 @@ func (w *writer) expr(expr syntax.Expr) {
|
||||||
w.expr(expr.X)
|
w.expr(expr.X)
|
||||||
w.pos(expr)
|
w.pos(expr)
|
||||||
for _, n := range &expr.Index {
|
for _, n := range &expr.Index {
|
||||||
w.expr(n)
|
w.optExpr(n)
|
||||||
}
|
}
|
||||||
|
|
||||||
case *syntax.AssertExpr:
|
case *syntax.AssertExpr:
|
||||||
|
|
@ -1356,6 +1355,12 @@ func (w *writer) expr(expr syntax.Expr) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (w *writer) optExpr(expr syntax.Expr) {
|
||||||
|
if w.Bool(expr != nil) {
|
||||||
|
w.expr(expr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (w *writer) compLit(lit *syntax.CompositeLit) {
|
func (w *writer) compLit(lit *syntax.CompositeLit) {
|
||||||
tv, ok := w.p.info.Types[lit]
|
tv, ok := w.p.info.Types[lit]
|
||||||
assert(ok)
|
assert(ok)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue