p.expr(max)
case OCOPY, OCOMPLEX:
+ // treated like other builtin calls (see e.g., OREAL)
p.op(op)
p.expr(n.Left)
p.expr(n.Right)
+ p.op(OEND)
case OCONV, OCONVIFACE, OCONVNOP, OARRAYBYTESTR, OARRAYRUNESTR, OSTRARRAYBYTE, OSTRARRAYRUNE, ORUNESTR:
p.op(OCONV)
p.typ(n.Type)
- if p.bool(n.Left != nil) {
+ if n.Left != nil {
p.expr(n.Left)
+ p.op(OEND)
} else {
- p.exprList(n.List)
+ p.exprList(n.List) // emits terminating OEND
}
case OREAL, OIMAG, OAPPEND, OCAP, OCLOSE, ODELETE, OLEN, OMAKE, ONEW, OPANIC, ORECOVER, OPRINT, OPRINTN:
p.op(op)
- if p.bool(n.Left != nil) {
+ if n.Left != nil {
p.expr(n.Left)
+ p.op(OEND)
} else {
- p.exprList(n.List)
+ p.exprList(n.List) // emits terminating OEND
+ }
+ // only append() calls may contain '...' arguments
+ if op == OAPPEND {
p.bool(n.Isddd)
+ } else if n.Isddd {
+ Fatalf("exporter: unexpected '...' with %s call", opnames[op])
}
case OCALL, OCALLFUNC, OCALLMETH, OCALLINTER, OGETG:
n.SetSliceBounds(low, high, max)
return n
- case OCOPY, OCOMPLEX:
- n := builtinCall(op)
- n.List.Set([]*Node{p.expr(), p.expr()})
- return n
-
// case OCONV, OCONVIFACE, OCONVNOP, OARRAYBYTESTR, OARRAYRUNESTR, OSTRARRAYBYTE, OSTRARRAYRUNE, ORUNESTR:
// unreachable - mapped to OCONV case below by exporter
case OCONV:
n := Nod(OCALL, typenod(p.typ()), nil)
- if p.bool() {
- n.List.Set1(p.expr())
- } else {
- n.List.Set(p.exprList())
- }
+ n.List.Set(p.exprList())
return n
- case OREAL, OIMAG, OAPPEND, OCAP, OCLOSE, ODELETE, OLEN, OMAKE, ONEW, OPANIC, ORECOVER, OPRINT, OPRINTN:
+ case OCOPY, OCOMPLEX, OREAL, OIMAG, OAPPEND, OCAP, OCLOSE, ODELETE, OLEN, OMAKE, ONEW, OPANIC, ORECOVER, OPRINT, OPRINTN:
n := builtinCall(op)
- if p.bool() {
- n.List.Set1(p.expr())
- } else {
- n.List.Set(p.exprList())
+ n.List.Set(p.exprList())
+ if op == OAPPEND {
n.Isddd = p.bool()
}
return n