diff options
Diffstat (limited to 'libguile/fluids.c')
-rw-r--r-- | libguile/fluids.c | 53 |
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, |