From 361dc48c62750f3aeed9bb2d974b1b07c4b071bd Mon Sep 17 00:00:00 2001 From: Alex Shinn Date: Sun, 19 Apr 2020 19:20:01 +0900 Subject: [PATCH] don't verify duplicate formal parameters for more than 100 params --- eval.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/eval.c b/eval.c index 9948b8b4..81de408e 100644 --- a/eval.c +++ b/eval.c @@ -801,19 +801,20 @@ static sexp analyze_set (sexp ctx, sexp x, int depth) { #define sexp_return(res, val) do {res=val; goto cleanup;} while (0) static sexp analyze_lambda (sexp ctx, sexp x, int depth) { - int trailing_non_procs; + int trailing_non_procs, verify_duplicates_p; sexp name, ls, ctx3; sexp_gc_var6(res, body, tmp, value, defs, ctx2); sexp_gc_preserve6(ctx, res, body, tmp, value, defs, ctx2); /* verify syntax */ if (! (sexp_pairp(sexp_cdr(x)) && sexp_pairp(sexp_cddr(x)))) sexp_return(res, sexp_compile_error(ctx, "bad lambda syntax", x)); + verify_duplicates_p = sexp_length_unboxed(sexp_cadr(x)) < 100; for (ls=sexp_cadr(x); sexp_pairp(ls); ls=sexp_cdr(ls)) if (! sexp_idp(sexp_car(ls))) sexp_return(res, sexp_compile_error(ctx, "non-symbol parameter", x)); - else if (sexp_truep(sexp_memq(ctx, sexp_car(ls), sexp_cdr(ls)))) + else if (verify_duplicates_p && sexp_truep(sexp_memq(ctx, sexp_car(ls), sexp_cdr(ls)))) sexp_return(res, sexp_compile_error(ctx, "duplicate parameter", x)); - if (! sexp_nullp(ls)) { + if (! sexp_nullp(ls)) { /* verify rest param */ if (! sexp_idp(ls)) sexp_return(res, sexp_compile_error(ctx, "non-symbol parameter", x)); else if (sexp_truep(sexp_memq(ctx, ls, sexp_cadr(x))))