[Top][All Lists]

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

[Guile-commits] branch stable-2.2 updated: Respect thread local fluid de

From: Andy Wingo
Subject: [Guile-commits] branch stable-2.2 updated: Respect thread local fluid defaults
Date: Sun, 12 Jan 2020 16:06:22 -0500

This is an automated email from the git hooks/post-receive script.

wingo pushed a commit to branch stable-2.2
in repository guile.

The following commit(s) were added to refs/heads/stable-2.2 by this push:
     new 5d29564  Respect thread local fluid defaults
5d29564 is described below

commit 5d2956497137c2f7453e21d334d152bfd91a3ef8
Author: Rob Browning <address@hidden>
AuthorDate: Sun Dec 8 11:35:37 2019 -0600

    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.
 libguile/fluids.c            | 23 +++++++++--------------
 test-suite/tests/fluids.test | 14 ++++++++++++--
 2 files changed, 21 insertions(+), 16 deletions(-)

diff --git a/libguile/fluids.c b/libguile/fluids.c
index c3dd1c9..472f92a 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;
diff --git a/test-suite/tests/fluids.test b/test-suite/tests/fluids.test
index a5ca885..949d504 100644
--- a/test-suite/tests/fluids.test
+++ b/test-suite/tests/fluids.test
@@ -49,8 +49,18 @@
 (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)

reply via email to

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