From e0cbd3389e2dd6ec19ee3a4c7bad81fa0f1907f5 Mon Sep 17 00:00:00 2001 From: Justus Winter Date: Thu, 10 Nov 2016 14:02:11 +0100 Subject: [PATCH] gpgscm: Recover cells used to maintain interpreter state. * tests/gpgscm/scheme.c (free_cell): New function. (free_cons): Likewise. (_s_return): Use the new function to recover cells used to save the state of the interpreter in 's_save'. This reduces the need to do a garbage collection considerably. Signed-off-by: Justus Winter --- tests/gpgscm/scheme.c | 39 +++++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/tests/gpgscm/scheme.c b/tests/gpgscm/scheme.c index 90cb8fd06..105d2a122 100644 --- a/tests/gpgscm/scheme.c +++ b/tests/gpgscm/scheme.c @@ -773,6 +773,26 @@ static pointer find_consecutive_cells(scheme *sc, int n) { return sc->NIL; } +/* Free a cell. This is dangerous. Only free cells that are not + * referenced. */ +static INLINE void +free_cell(scheme *sc, pointer a) +{ + cdr(a) = sc->free_cell; + sc->free_cell = a; + sc->fcells += 1; +} + +/* Free a cell and retrieve its content. This is dangerous. Only + * free cells that are not referenced. */ +static INLINE void +free_cons(scheme *sc, pointer a, pointer *r_car, pointer *r_cdr) +{ + *r_car = car(a); + *r_cdr = cdr(a); + free_cell(sc, a); +} + /* To retain recent allocs before interpreter knows about them - Tehom */ @@ -2481,14 +2501,17 @@ static void dump_stack_free(scheme *sc) } static pointer _s_return(scheme *sc, pointer a) { - sc->value = (a); - if(sc->dump==sc->NIL) return sc->NIL; - sc->op = ivalue(car(sc->dump)); - sc->args = cadr(sc->dump); - sc->envir = caddr(sc->dump); - sc->code = cadddr(sc->dump); - sc->dump = cddddr(sc->dump); - return sc->T; + pointer dump = sc->dump; + pointer op; + sc->value = (a); + if (dump == sc->NIL) + return sc->NIL; + free_cons(sc, dump, &op, &dump); + sc->op = ivalue(op); + free_cons(sc, dump, &sc->args, &dump); + free_cons(sc, dump, &sc->envir, &dump); + free_cons(sc, dump, &sc->code, &sc->dump); + return sc->T; } static void s_save(scheme *sc, enum scheme_opcodes op, pointer args, pointer code) {