(unmemoize_delay): Extend the environment before
authorNeil Jerram <neil@ossau.uklinux.net>
Sun, 21 Oct 2007 20:43:14 +0000 (20:43 +0000)
committerNeil Jerram <neil@ossau.uklinux.net>
Sun, 21 Oct 2007 20:43:14 +0000 (20:43 +0000)
unmemoizing the promise thunk.  This fixes a segmentation fault
reported by Frank Schwidom.

libguile/ChangeLog
libguile/eval.c

index 691159b..854a365 100644 (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>
 
        Add support for thread cancellation and user-defined thread
index 8d6c4d9..f129df6 100644 (file)
@@ -1268,7 +1268,13 @@ static SCM
 unmemoize_delay (const SCM expr, const SCM env)
 {
   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));
 }