guile-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

guile/guile-core/libguile ChangeLog eval.c


From: Dirk Herrmann
Subject: guile/guile-core/libguile ChangeLog eval.c
Date: Fri, 15 Dec 2000 06:00:19 -0800

CVSROOT:        /cvs
Module name:    guile
Changes by:     Dirk Herrmann <address@hidden>  00/12/15 06:00:18

Modified files:
        guile-core/libguile: ChangeLog eval.c 

Log message:
        * Fix a bug in scm_eval.

CVSWeb URLs:
http://subversions.gnu.org/cgi-bin/cvsweb/guile/guile-core/libguile/ChangeLog.diff?r1=1.1208&r2=1.1209
http://subversions.gnu.org/cgi-bin/cvsweb/guile/guile-core/libguile/eval.c.diff?r1=1.185&r2=1.186

Patches:
Index: guile/guile-core/libguile/ChangeLog
diff -u guile/guile-core/libguile/ChangeLog:1.1208 
guile/guile-core/libguile/ChangeLog:1.1209
--- guile/guile-core/libguile/ChangeLog:1.1208  Wed Dec 13 16:08:55 2000
+++ guile/guile-core/libguile/ChangeLog Fri Dec 15 06:00:18 2000
@@ -1,3 +1,12 @@
+2000-12-15  Dirk Herrmann  <address@hidden>
+
+       * eval.c (change_environment, inner_eval, restore_environment):
+       New functions.
+
+       (scm_eval):  Bring the global variable that holds the current
+       environment up to date when entering or leaving the scope of the
+       evaluated code.  Thanks to Matthias Koeppe for the bug report.
+
 2000-12-13  Dirk Herrmann  <address@hidden>
 
        * numbers.c (scm_init_numbers):  Re-introduced bindings for
Index: guile/guile-core/libguile/eval.c
diff -u guile/guile-core/libguile/eval.c:1.185 
guile/guile-core/libguile/eval.c:1.186
--- guile/guile-core/libguile/eval.c:1.185      Mon Dec 11 06:48:23 2000
+++ guile/guile-core/libguile/eval.c    Fri Dec 15 06:00:18 2000
@@ -81,6 +81,7 @@
 #include <stdio.h>
 #include "libguile/_scm.h"
 #include "libguile/debug.h"
+#include "libguile/dynwind.h"
 #include "libguile/alist.h"
 #include "libguile/eq.h"
 #include "libguile/continuations.h"
@@ -3808,15 +3809,55 @@
  * environment explicit.
  */
 
+static void
+change_environment (void *data)
+{
+  SCM pair = SCM_PACK (data);
+  SCM new_module = SCM_CAR (pair);
+  SCM old_module = scm_selected_module ();
+  SCM_SETCDR (pair, old_module);
+  scm_select_module (new_module);
+}
+
+
+static SCM
+inner_eval (void *data)
+{
+  SCM pair = SCM_PACK (data);
+  SCM exp = SCM_CAR (pair);
+  SCM env = SCM_CDR (pair);
+  SCM result = scm_i_eval (exp, env);
+  return result;
+}
+
+
+static void
+restore_environment (void *data)
+{
+  SCM pair = SCM_PACK (data);
+  SCM old_module = SCM_CDR (pair);
+  scm_select_module (old_module);
+}
+
+
 SCM_DEFINE (scm_eval, "eval", 2, 0, 0, 
            (SCM exp, SCM environment),
            "Evaluate @var{exp}, a list representing a Scheme expression, in 
the\n"
            "environment given by @var{environment specifier}.")
 #define FUNC_NAME s_scm_eval
 {
+  SCM copied_exp;
+  SCM env_closure;
+
   SCM_VALIDATE_MODULE (2, environment);
-  return scm_i_eval (scm_copy_tree (exp),
-                    scm_top_level_env (SCM_MODULE_EVAL_CLOSURE (environment)));
+
+  copied_exp = scm_copy_tree (exp);
+  env_closure = scm_top_level_env (SCM_MODULE_EVAL_CLOSURE (environment));
+
+  return scm_internal_dynamic_wind 
+    (change_environment, inner_eval, restore_environment,
+     (void *) SCM_UNPACK (scm_cons (copied_exp, env_closure)),
+     (void *) SCM_UNPACK (scm_cons (environment, SCM_BOOL_F)));
 }
 #undef FUNC_NAME
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]