diff options
author | Marius Vollmer <mvo@zagadka.de> | 2005-01-06 18:56:34 +0000 |
---|---|---|
committer | Marius Vollmer <mvo@zagadka.de> | 2005-01-06 18:56:34 +0000 |
commit | c8857a4db44ba4242ae05f57fe89ffd4e3971776 (patch) | |
tree | 3320a9e67ffbfd694c63a16fa87dc00fd8d35009 | |
parent | fea99690f2e31b08d4261d91509c6fed7d945125 (diff) | |
download | guile-c8857a4db44ba4242ae05f57fe89ffd4e3971776.tar.gz |
(scm_array_handle_release): New, changed all uses of
scm_t_array_handle to properly call it.
(scm_vector_get_handle, scm_generalized_vector_get_handle):
Renamed former to latter, changed all uses.
-rw-r--r-- | libguile/convert.i.c | 6 | ||||
-rw-r--r-- | libguile/gh_data.c | 12 | ||||
-rw-r--r-- | libguile/goops.c | 14 | ||||
-rw-r--r-- | libguile/random.c | 7 | ||||
-rw-r--r-- | libguile/sort.c | 7 | ||||
-rw-r--r-- | libguile/vectors.c | 13 | ||||
-rw-r--r-- | libguile/weaks.c | 2 |
7 files changed, 49 insertions, 12 deletions
diff --git a/libguile/convert.i.c b/libguile/convert.i.c index 5c30430b9..4e73bf970 100644 --- a/libguile/convert.i.c +++ b/libguile/convert.i.c @@ -79,6 +79,8 @@ SCM2CTYPES (SCM obj, CTYPE *data) for (i = 0; i < len; i++, uvec_elements += inc) data[i] = uvec_elements[i]; + scm_array_handle_release (&handle); + return data; } @@ -114,6 +116,8 @@ CTYPES2UVECT (const CTYPE *data, long n) for (i = 0; i < n; i++) uvec_elements[i] = data[i]; + scm_array_handle_release (&handle); + return uvec; } @@ -134,6 +138,8 @@ CTYPES2UVECT_2 (const CTYPE_2 *data, long n) for (i = 0; i < n; i++) uvec_elements[i] = data[i]; + scm_array_handle_release (&handle); + return uvec; } diff --git a/libguile/gh_data.c b/libguile/gh_data.c index 859327cd7..2d437dbb9 100644 --- a/libguile/gh_data.c +++ b/libguile/gh_data.c @@ -258,9 +258,11 @@ gh_scm2chars (SCM obj, char *m) scm_list_1 (obj)); if (m == 0) m = (char *) malloc (len); + if (m != NULL) + memcpy (m, elts, len); + scm_array_handle_release (&handle); if (m == NULL) return NULL; - memcpy (m, elts, len); break; } else @@ -296,9 +298,11 @@ scm2whatever (SCM obj, void *m, size_t size) if (m == 0) m = malloc (len * sizeof (size)); - if (m == NULL) - return NULL; - memcpy (m, elts, len * size); + if (m != NULL) + memcpy (m, elts, len * size); + + scm_array_handle_release (&handle); + return m; } diff --git a/libguile/goops.c b/libguile/goops.c index 066ff3001..e513d1ad8 100644 --- a/libguile/goops.c +++ b/libguile/goops.c @@ -1904,6 +1904,7 @@ sort_applicable_methods (SCM method_list, long size, SCM const *targs) } /* If we are here, that's that we did it the hard way... */ + scm_array_handle_release (&handle); return scm_vector_to_list (vector); } @@ -1963,6 +1964,9 @@ scm_compute_applicable_methods (SCM gf, SCM args, long len, int find_method_p) } } + if (len >= BUFFSIZE) + scm_array_handle_release (&handle); + if (count == 0) { if (find_method_p) @@ -2188,17 +2192,15 @@ SCM_DEFINE (scm_sys_method_more_specific_p, "%method-more-specific?", 3, 0, 0, v = scm_c_make_vector (len, SCM_EOL); v_elts = scm_vector_writable_elements (v, &handle, NULL, NULL); - for (i = 0, l = targs; !scm_is_null (l); i++, l = SCM_CDR (l)) + for (i = 0, l = targs; i < len && scm_is_pair (l); i++, l = SCM_CDR (l)) { SCM_ASSERT (SCM_CLASSP (SCM_CAR (l)), targs, SCM_ARG3, FUNC_NAME); v_elts[i] = SCM_CAR(l); } - - /* V_ELTS is only protected as long as HANDLE is, so we need to make - sure that more_specificp is not tail-called. - */ result = more_specificp (m1, m2, v_elts) ? SCM_BOOL_T: SCM_BOOL_F; - scm_remember_upto_here_1 (v); + + scm_array_handle_release (&handle); + return result; } #undef FUNC_NAME diff --git a/libguile/random.c b/libguile/random.c index 37d16fc1c..82bd31784 100644 --- a/libguile/random.c +++ b/libguile/random.c @@ -446,6 +446,8 @@ vector_scale_x (SCM v, double c) for (i = 0; i < len; i++, elts += inc) *elts *= c; + + scm_array_handle_release (&handle); } } @@ -479,6 +481,7 @@ vector_sum_squares (SCM v) sum += x * x; } + scm_array_handle_release (&handle); } return sum; } @@ -545,7 +548,7 @@ SCM_DEFINE (scm_random_normal_vector_x, "random:normal-vector!", 1, 1, 0, state = SCM_VARIABLE_REF (scm_var_random_state); SCM_VALIDATE_RSTATE (2, state); - scm_vector_get_handle (v, &handle); + scm_generalized_vector_get_handle (v, &handle); dim = scm_array_handle_dims (&handle); if (scm_is_vector (v)) @@ -562,6 +565,8 @@ SCM_DEFINE (scm_random_normal_vector_x, "random:normal-vector!", 1, 1, 0, *elts = scm_c_normal01 (SCM_RSTATE (state)); } + scm_array_handle_release (&handle); + return SCM_UNSPECIFIED; } #undef FUNC_NAME diff --git a/libguile/sort.c b/libguile/sort.c index 7eb6d63ff..f95d743d1 100644 --- a/libguile/sort.c +++ b/libguile/sort.c @@ -93,6 +93,8 @@ SCM_DEFINE (scm_restricted_vector_sort_x, "restricted-vector-sort!", 4, 0, 0, else quicksort (velts + spos*vinc, len, vinc, cmp, less); + scm_array_handle_release (&handle); + return SCM_UNSPECIFIED; } #undef FUNC_NAME @@ -158,6 +160,8 @@ SCM_DEFINE (scm_sorted_p, "sorted?", 2, 0, 0, } } + scm_array_handle_release (&handle); + return result; } @@ -509,6 +513,9 @@ SCM_DEFINE (scm_stable_sort_x, "stable-sort!", 2, 0, 0, scm_merge_vector_step (vec_elts, temp_elts, cmp, less, 0, len-1, inc); + scm_array_handle_release (&temp_handle); + scm_array_handle_release (&vec_handle); + return items; } else diff --git a/libguile/vectors.c b/libguile/vectors.c index 0375e5882..63b60cd25 100644 --- a/libguile/vectors.c +++ b/libguile/vectors.c @@ -177,13 +177,15 @@ SCM_DEFINE (scm_vector, "vector", 0, 0, 1, res = scm_c_make_vector (len, SCM_UNSPECIFIED); data = scm_vector_writable_elements (res, &handle, NULL, NULL); i = 0; - while (!SCM_NULL_OR_NIL_P (l) && i < len) + while (scm_is_pair (l) && i < len) { data[i] = SCM_CAR (l); l = SCM_CDR (l); i += 1; } + scm_array_handle_release (&handle); + return res; } #undef FUNC_NAME @@ -353,6 +355,7 @@ SCM_DEFINE (scm_vector_copy, "vector-copy", 1, 0, 0, dst = scm_gc_malloc (len * sizeof (SCM), "vector"); for (i = 0; i < len; i++, src += inc) dst[i] = *src; + scm_array_handle_release (&handle); return scm_cell ((len << 8) | scm_tc7_vector, (scm_t_bits) dst); } @@ -425,6 +428,7 @@ SCM_DEFINE (scm_vector_to_list, "vector->list", 1, 0, 0, i -= inc; res = scm_cons (data[i], res); } + scm_array_handle_release (&handle); return res; } #undef FUNC_NAME @@ -444,6 +448,7 @@ SCM_DEFINE (scm_vector_fill_x, "vector-fill!", 2, 0, 0, data = scm_vector_writable_elements (v, &handle, &len, &inc); for (i = 0; i < len; i += inc) data[i] = fill; + scm_array_handle_release (&handle); return SCM_UNSPECIFIED; } #undef FUNC_NAME @@ -492,6 +497,9 @@ SCM_DEFINE (scm_vector_move_left_x, "vector-move-left!", 5, 0, 0, for (; i < e; i += inc1, j += inc2) elts2[j] = elts1[i]; + scm_array_handle_release (&handle2); + scm_array_handle_release (&handle1); + return SCM_UNSPECIFIED; } #undef FUNC_NAME @@ -531,6 +539,9 @@ SCM_DEFINE (scm_vector_move_right_x, "vector-move-right!", 5, 0, 0, elts2[j] = elts1[e]; } + scm_array_handle_release (&handle2); + scm_array_handle_release (&handle1); + return SCM_UNSPECIFIED; } #undef FUNC_NAME diff --git a/libguile/weaks.c b/libguile/weaks.c index 6eeebcada..6e51040bb 100644 --- a/libguile/weaks.c +++ b/libguile/weaks.c @@ -107,6 +107,8 @@ SCM_DEFINE (scm_weak_vector, "weak-vector", 0, 0, 1, i--; } + scm_array_handle_release (&handle); + return res; } #undef FUNC_NAME |