[Top][All Lists]
[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
- guile/guile-core/libguile ChangeLog eval.c,
Dirk Herrmann <=