diff options
author | Andy Wingo <wingo@pobox.com> | 2025-05-05 16:07:30 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2025-05-05 16:29:24 +0200 |
commit | c63f9101f8e6e02a1f034e202d8caa50183992d2 (patch) | |
tree | d7bfe85bcf2189d592063f4cd8968f53ad4c753b /libguile/deprecated.c | |
parent | 96589bd303ab0fd778ebf2824f642e5b4528882d (diff) | |
download | guile-wip-whippet.tar.gz |
Reimplement weak vectors in Scheme using ephemeronswip-whippet
* module/ice-9/weak-vector.scm: New implementation, same interface.
* doc/ref/api-memory.texi (Weak vectors): Default weak vector value was
documented as empty list when it was actually unspecified, but #f is
most useful, so we change documentation and code to match.
* libguile/Makefile.am (libguile_@GUILE_EFFECTIVE_VERSION@_la_SOURCES):
(DOT_X_FILES):
(DOT_DOC_FILES):
(noinst_HEADERS):
(modinclude_HEADERS):
* libguile.h:
* libguile/deprecated.c:
* libguile/deprecated.h:
* libguile/init.c:
* libguile/weak-vector.c:
* libguile/weak-vector.h: Remove C weak vector implementation, replaced
with deprecation stubs that call out to Scheme.
* libguile/weak-set.c:
* libguile/weak-table.c:
* libguile/weak-list.h: Remove unused internal header.
* libguile/eq.c:
* libguile/evalext.c:
* libguile/goops.c:
* libguile/hash.c:
* libguile/scm.h:
* module/system/base/types.scm:
* module/system/base/types/internal.scm:
* module/system/vm/assembler.scm: Remove wvect tc7.
Diffstat (limited to 'libguile/deprecated.c')
-rw-r--r-- | libguile/deprecated.c | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/libguile/deprecated.c b/libguile/deprecated.c index c3ba0a9eb..73720a5b8 100644 --- a/libguile/deprecated.c +++ b/libguile/deprecated.c @@ -27,6 +27,7 @@ #include "eval.h" #include "gsubr.h" #include "modules.h" +#include "numbers.h" #include "threads.h" #include "variable.h" @@ -60,6 +61,116 @@ scm_make_guardian (void) +static SCM make_weak_vector_var; +static SCM weak_vector_var; +static SCM weak_vector_p_var; +static SCM weak_vector_length_var; +static SCM weak_vector_ref_var; +static SCM weak_vector_set_x_var; + +static void +init_weak_vector_vars (void) +{ + make_weak_vector_var = + scm_c_public_lookup ("ice-9 weak-vector", "make-weak-vector"); + weak_vector_var = + scm_c_public_lookup ("ice-9 weak-vector", "weak-vector"); + weak_vector_p_var = + scm_c_public_lookup ("ice-9 weak-vector", "weak-vector?"); + weak_vector_length_var = + scm_c_public_lookup ("ice-9 weak-vector", "weak-vector-length"); + weak_vector_ref_var = + scm_c_public_lookup ("ice-9 weak-vector", "weak-vector-ref"); + weak_vector_set_x_var = + scm_c_public_lookup ("ice-9 weak-vector", "weak-vector-set!"); +} + +static void +init_weak_vectors (void) +{ + static scm_i_pthread_once_t once = SCM_I_PTHREAD_ONCE_INIT; + scm_c_issue_deprecation_warning + ("The weak vector C interface is deprecated. Invoke the Scheme " + "procedures from (ice-9 weak-vector) instead."); + scm_i_pthread_once (&once, init_weak_vector_vars); +} + +SCM +scm_make_weak_vector (SCM len, SCM fill) +{ + init_weak_vectors (); + return scm_call_2 (scm_variable_ref (make_weak_vector_var), len, + SCM_UNBNDP (fill) ? SCM_BOOL_F : fill); +} + +SCM +scm_weak_vector (SCM l) +{ + init_weak_vectors (); + return scm_call_1 (scm_variable_ref (weak_vector_var), l); +} + +SCM +scm_weak_vector_p (SCM x) +{ + init_weak_vectors (); + return scm_call_1 (scm_variable_ref (weak_vector_p_var), x); +} + +SCM +scm_weak_vector_length (SCM v) +{ + init_weak_vectors (); + return scm_call_1 (scm_variable_ref (weak_vector_length_var), v); +} + +SCM +scm_weak_vector_ref (SCM v, SCM k) +{ + init_weak_vectors (); + return scm_call_2 (scm_variable_ref (weak_vector_ref_var), v, k); +} + +SCM +scm_weak_vector_set_x (SCM v, SCM k, SCM x) +{ + init_weak_vectors (); + scm_call_3 (scm_variable_ref (weak_vector_set_x_var), v, k, x); + return SCM_UNSPECIFIED; +} + +SCM +scm_c_make_weak_vector (size_t len, SCM fill) +{ + return scm_make_weak_vector (scm_from_size_t (len), fill); +} + +int +scm_is_weak_vector (SCM obj) +{ + return scm_is_true (scm_weak_vector_p (obj)); +} + +size_t +scm_c_weak_vector_length (SCM vec) +{ + return scm_to_size_t (scm_weak_vector_length (vec)); +} + +SCM +scm_c_weak_vector_ref (SCM v, size_t k) +{ + return scm_weak_vector_ref (v, scm_from_size_t (k)); +} + +void +scm_c_weak_vector_set_x (SCM v, size_t k, SCM x) +{ + scm_weak_vector_set_x (v, scm_from_size_t (k), x); +} + + + void scm_i_init_deprecated () { |