From 6e00ffe317797ead28ac45f9b609e35553bcdbd1 Mon Sep 17 00:00:00 2001 From: Philipp Stephani Date: Fri, 9 Jun 2017 01:25:47 +0200 Subject: [PATCH] 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. --- src/alloc.c | 4 ++++ src/emacs-module.c | 14 ++++++++++++++ src/lisp.h | 1 + 3 files changed, 19 insertions(+) diff --git a/src/alloc.c b/src/alloc.c index a1a85946ce0..ac3de83b2b6 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -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. */ diff --git a/src/emacs-module.c b/src/emacs-module.c index bebfe594426..1a8c1768230 100644 --- a/src/emacs-module.c +++ b/src/emacs-module.c @@ -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. */ diff --git a/src/lisp.h b/src/lisp.h index c35bd1f6df1..ee703893e22 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -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 -- 2.39.2