From: Robert Griesemer Date: Wed, 9 Jan 2019 06:39:13 +0000 (-0800) Subject: go/types: don't create new context string for each argument of each call X-Git-Tag: go1.12beta2~8 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=8765a786b6e8199959bba8244ac5f95aa3eb9474;p=gostls13.git go/types: don't create new context string for each argument of each call The argument context string is only used in error messages. Don't format the function AST into a string for every single argument of every single call that is type-checked. Instead do it once per call (still not great, but much much better). Performance optimization. Change-Id: Iec87f9ad34128d7b3eee58577ad37dbaa8e6db44 Reviewed-on: https://go-review.googlesource.com/c/157037 Run-TryBot: Robert Griesemer TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- diff --git a/src/go/types/call.go b/src/go/types/call.go index 0ea1623903..1abc1d8a5e 100644 --- a/src/go/types/call.go +++ b/src/go/types/call.go @@ -233,6 +233,7 @@ func (check *Checker) arguments(x *operand, call *ast.CallExpr, sig *Signature, } // evaluate arguments + context := check.sprintf("argument to %s", call.Fun) for i := 0; i < n; i++ { arg(x, i) if x.mode != invalid { @@ -240,7 +241,7 @@ func (check *Checker) arguments(x *operand, call *ast.CallExpr, sig *Signature, if i == n-1 && call.Ellipsis.IsValid() { ellipsis = call.Ellipsis } - check.argument(call.Fun, sig, i, x, ellipsis) + check.argument(call.Fun, sig, i, x, ellipsis, context) } } @@ -258,7 +259,7 @@ func (check *Checker) arguments(x *operand, call *ast.CallExpr, sig *Signature, // argument checks passing of argument x to the i'th parameter of the given signature. // If ellipsis is valid, the argument is followed by ... at that position in the call. -func (check *Checker) argument(fun ast.Expr, sig *Signature, i int, x *operand, ellipsis token.Pos) { +func (check *Checker) argument(fun ast.Expr, sig *Signature, i int, x *operand, ellipsis token.Pos, context string) { check.singleValue(x) if x.mode == invalid { return @@ -298,7 +299,7 @@ func (check *Checker) argument(fun ast.Expr, sig *Signature, i int, x *operand, typ = typ.(*Slice).elem } - check.assignment(x, typ, check.sprintf("argument to %s", fun)) + check.assignment(x, typ, context) } func (check *Checker) selector(x *operand, e *ast.SelectorExpr) {