diff options
author | Rob Browning <rlb@defaultvalue.org> | 2019-12-08 11:35:37 -0600 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2020-01-12 22:04:55 +0100 |
commit | 5d2956497137c2f7453e21d334d152bfd91a3ef8 (patch) | |
tree | 16388cc8e3a6c303ccb0c0cd1c4514cf75e48e5b /libguile | |
parent | aa0bfa2f9387262ad972674c4d1d88e0e3d863b3 (diff) |
Respect thread local fluid defaults
Previously (fluid-ref (make-thread-local-fluid #t)) would return #f via
scm_fluid_ref because the internal scm_hashq_ref would return #f when
the fluid had not been set, and that was interpreted as an actual value
for the fluid.
Instead, just pass the fluid default as the default for the hash table
lookups so that we don't need a second step to determine if the fluid
was set.
Thanks to Andrew Gierth for tracking down the problem.
Diffstat (limited to 'libguile')
-rw-r--r-- | libguile/fluids.c | 23 |
1 files changed, 9 insertions, 14 deletions
diff --git a/libguile/fluids.c b/libguile/fluids.c index c3dd1c9ea..472f92a06 100644 --- a/libguile/fluids.c +++ b/libguile/fluids.c @@ -343,22 +343,17 @@ fluid_ref (scm_t_dynamic_state *dynamic_state, SCM fluid) entry = scm_cache_lookup (&dynamic_state->cache, fluid); if (scm_is_eq (SCM_PACK (entry->key), fluid)) - val = SCM_PACK (entry->value); - else - { - if (SCM_I_FLUID_THREAD_LOCAL_P (fluid)) - val = scm_hashq_ref (dynamic_state->thread_local_values, fluid, - SCM_UNDEFINED); - else - val = scm_weak_table_refq (dynamic_state->values, fluid, - SCM_UNDEFINED); + return SCM_PACK (entry->value); - if (SCM_UNBNDP (val)) - val = SCM_I_FLUID_DEFAULT (fluid); + if (SCM_I_FLUID_THREAD_LOCAL_P (fluid)) + val = scm_hashq_ref (dynamic_state->thread_local_values, fluid, + SCM_I_FLUID_DEFAULT (fluid)); + else + val = scm_weak_table_refq (dynamic_state->values, fluid, + SCM_I_FLUID_DEFAULT (fluid)); - /* Cache this lookup. */ - fluid_set_x (dynamic_state, fluid, val); - } + /* Cache this lookup. */ + fluid_set_x (dynamic_state, fluid, val); return val; } |