From 439e35da61ed06da34d62cc5170547221e6f4563 Mon Sep 17 00:00:00 2001 From: Kris Katterjohn Date: Wed, 28 Mar 2018 21:11:33 -0500 Subject: [PATCH 1/3] Check for valid "rest" parameters in parameter lists Checks for invalid parameter names and duplicate parameters were being performed on parameter lists, but these checks were not considering any rest parameters. This means that ((lambda (x . x) x) 'foo 'bar) => foo ((lambda (x . 0) x) 'foo 'bar) => foo ((lambda (x . #t) x) 'foo 'bar) => foo ((lambda 0 'foo)) => foo ((lambda #t 'foo)) => foo and so on. Now these all produce errors. --- eval.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/eval.c b/eval.c index 6d6fccca..5db590c1 100644 --- a/eval.c +++ b/eval.c @@ -806,6 +806,12 @@ static sexp analyze_lambda (sexp ctx, sexp x, int depth) { sexp_return(res, sexp_compile_error(ctx, "non-symbol parameter", x)); else if (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_idp(ls)) + sexp_return(res, sexp_compile_error(ctx, "non-symbol parameter", x)); + else if (sexp_truep(sexp_memq(ctx, ls, sexp_cadr(x)))) + sexp_return(res, sexp_compile_error(ctx, "duplicate parameter", x)); + } /* build lambda and analyze body */ res = sexp_make_lambda(ctx, tmp=sexp_copy_list(ctx, sexp_cadr(x))); if (sexp_exceptionp(res)) sexp_return(res, res); From dc80bf4f04067503ea793563d81aec795afae7e9 Mon Sep 17 00:00:00 2001 From: Kris Katterjohn Date: Sat, 31 Mar 2018 14:19:18 -0500 Subject: [PATCH 2/3] Avoid placing duplicate feature identifiers in the (features) list In my case "bsd" was present twice on my *BSD boxes --- sexp.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/sexp.c b/sexp.c index 1503e5b2..3fe870ec 100644 --- a/sexp.c +++ b/sexp.c @@ -438,7 +438,7 @@ static const char* sexp_initial_features[] = { void sexp_init_context_globals (sexp ctx) { const char** features; int i, endianess_check = 1; - sexp type, *vec, print=NULL; + sexp feature, type, *vec, print=NULL; sexp_context_globals(ctx) = sexp_make_vector(ctx, sexp_make_fixnum(SEXP_G_NUM_GLOBALS), SEXP_VOID); #if ! SEXP_USE_GLOBAL_SYMBOLS @@ -475,8 +475,11 @@ void sexp_init_context_globals (sexp ctx) { sexp_push(ctx, sexp_global(ctx, SEXP_G_FEATURES), SEXP_FALSE); sexp_car(sexp_global(ctx, SEXP_G_FEATURES)) = sexp_intern(ctx, (*(unsigned char*) &endianess_check) ? "little-endian" : "big-endian", -1); for (features=sexp_initial_features; *features; features++) { - sexp_push(ctx, sexp_global(ctx, SEXP_G_FEATURES), SEXP_FALSE); - sexp_car(sexp_global(ctx, SEXP_G_FEATURES)) = sexp_intern(ctx, *features, -1); + feature = sexp_intern(ctx, *features, -1); + if (sexp_not(sexp_memq(ctx, feature, sexp_global(ctx, SEXP_G_FEATURES)))) { + sexp_push(ctx, sexp_global(ctx, SEXP_G_FEATURES), SEXP_FALSE); + sexp_car(sexp_global(ctx, SEXP_G_FEATURES)) = feature; + } } sexp_global(ctx, SEXP_G_NUM_TYPES) = sexp_make_fixnum(SEXP_NUM_CORE_TYPES); sexp_global(ctx, SEXP_G_TYPES) From 5e80cb2c2b3834ea9346c71b0667893a4ad39a2b Mon Sep 17 00:00:00 2001 From: Kris Katterjohn Date: Sat, 31 Mar 2018 20:23:00 -0500 Subject: [PATCH 3/3] In my last commit, make the feature variable a gc variable --- sexp.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sexp.c b/sexp.c index 3fe870ec..94d1d096 100644 --- a/sexp.c +++ b/sexp.c @@ -438,7 +438,8 @@ static const char* sexp_initial_features[] = { void sexp_init_context_globals (sexp ctx) { const char** features; int i, endianess_check = 1; - sexp feature, type, *vec, print=NULL; + sexp type, *vec, print=NULL; + sexp_gc_var1(feature); sexp_context_globals(ctx) = sexp_make_vector(ctx, sexp_make_fixnum(SEXP_G_NUM_GLOBALS), SEXP_VOID); #if ! SEXP_USE_GLOBAL_SYMBOLS @@ -474,6 +475,7 @@ void sexp_init_context_globals (sexp ctx) { sexp_global(ctx, SEXP_G_FEATURES) = SEXP_NULL; sexp_push(ctx, sexp_global(ctx, SEXP_G_FEATURES), SEXP_FALSE); sexp_car(sexp_global(ctx, SEXP_G_FEATURES)) = sexp_intern(ctx, (*(unsigned char*) &endianess_check) ? "little-endian" : "big-endian", -1); + sexp_gc_preserve1(ctx, feature); for (features=sexp_initial_features; *features; features++) { feature = sexp_intern(ctx, *features, -1); if (sexp_not(sexp_memq(ctx, feature, sexp_global(ctx, SEXP_G_FEATURES)))) { @@ -481,6 +483,7 @@ void sexp_init_context_globals (sexp ctx) { sexp_car(sexp_global(ctx, SEXP_G_FEATURES)) = feature; } } + sexp_gc_release1(ctx); sexp_global(ctx, SEXP_G_NUM_TYPES) = sexp_make_fixnum(SEXP_NUM_CORE_TYPES); sexp_global(ctx, SEXP_G_TYPES) = sexp_make_vector(ctx, sexp_make_fixnum(SEXP_INIT_NUM_TYPES), SEXP_VOID);