// according to the maximum number of bytes needed to encode a value
// of type typ. As a special case, 8-bit types are always encoded as a
// single byte.
-//
-// TODO(mdempsky): Is this level of complexity really worthwhile?
func (w *exportWriter) mpint(x constant.Value, typ *types.Type) {
signed, maxBytes := intSize(typ)
w.op(n.Op())
w.pos(n.Pos())
w.stmtList(n.Init())
- w.exprsOrNil(nil, nil) // TODO(rsc): Delete (and fix importer).
w.caseList(n.Cases, false)
case ir.OSWITCH:
s = n.Tag.Sym()
}
w.localIdent(s, 0) // declared pseudo-variable, if any
- w.exprsOrNil(n.X, nil)
+ w.expr(n.X)
// case OTARRAY, OTMAP, OTCHAN, OTSTRUCT, OTINTER, OTFUNC:
// should have been resolved by typechecking - handled by default case
n := n.(*ir.KeyExpr)
w.op(ir.OKEY)
w.pos(n.Pos())
- w.exprsOrNil(n.Key, n.Value)
+ w.expr(n.Key)
+ w.expr(n.Value)
// case OSTRUCTKEY:
// unreachable - handled in case OSTRUCTLIT by elemList
n := n.(*ir.ConvExpr)
w.op(ir.OCONV)
w.pos(n.Pos())
- w.expr(n.X)
w.typ(n.Type())
+ w.expr(n.X)
case ir.OREAL, ir.OIMAG, ir.OCAP, ir.OCLOSE, ir.OLEN, ir.ONEW, ir.OPANIC:
n := n.(*ir.UnaryExpr)
w.uint64(uint64(len(list)))
for _, n := range list {
n := n.(*ir.StructKeyExpr)
+ w.pos(n.Pos())
w.selector(n.Field)
w.expr(n.Value)
}
if s := r.ident(); s != nil {
tag = ir.NewIdent(pos, s)
}
- expr, _ := r.exprsOrNil()
- return ir.NewTypeSwitchGuard(pos, tag, expr)
+ return ir.NewTypeSwitchGuard(pos, tag, r.expr())
// case OTARRAY, OTMAP, OTCHAN, OTSTRUCT, OTINTER, OTFUNC:
// unreachable - should have been resolved by typechecking
// unreachable - mapped to case OADDR below by exporter
case ir.OSTRUCTLIT:
- pos := r.pos()
- return ir.NewCompLitExpr(pos, ir.OCOMPLIT, ir.TypeNode(r.typ()).(ir.Ntype), r.elemList(pos))
+ return ir.NewCompLitExpr(r.pos(), ir.OCOMPLIT, ir.TypeNode(r.typ()), r.fieldList())
// case OARRAYLIT, OSLICELIT, OMAPLIT:
// unreachable - mapped to case OCOMPLIT below by exporter
case ir.OCOMPLIT:
- return ir.NewCompLitExpr(r.pos(), ir.OCOMPLIT, ir.TypeNode(r.typ()).(ir.Ntype), r.exprList())
+ return ir.NewCompLitExpr(r.pos(), ir.OCOMPLIT, ir.TypeNode(r.typ()), r.exprList())
case ir.OKEY:
- pos := r.pos()
- key, value := r.exprsOrNil()
- return ir.NewKeyExpr(pos, key, value)
+ return ir.NewKeyExpr(r.pos(), r.expr(), r.expr())
// case OSTRUCTKEY:
// unreachable - handled in case OSTRUCTLIT by elemList
// unreachable - mapped to OCONV case below by exporter
case ir.OCONV:
- pos := r.pos()
- x := r.expr()
- return ir.NewConvExpr(pos, ir.OCONV, r.typ(), x)
+ return ir.NewConvExpr(r.pos(), ir.OCONV, r.typ(), r.expr())
case ir.OCOPY, ir.OCOMPLEX, ir.OREAL, ir.OIMAG, ir.OAPPEND, ir.OCAP, ir.OCLOSE, ir.ODELETE, ir.OLEN, ir.OMAKE, ir.ONEW, ir.OPANIC, ir.ORECOVER, ir.OPRINT, ir.OPRINTN:
n := builtinCall(r.pos(), op)
pos := r.pos()
list := r.exprList()
x := list[0]
- x.SetPos(pos) // TODO(mdempsky): Remove toolstash bandage.
for _, y := range list[1:] {
x = ir.NewBinaryExpr(pos, ir.OADD, x, y)
}
case ir.OSELECT:
pos := r.pos()
init := r.stmtList()
- r.exprsOrNil() // TODO(rsc): Delete (and fix exporter). These are always nil.
n := ir.NewSelectStmt(pos, r.caseList(nil))
n.PtrInit().Set(init)
return n
return ir.Op(r.uint64())
}
-func (r *importReader) elemList(pos src.XPos) []ir.Node {
- c := r.uint64()
- list := make([]ir.Node, c)
+func (r *importReader) fieldList() []ir.Node {
+ list := make([]ir.Node, r.uint64())
for i := range list {
- // TODO(mdempsky): Export position information for OSTRUCTKEY nodes.
- list[i] = ir.NewStructKeyExpr(pos, r.ident(), r.expr())
+ list[i] = ir.NewStructKeyExpr(r.pos(), r.ident(), r.expr())
}
return list
}