From dc80bf4f04067503ea793563d81aec795afae7e9 Mon Sep 17 00:00:00 2001 From: Kris Katterjohn Date: Sat, 31 Mar 2018 14:19:18 -0500 Subject: [PATCH 1/2] 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 2/2] 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);