summaryrefslogtreecommitdiff
path: root/libguile/fluids.c
diff options
context:
space:
mode:
Diffstat (limited to 'libguile/fluids.c')
-rw-r--r--libguile/fluids.c53
1 files changed, 21 insertions, 32 deletions
diff --git a/libguile/fluids.c b/libguile/fluids.c
index ebdb48fbc..a2fadbd8a 100644
--- a/libguile/fluids.c
+++ b/libguile/fluids.c
@@ -1,4 +1,4 @@
-/* Copyright 1996-1997,2000-2001,2004,2006-2013,2017-2018
+/* Copyright 1996-1997,2000-2001,2004,2006-2013,2017-2018,2025
Free Software Foundation, Inc.
This file is part of Guile.
@@ -30,6 +30,7 @@
#include "cache-internal.h"
#include "deprecation.h"
#include "dynwind.h"
+#include "ephemerons.h"
#include "eval.h"
#include "gsubr.h"
#include "hashtab.h"
@@ -132,7 +133,7 @@ restore_dynamic_state (SCM saved, scm_t_dynamic_state *state)
else
entry->key = entry->value = 0;
}
- state->values = saved;
+ state->values = scm_to_ephemeron_table (saved);
state->has_aliased_values = 1;
}
@@ -140,7 +141,7 @@ static inline SCM
save_dynamic_state (scm_t_dynamic_state *state)
{
int slot;
- SCM saved = state->values;
+ SCM saved = scm_from_ephemeron_table (state->values);
for (slot = 0; slot < SCM_CACHE_SIZE; slot++)
{
struct scm_cache_entry *entry = &state->cache.entries[slot];
@@ -157,14 +158,14 @@ save_dynamic_state (scm_t_dynamic_state *state)
cache. */
scm_hashq_set_x (state->thread_local_values, key, value);
}
- else if (!scm_is_eq (scm_weak_table_refq (state->values, key,
- SCM_UNDEFINED),
+ else if (!scm_is_eq (scm_c_ephemeron_hash_table_refq (state->values, key,
+ SCM_UNDEFINED),
value))
{
if (state->has_aliased_values)
saved = scm_acons (key, value, saved);
else
- scm_weak_table_putq_x (state->values, key, value);
+ scm_c_ephemeron_hash_table_setq_x (state->values, key, value);
}
}
state->has_aliased_values = 1;
@@ -178,21 +179,8 @@ saved_dynamic_state_ref (SCM saved, SCM fluid, SCM dflt)
if (scm_is_eq (SCM_CAAR (saved), fluid))
return SCM_CDAR (saved);
- return scm_weak_table_refq (saved, fluid, dflt);
-}
-
-static SCM
-add_entry (void *data, SCM k, SCM v, SCM result)
-{
- scm_weak_table_putq_x (result, k, v);
- return result;
-}
-
-static SCM
-copy_value_table (SCM tab)
-{
- SCM ret = scm_c_make_weak_table (0, SCM_WEAK_TABLE_KIND_KEY);
- return scm_c_weak_table_fold (add_entry, NULL, ret, tab);
+ return scm_c_ephemeron_hash_table_refq (scm_to_ephemeron_table (saved),
+ fluid, dflt);
}
@@ -329,15 +317,17 @@ fluid_set_x (scm_t_dynamic_state *dynamic_state, SCM fluid, SCM value)
if (dynamic_state->has_aliased_values)
{
- if (scm_is_eq (scm_weak_table_refq (dynamic_state->values,
- fluid, SCM_UNDEFINED),
- value))
+ SCM existing =
+ scm_c_ephemeron_hash_table_refq (dynamic_state->values, fluid,
+ SCM_UNDEFINED);
+ if (scm_is_eq (existing, value))
return;
- dynamic_state->values = copy_value_table (dynamic_state->values);
+ dynamic_state->values =
+ scm_c_ephemeron_table_copy (dynamic_state->values);
dynamic_state->has_aliased_values = 0;
}
- scm_weak_table_putq_x (dynamic_state->values, fluid, value);
+ scm_c_ephemeron_hash_table_setq_x (dynamic_state->values, fluid, value);
}
}
@@ -356,8 +346,8 @@ fluid_ref (scm_t_dynamic_state *dynamic_state, SCM 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));
+ val = scm_c_ephemeron_hash_table_refq (dynamic_state->values, fluid,
+ SCM_I_FLUID_DEFAULT (fluid));
/* Cache this lookup. */
fluid_set_x (dynamic_state, fluid, val);
@@ -420,8 +410,8 @@ SCM_DEFINE (scm_fluid_ref_star, "fluid-ref*", 2, 0, 0,
ret = scm_hashq_ref (dynamic_state->thread_local_values, fluid,
SCM_UNDEFINED);
else
- ret = scm_weak_table_refq (dynamic_state->values, fluid,
- SCM_UNDEFINED);
+ ret = scm_c_ephemeron_hash_table_refq (dynamic_state->values, fluid,
+ SCM_UNDEFINED);
if (SCM_UNBNDP (ret))
ret = SCM_I_FLUID_DEFAULT (fluid);
@@ -581,8 +571,7 @@ SCM
scm_i_make_initial_dynamic_state (void)
{
return scm_cell (scm_tc7_dynamic_state,
- SCM_UNPACK (scm_c_make_weak_table
- (0, SCM_WEAK_TABLE_KIND_KEY)));
+ (uintptr_t) scm_c_make_ephemeron_table (47));
}
SCM_DEFINE (scm_dynamic_state_p, "dynamic-state?", 1, 0, 0,