Commit 6e00ffe3 authored by Philipp Stephani's avatar Philipp Stephani
Browse files

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.
parent a62d1576
...@@ -5942,6 +5942,10 @@ garbage_collect_1 (void *end) ...@@ -5942,6 +5942,10 @@ garbage_collect_1 (void *end)
mark_fringe_data (); mark_fringe_data ();
#endif #endif
#ifdef HAVE_MODULES
mark_modules ();
#endif
/* Everything is now marked, except for the data in font caches, /* Everything is now marked, except for the data in font caches,
undo lists, and finalizers. The first two are compacted by undo lists, and finalizers. The first two are compacted by
removing an items which aren't reachable otherwise. */ removing an items which aren't reachable otherwise. */
......
...@@ -871,6 +871,7 @@ static void ...@@ -871,6 +871,7 @@ static void
initialize_environment (emacs_env *env, struct emacs_env_private *priv) initialize_environment (emacs_env *env, struct emacs_env_private *priv)
{ {
priv->pending_non_local_exit = emacs_funcall_exit_return; 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->size = sizeof *env;
env->private_members = priv; env->private_members = priv;
env->make_global_ref = module_make_global_ref; env->make_global_ref = module_make_global_ref;
...@@ -926,6 +927,19 @@ finalize_runtime_unwind (void* raw_ert) ...@@ -926,6 +927,19 @@ finalize_runtime_unwind (void* raw_ert)
finalize_environment (&ert->private_members->pub); 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. */ /* Non-local exit handling. */
......
...@@ -3958,6 +3958,7 @@ extern Lisp_Object make_user_ptr (void (*finalizer) (void *), void *p); ...@@ -3958,6 +3958,7 @@ extern Lisp_Object make_user_ptr (void (*finalizer) (void *), void *p);
/* Defined in emacs-module.c. */ /* Defined in emacs-module.c. */
extern Lisp_Object funcall_module (Lisp_Object, ptrdiff_t, Lisp_Object *); extern Lisp_Object funcall_module (Lisp_Object, ptrdiff_t, Lisp_Object *);
extern Lisp_Object module_function_arity (const struct Lisp_Module_Function *); extern Lisp_Object module_function_arity (const struct Lisp_Module_Function *);
extern void mark_modules (void);
extern void syms_of_module (void); extern void syms_of_module (void);
#endif #endif
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment