]> Cypherpunks repositories - gostls13.git/commitdiff
go/types: don't create new context string for each argument of each call
authorRobert Griesemer <gri@golang.org>
Wed, 9 Jan 2019 06:39:13 +0000 (22:39 -0800)
committerRobert Griesemer <gri@golang.org>
Wed, 9 Jan 2019 16:10:07 +0000 (16:10 +0000)
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 <gri@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/go/types/call.go

index 0ea1623903daebe6f787b1be3a2404af428ec70f..1abc1d8a5e47d68237b3dddcb8f6302cd9b98388 100644 (file)
@@ -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) {