+void
+scm_c_vector_set_x (SCM v, size_t k, SCM obj)
+{
+ if (SCM_I_IS_VECTOR (v))
+ {
+ if (k >= SCM_I_VECTOR_LENGTH (v))
+ scm_out_of_range (NULL, scm_from_size_t (k));
+ (SCM_I_VECTOR_WELTS(v))[k] = obj;
+ if (SCM_I_WVECTP (v))
+ {
+ /* Make it a weak pointer. */
+ GC_PTR link = (GC_PTR) & ((SCM_I_VECTOR_WELTS (v))[k]);
+ SCM_I_REGISTER_DISAPPEARING_LINK (link, obj);
+ }
+ }
+ else if (SCM_I_ARRAYP (v) && SCM_I_ARRAY_NDIM (v) == 1)
+ {
+ scm_t_array_dim *dim = SCM_I_ARRAY_DIMS (v);
+ SCM vv = SCM_I_ARRAY_V (v);
+ if (SCM_I_IS_VECTOR (vv))
+ {
+ if (k >= dim->ubnd - dim->lbnd + 1)
+ scm_out_of_range (NULL, scm_from_size_t (k));
+ k = SCM_I_ARRAY_BASE (v) + k*dim->inc;
+ (SCM_I_VECTOR_WELTS (vv))[k] = obj;
+
+ if (SCM_I_WVECTP (vv))
+ {
+ /* Make it a weak pointer. */
+ GC_PTR link = (GC_PTR) & ((SCM_I_VECTOR_WELTS (vv))[k]);
+ SCM_I_REGISTER_DISAPPEARING_LINK (link, obj);
+ }
+ }
+ else
+ scm_wrong_type_arg_msg (NULL, 0, v, "non-uniform vector");
+ }
+ else
+ {
+ if (SCM_UNPACK (g_vector_set_x))
+ scm_apply_generic (g_vector_set_x,
+ scm_list_3 (v, scm_from_size_t (k), obj));
+ else
+ scm_wrong_type_arg_msg (NULL, 0, v, "vector");
+ }
+}