1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-01 12:20:26 +02:00

(unmemoize_delay): Extend the environment before

unmemoizing the promise thunk.  This fixes a segmentation fault
reported by Frank Schwidom.
This commit is contained in:
Neil Jerram 2007-10-21 20:43:14 +00:00
parent 4098fda1e6
commit acbfb5946b
2 changed files with 13 additions and 1 deletions

View file

@ -1,3 +1,9 @@
2007-10-21 Neil Jerram <neil@ossau.uklinux.net>
* eval.c (unmemoize_delay): Extend the environment before
unmemoizing the promise thunk. This fixes a segmentation fault
reported by Frank Schwidom.
2007-10-20 Julian Graham <joolean@gmail.com> 2007-10-20 Julian Graham <joolean@gmail.com>
Add support for thread cancellation and user-defined thread Add support for thread cancellation and user-defined thread

View file

@ -1268,7 +1268,13 @@ static SCM
unmemoize_delay (const SCM expr, const SCM env) unmemoize_delay (const SCM expr, const SCM env)
{ {
const SCM thunk_expr = SCM_CADDR (expr); const SCM thunk_expr = SCM_CADDR (expr);
return scm_list_2 (scm_sym_delay, unmemoize_expression (thunk_expr, env)); /* A promise is implemented as a closure, and when applying a
closure the evaluator adds a new frame to the environment - even
though, in the case of a promise, the added frame is always
empty. We need to extend the environment here in the same way,
so that any ILOCs in thunk_expr can be unmemoized correctly. */
const SCM new_env = SCM_EXTEND_ENV (SCM_EOL, SCM_EOL, env);
return scm_list_2 (scm_sym_delay, unmemoize_expression (thunk_expr, new_env));
} }