Commit ba2e3a8a authored by Philipp Stephani's avatar Philipp Stephani

Refactoring: Reduce code duplication

* src/emacs-module.c (value_storage_contains_p): New function.
(module_free_global_ref, value_to_lisp): Use it.
parent a59c41ee
Pipeline #1362 failed with stage
in 68 minutes and 47 seconds
......@@ -209,6 +209,8 @@ static void module_non_local_exit_throw_1 (emacs_env *,
Lisp_Object, Lisp_Object);
static void module_out_of_memory (emacs_env *);
static void module_reset_handlerlist (struct handler **);
static bool value_storage_contains_p (const struct emacs_value_storage *,
emacs_value, ptrdiff_t *);
static bool module_assertions = false;
......@@ -403,16 +405,8 @@ module_free_global_ref (emacs_env *env, emacs_value ref)
if (module_assertions)
{
ptrdiff_t count = 0;
for (struct emacs_value_frame *frame = &global_storage.initial;
frame != NULL; frame = frame->next)
{
for (int i = 0; i < frame->offset; ++i)
{
if (&frame->objects[i] == ref)
return;
++count;
}
}
if (value_storage_contains_p (&global_storage, ref, &count))
return;
module_abort ("Global value was not found in list of %"pD"d globals",
count);
}
......@@ -978,29 +972,13 @@ value_to_lisp (emacs_value v)
if (&priv->non_local_exit_symbol == v
|| &priv->non_local_exit_data == v)
goto ok;
for (struct emacs_value_frame *frame = &priv->storage.initial;
frame != NULL; frame = frame->next)
{
for (int i = 0; i < frame->offset; ++i)
{
if (&frame->objects[i] == v)
goto ok;
++num_values;
}
}
if (value_storage_contains_p (&priv->storage, v, &num_values))
goto ok;
++num_environments;
}
/* Also check global values. */
for (struct emacs_value_frame *frame = &global_storage.initial;
frame != NULL; frame = frame->next)
{
for (int i = 0; i < frame->offset; ++i)
{
if (&frame->objects[i] == v)
goto ok;
++num_values;
}
}
if (value_storage_contains_p (&global_storage, v, &num_values))
goto ok;
module_abort (("Emacs value not found in %"pD"d values "
"of %"pD"d environments"),
num_values, num_environments);
......@@ -1215,6 +1193,26 @@ init_module_assertions (bool enable)
initialize_storage (&global_storage);
}
/* Return whether STORAGE contains VALUE. Used to check module
assertions. Increment *COUNT by the number of values searched. */
static bool
value_storage_contains_p (const struct emacs_value_storage *storage,
emacs_value value, ptrdiff_t *count)
{
for (const struct emacs_value_frame *frame = &storage->initial; frame != NULL;
frame = frame->next)
{
for (int i = 0; i < frame->offset; ++i)
{
if (&frame->objects[i] == value)
return true;
++count;
}
}
return false;
}
static AVOID ATTRIBUTE_FORMAT_PRINTF (1, 2)
module_abort (const char *format, ...)
{
......
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