mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-29 19:30:36 +02:00
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.
This commit is contained in:
parent
4dd4d286cc
commit
2446e7dc29
2 changed files with 21 additions and 16 deletions
|
@ -350,22 +350,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);
|
||||
return SCM_PACK (entry->value);
|
||||
|
||||
if (SCM_I_FLUID_THREAD_LOCAL_P (fluid))
|
||||
val = scm_hashq_ref (dynamic_state->thread_local_values, fluid,
|
||||
SCM_I_FLUID_DEFAULT (fluid));
|
||||
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);
|
||||
val = scm_weak_table_refq (dynamic_state->values, fluid,
|
||||
SCM_I_FLUID_DEFAULT (fluid));
|
||||
|
||||
if (SCM_UNBNDP (val))
|
||||
val = 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;
|
||||
}
|
||||
|
|
|
@ -49,8 +49,18 @@
|
|||
(interaction-environment))))
|
||||
|
||||
(with-test-prefix "initial fluid values"
|
||||
(pass-if "fluid-ref uninitialized fluid is #f"
|
||||
(not (fluid-ref a)))
|
||||
|
||||
(pass-if "fluid-ref returns #f for uninitialized fluid"
|
||||
(eq? #f (fluid-ref (make-fluid))))
|
||||
|
||||
(pass-if "fluid-ref returns #f for uninitialized thread local fluid"
|
||||
(eq? #f (fluid-ref (make-thread-local-fluid))))
|
||||
|
||||
(pass-if "fluid-ref returns default"
|
||||
(eq? #t (fluid-ref (make-fluid #t))))
|
||||
|
||||
(pass-if "fluid-ref returns thread local default"
|
||||
(eq? #t (fluid-ref (make-thread-local-fluid #t))))
|
||||
|
||||
(pass-if "initial value is inherited from parent thread"
|
||||
(if (provided? 'threads)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue