Add garbage collection support for module environments

* src/emacs-module.c (mark_modules): New function.
(initialize_environment): Properly initialize Lisp objects.
* src/alloc.c (garbage_collect_1): Call it.
This commit is contained in:
Philipp Stephani 2017-06-09 01:25:47 +02:00
parent a62d15763d
commit 6e00ffe317
3 changed files with 19 additions and 0 deletions

View file

@ -5942,6 +5942,10 @@ garbage_collect_1 (void *end)
mark_fringe_data ();
#endif
#ifdef HAVE_MODULES
mark_modules ();
#endif
/* Everything is now marked, except for the data in font caches,
undo lists, and finalizers. The first two are compacted by
removing an items which aren't reachable otherwise. */

View file

@ -871,6 +871,7 @@ static void
initialize_environment (emacs_env *env, struct emacs_env_private *priv)
{
priv->pending_non_local_exit = emacs_funcall_exit_return;
priv->non_local_exit_symbol = priv->non_local_exit_data = Qnil;
env->size = sizeof *env;
env->private_members = priv;
env->make_global_ref = module_make_global_ref;
@ -926,6 +927,19 @@ finalize_runtime_unwind (void* raw_ert)
finalize_environment (&ert->private_members->pub);
}
void
mark_modules (void)
{
Lisp_Object tail = Vmodule_environments;
FOR_EACH_TAIL_SAFE (tail)
{
emacs_env *env = XSAVE_POINTER (XCAR (tail), 0);
struct emacs_env_private *priv = env->private_members;
mark_object (priv->non_local_exit_symbol);
mark_object (priv->non_local_exit_data);
}
}
/* Non-local exit handling. */

View file

@ -3958,6 +3958,7 @@ extern Lisp_Object make_user_ptr (void (*finalizer) (void *), void *p);
/* Defined in emacs-module.c. */
extern Lisp_Object funcall_module (Lisp_Object, ptrdiff_t, Lisp_Object *);
extern Lisp_Object module_function_arity (const struct Lisp_Module_Function *);
extern void mark_modules (void);
extern void syms_of_module (void);
#endif