diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2020-06-15 17:20:03 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2020-06-15 17:20:03 -0700 |
commit | 2458a19862b899a292aa70d40862730c66de2aef (patch) | |
tree | 8cbfee8aaa28fc1645b33589cc7a6440f74207cc | |
parent | 33c1d17510290b9cb1e41060bc02b5003f041ba5 (diff) | |
download | txr-2458a19862b899a292aa70d40862730c66de2aef.tar.gz txr-2458a19862b899a292aa70d40862730c66de2aef.tar.bz2 txr-2458a19862b899a292aa70d40862730c66de2aef.zip |
exceptions: avoid consing dyn env for package vars
* unwind.c (invoke_handler): Do not unconditionally bind
*package* and *package-alist*. Allocate the new dynamic
environment only if the current values of those variables are
-rw-r--r-- | unwind.c | 11 |
1 files changed, 7 insertions, 4 deletions
@@ -637,15 +637,18 @@ val uw_exception_subtype_p(val sub, val sup) static void invoke_handler(uw_frame_t *fr, struct args *args) { val saved_dyn_env = dyn_env; + val cur_pkg_alist = deref(cur_package_alist_loc); + val cur_pkg = cur_package; fr->ha.visible = 0; uw_simple_catch_begin; - dyn_env = make_env(nil, nil, dyn_env); - - env_vbind(dyn_env, package_s, fr->ha.package); - env_vbind(dyn_env, package_alist_s, fr->ha.package_alist); + if (cur_pkg_alist != fr->ha.package_alist || cur_pkg != fr->ha.package) { + dyn_env = make_env(nil, nil, dyn_env); + env_vbind(dyn_env, package_s, fr->ha.package); + env_vbind(dyn_env, package_alist_s, fr->ha.package_alist); + } generic_funcall(fr->ha.fun, args); |