aboutsummaryrefslogtreecommitdiff
path: root/resolve/resolve.go
diff options
context:
space:
mode:
Diffstat (limited to 'resolve/resolve.go')
-rw-r--r--resolve/resolve.go13
1 files changed, 13 insertions, 0 deletions
diff --git a/resolve/resolve.go b/resolve/resolve.go
index 59c486a..9e21ee1 100644
--- a/resolve/resolve.go
+++ b/resolve/resolve.go
@@ -670,6 +670,7 @@ func (r *resolver) expr(e syntax.Expr) {
r.expr(e.Fn)
var seenVarargs, seenKwargs bool
var seenName map[string]bool
+ var n, p int
for _, arg := range e.Args {
pos, _ := arg.Span()
if unop, ok := arg.(*syntax.UnaryExpr); ok && unop.Op == syntax.STARSTAR {
@@ -690,6 +691,7 @@ func (r *resolver) expr(e syntax.Expr) {
r.expr(arg)
} else if binop, ok := arg.(*syntax.BinaryExpr); ok && binop.Op == syntax.EQ {
// k=v
+ n++
if seenKwargs {
r.errorf(pos, "argument may not follow **kwargs")
}
@@ -705,6 +707,7 @@ func (r *resolver) expr(e syntax.Expr) {
r.expr(binop.Y)
} else {
// positional argument
+ p++
if seenVarargs {
r.errorf(pos, "argument may not follow *args")
} else if seenKwargs {
@@ -716,6 +719,16 @@ func (r *resolver) expr(e syntax.Expr) {
}
}
+ // Fail gracefully if compiler-imposed limit is exceeded.
+ if p >= 256 {
+ pos, _ := e.Span()
+ r.errorf(pos, "%v positional arguments in call, limit is 255", p)
+ }
+ if n >= 256 {
+ pos, _ := e.Span()
+ r.errorf(pos, "%v keyword arguments in call, limit is 255", n)
+ }
+
case *syntax.LambdaExpr:
if !AllowLambda {
r.errorf(e.Lambda, doesnt+"support lambda")