diff options
Diffstat (limited to 'libguile/weaks.c')
-rw-r--r-- | libguile/weaks.c | 90 |
1 files changed, 22 insertions, 68 deletions
diff --git a/libguile/weaks.c b/libguile/weaks.c index 250a4cf7d..6eeebcada 100644 --- a/libguile/weaks.c +++ b/libguile/weaks.c @@ -66,49 +66,6 @@ */ -/* Allocate memory for a weak vector on behalf of the caller. The allocated - * vector will be of the given weak vector subtype. It will contain size - * elements which are initialized with the 'fill' object, or, if 'fill' is - * undefined, with an unspecified object. - */ -SCM -scm_i_allocate_weak_vector (scm_t_bits type, SCM size, SCM fill, const char* caller) -#define FUNC_NAME caller -{ - size_t c_size; - SCM v; - - c_size = scm_to_unsigned_integer (size, 0, SCM_VECTOR_MAX_LENGTH); - - if (c_size > 0) - { - scm_t_bits *base; - size_t j; - - if (SCM_UNBNDP (fill)) - fill = SCM_UNSPECIFIED; - - base = scm_gc_malloc (c_size * sizeof (scm_t_bits), "weak vector"); - for (j = 0; j != c_size; ++j) - base[j] = SCM_UNPACK (fill); - v = scm_double_cell (SCM_MAKE_VECTOR_TAG (c_size, scm_tc7_wvect), - (scm_t_bits) base, - type, - SCM_UNPACK (SCM_EOL)); - scm_remember_upto_here_1 (fill); - } - else - { - v = scm_double_cell (SCM_MAKE_VECTOR_TAG (0, scm_tc7_wvect), - (scm_t_bits) NULL, - type, - SCM_UNPACK (SCM_EOL)); - } - - return v; -} -#undef FUNC_NAME - SCM_DEFINE (scm_make_weak_vector, "make-weak-vector", 1, 1, 0, (SCM size, SCM fill), "Return a weak vector with @var{size} elements. If the optional\n" @@ -117,7 +74,7 @@ SCM_DEFINE (scm_make_weak_vector, "make-weak-vector", 1, 1, 0, "empty list.") #define FUNC_NAME s_scm_make_weak_vector { - return scm_i_allocate_weak_vector (0, size, fill, FUNC_NAME); + return scm_i_allocate_weak_vector (0, size, fill); } #undef FUNC_NAME @@ -133,24 +90,21 @@ SCM_DEFINE (scm_weak_vector, "weak-vector", 0, 0, 1, "the same way @code{list->vector} would.") #define FUNC_NAME s_scm_weak_vector { - SCM res; - SCM *data; + scm_t_array_handle handle; + SCM res, *data; long i; - /* Dirk:FIXME:: In case of multiple threads, the list might get corrupted - while the vector is being created. */ i = scm_ilength (l); SCM_ASSERT (i >= 0, l, SCM_ARG1, FUNC_NAME); + res = scm_make_weak_vector (scm_from_int (i), SCM_UNSPECIFIED); + data = scm_vector_writable_elements (res, &handle, NULL, NULL); - /* - no alloc, so this loop is safe. - */ - data = SCM_WRITABLE_VELTS (res); - while (!SCM_NULL_OR_NIL_P (l)) + while (scm_is_pair (l) && i > 0) { *data++ = SCM_CAR (l); l = SCM_CDR (l); + i--; } return res; @@ -164,7 +118,7 @@ SCM_DEFINE (scm_weak_vector_p, "weak-vector?", 1, 0, 0, "weak hashes are also weak vectors.") #define FUNC_NAME s_scm_weak_vector_p { - return scm_from_bool (SCM_WVECTP (obj) && !SCM_IS_WHVEC (obj)); + return scm_from_bool (SCM_I_WVECTP (obj) && !SCM_IS_WHVEC (obj)); } #undef FUNC_NAME @@ -183,7 +137,7 @@ SCM_DEFINE (scm_make_weak_key_alist_vector, "make-weak-key-alist-vector", 0, 1, #define FUNC_NAME s_scm_make_weak_key_alist_vector { return scm_i_allocate_weak_vector - (1, SCM_UNBNDP (size) ? scm_from_int (31) : size, SCM_EOL, FUNC_NAME); + (1, SCM_UNBNDP (size) ? scm_from_int (31) : size, SCM_EOL); } #undef FUNC_NAME @@ -195,7 +149,7 @@ SCM_DEFINE (scm_make_weak_value_alist_vector, "make-weak-value-alist-vector", 0, #define FUNC_NAME s_scm_make_weak_value_alist_vector { return scm_i_allocate_weak_vector - (2, SCM_UNBNDP (size) ? scm_from_int (31) : size, SCM_EOL, FUNC_NAME); + (2, SCM_UNBNDP (size) ? scm_from_int (31) : size, SCM_EOL); } #undef FUNC_NAME @@ -207,7 +161,7 @@ SCM_DEFINE (scm_make_doubly_weak_alist_vector, "make-doubly-weak-alist-vector", #define FUNC_NAME s_scm_make_doubly_weak_alist_vector { return scm_i_allocate_weak_vector - (3, SCM_UNBNDP (size) ? scm_from_int (31) : size, SCM_EOL, FUNC_NAME); + (3, SCM_UNBNDP (size) ? scm_from_int (31) : size, SCM_EOL); } #undef FUNC_NAME @@ -221,7 +175,7 @@ SCM_DEFINE (scm_weak_key_alist_vector_p, "weak-key-alist-vector?", 1, 0, 0, "nor a weak value hash table.") #define FUNC_NAME s_scm_weak_key_alist_vector_p { - return scm_from_bool (SCM_WVECTP (obj) && SCM_IS_WHVEC (obj)); + return scm_from_bool (SCM_I_WVECTP (obj) && SCM_IS_WHVEC (obj)); } #undef FUNC_NAME @@ -231,7 +185,7 @@ SCM_DEFINE (scm_weak_value_alist_vector_p, "weak-value-alist-vector?", 1, 0, 0, "Return @code{#t} if @var{obj} is a weak value hash table.") #define FUNC_NAME s_scm_weak_value_alist_vector_p { - return scm_from_bool (SCM_WVECTP (obj) && SCM_IS_WHVEC_V (obj)); + return scm_from_bool (SCM_I_WVECTP (obj) && SCM_IS_WHVEC_V (obj)); } #undef FUNC_NAME @@ -241,7 +195,7 @@ SCM_DEFINE (scm_doubly_weak_alist_vector_p, "doubly-weak-alist-vector?", 1, 0, 0 "Return @code{#t} if @var{obj} is a doubly weak hash table.") #define FUNC_NAME s_scm_doubly_weak_alist_vector_p { - return scm_from_bool (SCM_WVECTP (obj) && SCM_IS_WHVEC_B (obj)); + return scm_from_bool (SCM_I_WVECTP (obj) && SCM_IS_WHVEC_B (obj)); } #undef FUNC_NAME @@ -264,7 +218,7 @@ scm_mark_weak_vector_spines (void *dummy1 SCM_UNUSED, { SCM w; - for (w = scm_weak_vectors; !scm_is_null (w); w = SCM_WVECT_GC_CHAIN (w)) + for (w = scm_weak_vectors; !scm_is_null (w); w = SCM_I_WVECT_GC_CHAIN (w)) { if (SCM_IS_WHVEC_ANY (w)) { @@ -274,8 +228,8 @@ scm_mark_weak_vector_spines (void *dummy1 SCM_UNUSED, long n; obj = w; - ptr = SCM_VELTS (w); - n = SCM_VECTOR_LENGTH (w); + ptr = SCM_I_WVECT_GC_WVELTS (w); + n = SCM_I_WVECT_LENGTH (w); for (j = 0; j < n; ++j) { SCM alist; @@ -304,14 +258,14 @@ scm_scan_weak_vectors (void *dummy1 SCM_UNUSED, void *dummy3 SCM_UNUSED) { SCM *ptr, w; - for (w = scm_weak_vectors; !scm_is_null (w); w = SCM_WVECT_GC_CHAIN (w)) + for (w = scm_weak_vectors; !scm_is_null (w); w = SCM_I_WVECT_GC_CHAIN (w)) { if (!SCM_IS_WHVEC_ANY (w)) { register long j, n; - ptr = SCM_GC_WRITABLE_VELTS (w); - n = SCM_VECTOR_LENGTH (w); + ptr = SCM_I_WVECT_GC_WVELTS (w); + n = SCM_I_WVECT_LENGTH (w); for (j = 0; j < n; ++j) if (UNMARKED_CELL_P (ptr[j])) ptr[j] = SCM_BOOL_F; @@ -321,12 +275,12 @@ scm_scan_weak_vectors (void *dummy1 SCM_UNUSED, else if (!SCM_WVECT_NOSCAN_P (w)) { SCM obj = w; - register long n = SCM_VECTOR_LENGTH (w); + register long n = SCM_I_WVECT_LENGTH (w); register long j; int weak_keys = SCM_IS_WHVEC (obj) || SCM_IS_WHVEC_B (obj); int weak_values = SCM_IS_WHVEC_V (obj) || SCM_IS_WHVEC_B (obj); - ptr = SCM_GC_WRITABLE_VELTS (w); + ptr = SCM_I_WVECT_GC_WVELTS (w); for (j = 0; j < n; ++j) { |