From 890cda9c53468edea43da2d8a9e65dd5702802f7 Mon Sep 17 00:00:00 2001 From: Benjamin Vedder Date: Sat, 23 Dec 2023 10:56:27 +0100 Subject: [PATCH] Squashed 'lispBM/lispBM/' changes from ad49766e..1dc61723 1dc61723 bug fix in sort, reordering of operations to keep sublist safe from GC git-subtree-dir: lispBM/lispBM git-subtree-split: 1dc61723743b6300130ea4e666a9bb1921d5e8ec --- experiment_repl/repl.c | 2 +- src/eval_cps.c | 29 +++++++++++++++++++---------- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/experiment_repl/repl.c b/experiment_repl/repl.c index 78ed0c68..d43f6ec2 100644 --- a/experiment_repl/repl.c +++ b/experiment_repl/repl.c @@ -609,7 +609,7 @@ int main(int argc, char **argv) { pthread_t lispbm_thd; lbm_heap_state_t heap_state; - unsigned int heap_size = 8192;//2048; + unsigned int heap_size = 2048; lbm_cons_t *heap_storage = NULL; lbm_const_heap_t const_heap; diff --git a/src/eval_cps.c b/src/eval_cps.c index d2d88786..23f37ff5 100644 --- a/src/eval_cps.c +++ b/src/eval_cps.c @@ -2619,8 +2619,9 @@ static void apply_sort(lbm_value *args, lbm_uint nargs, eval_context_t *ctx) { lbm_value a = list_copy; lbm_value b = lbm_cdr(a); lbm_value rest = lbm_cdr(b); - lbm_set_cdr(a, b); - lbm_set_cdr(b, ENC_SYM_NIL); + // Do not terminate b. keep rest of list safe from GC in the following + // closure extraction. + //lbm_set_cdr(a, b); // This is void lbm_value cl[3]; // Comparator closure extract_n(lbm_cdr(args[0]), cl, 3); @@ -2641,6 +2642,9 @@ static void apply_sort(lbm_value *args, lbm_uint nargs, eval_context_t *ctx) { } lbm_value cmp = cl[CLO_BODY]; + // Terminate the comparator argument list. + lbm_set_cdr(b, ENC_SYM_NIL); + lbm_stack_drop(&ctx->K, 3); //TODO: optimize drop 3, alloc 20 into alloc 17 lbm_uint *sptr = stack_reserve(ctx, 20); sptr[0] = cmp; @@ -3140,13 +3144,15 @@ static void cont_merge_rest(eval_context_t *ctx) { } // merge_layer stack contents -// s[sp-7] = cmp -// s[sp-6] = cmp_env -// s[sp-5] = par1 -// s[sp-4] = par2 -// s[sp-3] = acc -// s[sp-2] = rest; -// s[sp-1] = layer +// s[sp-9] = cmp +// s[sp-8] = cmp_env +// s[sp-7] = par1 +// s[sp-6] = par2 +// s[sp-5] = acc - first cell +// s[sp-4] = acc - last cell +// s[sp-3] = rest; +// s[sp-2] = layer +// s[sp-1] = length or original list // // ctx->r merged sublist static void cont_merge_layer(eval_context_t *ctx) { @@ -3180,7 +3186,7 @@ static void cont_merge_layer(eval_context_t *ctx) { lbm_stack_drop(&ctx->K, 9); return; } else { - // Setup for marges of the next layer + // Setup for merges of the next layer layer = layer * 2; sptr[7] = lbm_enc_i(layer); layer_rest = sptr[4]; // continue on the accumulation of all sublists. @@ -3230,6 +3236,9 @@ static void cont_merge_layer(eval_context_t *ctx) { lbm_value a = a_list; lbm_value b = b_list; lbm_set_cdr(a, b); + // Terminating the b list would be incorrect here + // if there was any chance that the environment update below + // performs GC. lbm_set_cdr(b, ENC_SYM_NIL); lbm_value cmp_body = sptr[0];