summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Stephani <phst@google.com>2017-06-09 01:25:47 +0200
committerPhilipp Stephani <phst@google.com>2017-06-09 01:25:47 +0200
commit6e00ffe317797ead28ac45f9b609e35553bcdbd1 (patch)
treebb7476cce152dc4232f7463df2792c029083873c
parenta62d15763df16e64b452b24191e12c0e32a2de6b (diff)
downloademacs-6e00ffe317797ead28ac45f9b609e35553bcdbd1.tar.gz
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.
-rw-r--r--src/alloc.c4
-rw-r--r--src/emacs-module.c14
-rw-r--r--src/lisp.h1
3 files changed, 19 insertions, 0 deletions
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