1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-01-09 21:20:45 -08:00

igc-make-weak-vector

This commit is contained in:
Gerd Möllmann 2024-06-11 07:27:03 +02:00
parent 399b76455f
commit cd066bcdfa
2 changed files with 31 additions and 0 deletions

View file

@ -2939,6 +2939,15 @@ alloc_immovable (size_t size, enum igc_obj_type type)
return alloc_impl (size, type, t->d.ams_ap);
}
static mps_addr_t
alloc_weak (size_t size, enum igc_obj_type type, bool weak)
{
struct igc_thread_list *t = current_thread->gc_info;
if (weak)
return alloc_impl (size, type, t->d.weak_weak_ap);
return alloc_impl (size, type, t->d.weak_strong_ap);
}
void *
igc_alloc_global_ref (void)
{
@ -3199,6 +3208,26 @@ igc_valid_lisp_object_p (Lisp_Object obj)
return 1;
}
Lisp_Object
igc_make_weak_vector (ptrdiff_t len, Lisp_Object init)
{
struct Lisp_Vector *v = alloc_weak (len * word_size, IGC_OBJ_VECTOR, true);
v->header.size = len;
for (ptrdiff_t i = 0; i < len; ++i)
v->contents[i] = init;
return make_lisp_ptr (v, Lisp_Vectorlike);
}
DEFUN ("igc-make-weak-vector", Figc_make_weak_vector, Sigc_make_weak_vector, 2, 2, 0,
doc: /* Return a newly created vector of length LENGTH, with each element being INIT.
See also the function `vector'. */)
(Lisp_Object length, Lisp_Object init)
{
CHECK_TYPE (FIXNATP (length) && XFIXNAT (length) <= PTRDIFF_MAX,
Qwholenump, length);
return igc_make_weak_vector (XFIXNAT (length), init);
}
DEFUN ("igc-info", Figc_info, Sigc_info, 0, 0, 0, doc : /* */)
(void)
{
@ -3534,6 +3563,7 @@ void
syms_of_igc (void)
{
defsubr (&Sigc_info);
defsubr (&Sigc_make_weak_vector);
defsubr (&Sigc_roots);
defsubr (&Sigc__collect);
DEFSYM (Qambig, "ambig");

View file

@ -68,6 +68,7 @@ void igc_on_face_cache_change (void *face_cache);
void igc_process_messages (void);
Lisp_Object igc_make_cons (Lisp_Object car, Lisp_Object cdr);
Lisp_Object igc_make_weak_vector (ptrdiff_t len, Lisp_Object init);
Lisp_Object igc_alloc_symbol (void);
void *igc_alloc_global_ref (void);