]> git.eshelyaron.com Git - emacs.git/commitdiff
Refactoring: Reduce code duplication
authorPhilipp Stephani <phst@google.com>
Sat, 19 Jan 2019 22:40:35 +0000 (23:40 +0100)
committerPhilipp Stephani <phst@google.com>
Fri, 19 Apr 2019 20:33:40 +0000 (22:33 +0200)
* src/emacs-module.c (value_storage_contains_p): New function.
(module_free_global_ref, value_to_lisp): Use it.

src/emacs-module.c

index ad32d3a91f1c72642dc43d03af9cebb99e5f5bd3..5467704df7f5d45bf04ad9a9faa2f66d56b9d53d 100644 (file)
@@ -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;
 \f
@@ -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, ...)
 {