diff options
| author | Philipp Stephani | 2017-06-05 13:29:14 +0200 |
|---|---|---|
| committer | Philipp Stephani | 2017-06-12 15:22:27 +0200 |
| commit | cf97132764572928adc77fd555d04a9f41cd3cfc (patch) | |
| tree | 65f707de87b811caec7b08f96938059859cf001c /src/lisp.h | |
| parent | b49dd3b047bf07994d9577e08daba55f143a8bb1 (diff) | |
| download | emacs-cf97132764572928adc77fd555d04a9f41cd3cfc.tar.gz emacs-cf97132764572928adc77fd555d04a9f41cd3cfc.zip | |
Implement module assertions for users
Add a new command-line option '-module-assertions' that users can
enable developing or debugging a module. If this option is present,
Emacs performs additional checks to verify that modules fulfill their
requirements. These checks are expensive and crash Emacs if modules
are invalid, so disable them by default.
This is a command-line option instead of an ordinary variable because
changing it while Emacs is running would cause data structure
imbalances.
* src/emacs.c (main): New command line option '-module-assertions'.
* src/emacs-module.c (module_assert_main_thread)
(module_assert_runtime, module_assert_env, module_assert_value):
New functions to assert module requirements.
(syms_of_module): New uninterned variable 'module-runtimes'.
(init_module_assertions, in_main_thread, module_abort): New helper
functions.
(initialize_environment): Initialize value list. If assertions are
enabled, use a heap-allocated environment object.
(finalize_environment): Add assertion that environment list is never
empty.
(finalize_runtime_unwind): Pop module runtime object stack.
(value_to_lisp): Assert that the value is valid.
(lisp_to_value): Record new value if assertions are enabled.
(mark_modules): Mark allocated object list.
(MODULE_FUNCTION_BEGIN_NO_CATCH)
(module_non_local_exit_check, module_non_local_exit_clear)
(module_non_local_exit_get, module_non_local_exit_signal)
(module_non_local_exit_throw): Assert thread and environment.
(module_get_environment): Assert thread and runtime.
(module_make_function, module_funcall, module_intern)
(module_funcall, module_make_integer, module_make_float)
(module_make_string, module_make_user_ptr, module_vec_get)
(funcall_module, Fmodule_load): Adapt callers.
(module_make_global_ref): If assertions are enabled, use the global
environment to store global values.
(module_free_global_ref): Remove value from global value list.
* test/Makefile.in (EMACSOPT): Enable module assertions when testing
modules.
* test/data/emacs-module/mod-test.c (Fmod_test_invalid_store)
(Fmod_test_invalid_load): New functions to test module assertions.
(emacs_module_init): Bind the new functions.
* test/src/emacs-module-tests.el (mod-test-emacs): New constant for
the Emacs binary file.
(mod-test-file): New constant for the test module file name.
(module--test-assertions): New unit test.
Diffstat (limited to 'src/lisp.h')
| -rw-r--r-- | src/lisp.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/src/lisp.h b/src/lisp.h index ade188fd209..ff8dde2b825 100644 --- a/src/lisp.h +++ b/src/lisp.h | |||
| @@ -3943,6 +3943,7 @@ extern Lisp_Object make_user_ptr (void (*finalizer) (void *), void *p); | |||
| 3943 | extern Lisp_Object funcall_module (Lisp_Object, ptrdiff_t, Lisp_Object *); | 3943 | extern Lisp_Object funcall_module (Lisp_Object, ptrdiff_t, Lisp_Object *); |
| 3944 | extern Lisp_Object module_function_arity (const struct Lisp_Module_Function *); | 3944 | extern Lisp_Object module_function_arity (const struct Lisp_Module_Function *); |
| 3945 | extern void mark_modules (void); | 3945 | extern void mark_modules (void); |
| 3946 | extern void init_module_assertions (bool); | ||
| 3946 | extern void syms_of_module (void); | 3947 | extern void syms_of_module (void); |
| 3947 | #endif | 3948 | #endif |
| 3948 | 3949 | ||