[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] master 5497062 09/14: Add a couple more assertions to the
From: |
Philipp Stephani |
Subject: |
[Emacs-diffs] master 5497062 09/14: Add a couple more assertions to the module code |
Date: |
Sun, 4 Jun 2017 13:54:07 -0400 (EDT) |
branch: master
commit 549706241e5ce6fe7f1131d7f132a19bdb1abdd9
Author: Philipp Stephani <address@hidden>
Commit: Philipp Stephani <address@hidden>
Add a couple more assertions to the module code
These can help module authors debug crashes.
* emacs-module.c (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)
(module_copy_string_contents, module_make_string)
(funcall_module, initialize_environment): Add assertions
---
src/emacs-module.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/src/emacs-module.c b/src/emacs-module.c
index 1cd4eb2..d4047d6 100644
--- a/src/emacs-module.c
+++ b/src/emacs-module.c
@@ -307,6 +307,7 @@ module_free_global_ref (emacs_env *env, emacs_value ref)
static enum emacs_funcall_exit
module_non_local_exit_check (emacs_env *env)
{
+ eassert (env != NULL);
check_main_thread ();
return env->private_members->pending_non_local_exit;
}
@@ -314,6 +315,7 @@ module_non_local_exit_check (emacs_env *env)
static void
module_non_local_exit_clear (emacs_env *env)
{
+ eassert (env != NULL);
check_main_thread ();
env->private_members->pending_non_local_exit = emacs_funcall_exit_return;
}
@@ -321,6 +323,9 @@ module_non_local_exit_clear (emacs_env *env)
static enum emacs_funcall_exit
module_non_local_exit_get (emacs_env *env, emacs_value *sym, emacs_value *data)
{
+ eassert (env != NULL);
+ eassert (sym != NULL);
+ eassert (data != NULL);
check_main_thread ();
struct emacs_env_private *p = env->private_members;
if (p->pending_non_local_exit != emacs_funcall_exit_return)
@@ -336,6 +341,7 @@ module_non_local_exit_get (emacs_env *env, emacs_value
*sym, emacs_value *data)
static void
module_non_local_exit_signal (emacs_env *env, emacs_value sym, emacs_value
data)
{
+ eassert (env != NULL);
check_main_thread ();
if (module_non_local_exit_check (env) == emacs_funcall_exit_return)
module_non_local_exit_signal_1 (env, value_to_lisp (sym),
@@ -345,6 +351,7 @@ module_non_local_exit_signal (emacs_env *env, emacs_value
sym, emacs_value data)
static void
module_non_local_exit_throw (emacs_env *env, emacs_value tag, emacs_value
value)
{
+ eassert (env != NULL);
check_main_thread ();
if (module_non_local_exit_check (env) == emacs_funcall_exit_return)
module_non_local_exit_throw_1 (env, value_to_lisp (tag),
@@ -483,6 +490,7 @@ module_copy_string_contents (emacs_env *env, emacs_value
value, char *buffer,
Lisp_Object lisp_str_utf8 = ENCODE_UTF_8 (lisp_str);
ptrdiff_t raw_size = SBYTES (lisp_str_utf8);
ptrdiff_t required_buf_size = raw_size + 1;
+ eassert (required_buf_size > 0);
eassert (length != NULL);
@@ -501,6 +509,7 @@ module_copy_string_contents (emacs_env *env, emacs_value
value, char *buffer,
}
*length = required_buf_size;
+ eassert (SREF (lisp_str_utf8, raw_size) == '\0');
memcpy (buffer, SDATA (lisp_str_utf8), raw_size + 1);
return true;
@@ -510,6 +519,7 @@ static emacs_value
module_make_string (emacs_env *env, const char *str, ptrdiff_t length)
{
MODULE_FUNCTION_BEGIN (module_nil);
+ eassert (str != NULL);
AUTO_STRING_WITH_LEN (lstr, str, length);
return lisp_to_value (code_convert_string_norecord (lstr, Qutf_8, false));
}
@@ -701,7 +711,11 @@ Lisp_Object
module_function_arity (const struct Lisp_Module_Function *const function)
{
ptrdiff_t minargs = function->min_arity;
+ eassert (minargs >= 0);
+ eassert (minargs <= MOST_POSITIVE_FIXNUM);
ptrdiff_t maxargs = function->max_arity;
+ eassert (maxargs >= minargs || maxargs == MANY);
+ eassert (maxargs <= MOST_POSITIVE_FIXNUM);
return Fcons (make_number (minargs),
maxargs == MANY ? Qmany : make_number (maxargs));
}
@@ -906,6 +920,8 @@ initialize_environment (emacs_env *env, struct
emacs_env_private *priv)
static void
finalize_environment (emacs_env *env, struct emacs_env_private *priv)
{
+ eassert (env->private_members == priv);
+ eassert (XSAVE_POINTER (XCAR (Vmodule_environments), 0) == env);
Vmodule_environments = XCDR (Vmodule_environments);
}
- [Emacs-diffs] master updated (bd3c6ee -> 2aa8b15), Philipp Stephani, 2017/06/04
- [Emacs-diffs] master db74384 01/14: Remove two FIXMEs that can't be fixed, Philipp Stephani, 2017/06/04
- [Emacs-diffs] master 1839699 02/14: Define helper macro to reduce code duplication, Philipp Stephani, 2017/06/04
- [Emacs-diffs] master 034275e 07/14: ; Small comment fix, Philipp Stephani, 2017/06/04
- [Emacs-diffs] master 3b0080d 03/14: Rework printing of module functions, Philipp Stephani, 2017/06/04
- [Emacs-diffs] master 366e25a 05/14: Simplify interface of dynlib_attr., Philipp Stephani, 2017/06/04
- [Emacs-diffs] master a8a93b1 10/14: Guard against signed integer overflows, Philipp Stephani, 2017/06/04
- [Emacs-diffs] master fb3a9fd 08/14: ; Grammar fix, Philipp Stephani, 2017/06/04
- [Emacs-diffs] master 9be8b2b 06/14: Use ATTRIBUTE_MAY_ALIAS where alias violations are likely, Philipp Stephani, 2017/06/04
- [Emacs-diffs] master 5497062 09/14: Add a couple more assertions to the module code,
Philipp Stephani <=
- [Emacs-diffs] master 27445a8 11/14: Remove an unneeded assertion, Philipp Stephani, 2017/06/04
- [Emacs-diffs] master 2aa8b15 14/14: Remove an unused error symbol, Philipp Stephani, 2017/06/04
- [Emacs-diffs] master d372017 12/14: Use more specific errors for module load failure, Philipp Stephani, 2017/06/04
- [Emacs-diffs] master 045d21c 04/14: Rationalize environment lifetime management functions, Philipp Stephani, 2017/06/04
- [Emacs-diffs] master 66da3f4 13/14: Support quitting in modules, Philipp Stephani, 2017/06/04