unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Po Lu via "Emacs development discussions." <emacs-devel@gnu.org>
To: Paul Eggert <eggert@cs.ucla.edu>
Cc: Philipp Stephani <phst@google.com>,  Eli Zaretskii <eliz@gnu.org>,
	arsen@aarsen.me,  emacs-devel@gnu.org,
	 Daniel Colascione <dancol@dancol.org>
Subject: Re: __attribute__ ((cleanup)) and emacs-module.c
Date: Sat, 11 Mar 2023 09:37:29 +0800	[thread overview]
Message-ID: <878rg4f4py.fsf@yahoo.com> (raw)
In-Reply-To: <9e84c5c6-337f-e799-f031-1c443aebd412@cs.ucla.edu> (Paul Eggert's message of "Fri, 10 Mar 2023 17:03:57 -0800")

Paul Eggert <eggert@cs.ucla.edu> writes:

> On 2023-03-09 05:31, Po Lu wrote:
>> Philipp Stephani<phst@google.com>  writes:
>> 
>>> It's not impossible to do this
>>> manually (it's not so different from the unbind_to calls in the Emacs
>>> codebase), but rather error-prone.
>> Yes, I know why it's necessary.  I'm up to doing what what it does by
>> hand in portable C.
>
> Thanks for volunteering to take on this portability task.

Would people please review this change?  I have not yet had a chance to
test it, but if it is good I will install it to feature/android.

Thanks.

diff --git a/src/emacs-module.c b/src/emacs-module.c
index d9e564771d0..4719b15c992 100644
--- a/src/emacs-module.c
+++ b/src/emacs-module.c
@@ -253,10 +253,8 @@ module_decode_utf_8 (const char *str, ptrdiff_t len)
 
 /* It is very important that pushing the handler doesn't itself raise
    a signal.  Install the cleanup only after the handler has been
-   pushed.  Use __attribute__ ((cleanup)) to avoid
-   non-local-exit-prone manual cleanup.  This is an extension provided
-   by GCC and similar compilers; configure prevents module.c from
-   being compiled when it is not present.
+   pushed.  All code following this point should use
+   MODULE_INTERNAL_CLEANUP before each return.
 
    The do-while forces uses of the macro to be followed by a semicolon.
    This macro cannot enclose its entire body inside a do-while, as the
@@ -276,17 +274,20 @@ #define MODULE_HANDLE_NONLOCAL_EXIT(retval)                             \
       return retval;							\
     }									\
   struct handler *internal_cleanup                                      \
-    __attribute__ ((cleanup (module_reset_handlerlist)))                \
     = internal_handler;                                                 \
   if (sys_setjmp (internal_cleanup->jmp))                               \
     {									\
       module_handle_nonlocal_exit (env,                                 \
                                    internal_cleanup->nonlocal_exit,     \
                                    internal_cleanup->val);              \
+      module_reset_handlerlist (&internal_cleanup);			\
       return retval;							\
     }									\
   do { } while (false)
 
+#define MODULE_INTERNAL_CLEANUP			\
+  module_reset_handlerlist (&internal_cleanup)
+
 \f
 /* Implementation of runtime and environment functions.
 
@@ -313,7 +314,10 @@ #define MODULE_HANDLE_NONLOCAL_EXIT(retval)                             \
       Emacs functions, by placing the macro
       MODULE_HANDLE_NONLOCAL_EXIT right after the above 2 tests.
 
-   5. Do NOT use 'eassert' for checking validity of user code in the
+   5. Finally, any code which expands MODULE_HANDLE_NONLOCAL_EXIT
+      should use MODULE_INTERNAL_CLEANUP prior to returning.
+
+   6. Do NOT use 'eassert' for checking validity of user code in the
       module.  Instead, make those checks part of the code, and if the
       check fails, call 'module_non_local_exit_signal_1' or
       'module_non_local_exit_throw_1' to report the error.  This is
@@ -436,6 +440,7 @@ module_make_global_ref (emacs_env *env, emacs_value value)
       bool overflow = INT_ADD_WRAPV (ref->refcount, 1, &ref->refcount);
       if (overflow)
 	overflow_error ();
+      MODULE_INTERNAL_CLEANUP;
       return &ref->value;
     }
   else
@@ -448,6 +453,7 @@ module_make_global_ref (emacs_env *env, emacs_value value)
       Lisp_Object value;
       XSETPSEUDOVECTOR (value, ref, PVEC_OTHER);
       hash_put (h, new_obj, value, hashcode);
+      MODULE_INTERNAL_CLEANUP;
       return &ref->value;
     }
 }
@@ -479,6 +485,8 @@ module_free_global_ref (emacs_env *env, emacs_value global_value)
       if (--ref->refcount == 0)
         hash_remove_from_table (h, obj);
     }
+
+  MODULE_INTERNAL_CLEANUP;
 }
 
 static enum emacs_funcall_exit
@@ -572,6 +580,8 @@ #define XSET_MODULE_FUNCTION(var, ptr) \
 module_make_function (emacs_env *env, ptrdiff_t min_arity, ptrdiff_t max_arity,
 		      emacs_function func, const char *docstring, void *data)
 {
+  emacs_value value;
+
   MODULE_FUNCTION_BEGIN (NULL);
 
   if (! (0 <= min_arity
@@ -596,7 +606,9 @@ module_make_function (emacs_env *env, ptrdiff_t min_arity, ptrdiff_t max_arity,
   XSET_MODULE_FUNCTION (result, function);
   eassert (MODULE_FUNCTIONP (result));
 
-  return lisp_to_value (env, result);
+  value = lisp_to_value (env, result);
+  MODULE_INTERNAL_CLEANUP;
+  return value;
 }
 
 static emacs_finalizer
@@ -605,6 +617,7 @@ module_get_function_finalizer (emacs_env *env, emacs_value arg)
   MODULE_FUNCTION_BEGIN (NULL);
   Lisp_Object lisp = value_to_lisp (arg);
   CHECK_MODULE_FUNCTION (lisp);
+  MODULE_INTERNAL_CLEANUP;
   return XMODULE_FUNCTION (lisp)->finalizer;
 }
 
@@ -616,6 +629,7 @@ module_set_function_finalizer (emacs_env *env, emacs_value arg,
   Lisp_Object lisp = value_to_lisp (arg);
   CHECK_MODULE_FUNCTION (lisp);
   XMODULE_FUNCTION (lisp)->finalizer = fin;
+  MODULE_INTERNAL_CLEANUP;
 }
 
 void
@@ -635,6 +649,7 @@ module_make_interactive (emacs_env *env, emacs_value function, emacs_value spec)
   /* Normalize (interactive nil) to (interactive). */
   XMODULE_FUNCTION (lisp_fun)->interactive_form
     = NILP (lisp_spec) ? list1 (Qinteractive) : list2 (Qinteractive, lisp_spec);
+  MODULE_INTERNAL_CLEANUP;
 }
 
 Lisp_Object
@@ -668,21 +683,30 @@ module_funcall (emacs_env *env, emacs_value func, ptrdiff_t nargs,
     newargs[1 + i] = value_to_lisp (args[i]);
   emacs_value result = lisp_to_value (env, Ffuncall (nargs1, newargs));
   SAFE_FREE ();
+  MODULE_INTERNAL_CLEANUP;
   return result;
 }
 
 static emacs_value
 module_intern (emacs_env *env, const char *name)
 {
+  emacs_value tem;
+
   MODULE_FUNCTION_BEGIN (NULL);
-  return lisp_to_value (env, intern (name));
+  tem = lisp_to_value (env, intern (name));
+  MODULE_INTERNAL_CLEANUP;
+  return tem;
 }
 
 static emacs_value
 module_type_of (emacs_env *env, emacs_value arg)
 {
+  emacs_value tem;
+
   MODULE_FUNCTION_BEGIN (NULL);
-  return lisp_to_value (env, Ftype_of (value_to_lisp (arg)));
+  tem = lisp_to_value (env, Ftype_of (value_to_lisp (arg)));
+  MODULE_INTERNAL_CLEANUP;
+  return tem;
 }
 
 static bool
@@ -708,14 +732,20 @@ module_extract_integer (emacs_env *env, emacs_value arg)
   intmax_t i;
   if (! integer_to_intmax (lisp, &i))
     xsignal1 (Qoverflow_error, lisp);
+  MODULE_INTERNAL_CLEANUP;
   return i;
 }
 
 static emacs_value
 module_make_integer (emacs_env *env, intmax_t n)
 {
+  emacs_value value;
+
   MODULE_FUNCTION_BEGIN (NULL);
-  return lisp_to_value (env, make_int (n));
+  value = lisp_to_value (env, make_int (n));
+  MODULE_INTERNAL_CLEANUP;
+
+  return value;
 }
 
 static double
@@ -724,14 +754,21 @@ module_extract_float (emacs_env *env, emacs_value arg)
   MODULE_FUNCTION_BEGIN (0);
   Lisp_Object lisp = value_to_lisp (arg);
   CHECK_TYPE (FLOATP (lisp), Qfloatp, lisp);
+  MODULE_INTERNAL_CLEANUP;
+
   return XFLOAT_DATA (lisp);
 }
 
 static emacs_value
 module_make_float (emacs_env *env, double d)
 {
+  emacs_value value;
+
   MODULE_FUNCTION_BEGIN (NULL);
-  return lisp_to_value (env, make_float (d));
+  value = lisp_to_value (env, make_float (d));
+  MODULE_INTERNAL_CLEANUP;
+
+  return value;
 }
 
 static bool
@@ -763,6 +800,7 @@ module_copy_string_contents (emacs_env *env, emacs_value value, char *buf,
   if (buf == NULL)
     {
       *len = required_buf_size;
+      MODULE_INTERNAL_CLEANUP;
       return true;
     }
 
@@ -778,36 +816,51 @@ module_copy_string_contents (emacs_env *env, emacs_value value, char *buf,
   *len = required_buf_size;
   memcpy (buf, SDATA (lisp_str_utf8), raw_size + 1);
 
+  MODULE_INTERNAL_CLEANUP;
   return true;
 }
 
 static emacs_value
 module_make_string (emacs_env *env, const char *str, ptrdiff_t len)
 {
+  emacs_value value;
+
   MODULE_FUNCTION_BEGIN (NULL);
   if (! (0 <= len && len <= STRING_BYTES_BOUND))
     overflow_error ();
   Lisp_Object lstr
     = len == 0 ? empty_multibyte_string : module_decode_utf_8 (str, len);
-  return lisp_to_value (env, lstr);
+  value = lisp_to_value (env, lstr);
+  MODULE_INTERNAL_CLEANUP;
+  return value;
 }
 
 static emacs_value
 module_make_unibyte_string (emacs_env *env, const char *str, ptrdiff_t length)
 {
+  emacs_value value;
+
   MODULE_FUNCTION_BEGIN (NULL);
   if (! (0 <= length && length <= STRING_BYTES_BOUND))
     overflow_error ();
   Lisp_Object lstr
     = length == 0 ? empty_unibyte_string : make_unibyte_string (str, length);
-  return lisp_to_value (env, lstr);
+  value = lisp_to_value (env, lstr);
+  MODULE_INTERNAL_CLEANUP;
+
+  return value;
 }
 
 static emacs_value
 module_make_user_ptr (emacs_env *env, emacs_finalizer fin, void *ptr)
 {
+  emacs_value value;
+
   MODULE_FUNCTION_BEGIN (NULL);
-  return lisp_to_value (env, make_user_ptr (fin, ptr));
+  value = lisp_to_value (env, make_user_ptr (fin, ptr));
+  MODULE_INTERNAL_CLEANUP;
+
+  return value;
 }
 
 static void *
@@ -816,6 +869,8 @@ module_get_user_ptr (emacs_env *env, emacs_value arg)
   MODULE_FUNCTION_BEGIN (NULL);
   Lisp_Object lisp = value_to_lisp (arg);
   CHECK_USER_PTR (lisp);
+  MODULE_INTERNAL_CLEANUP;
+
   return XUSER_PTR (lisp)->p;
 }
 
@@ -826,6 +881,7 @@ module_set_user_ptr (emacs_env *env, emacs_value arg, void *ptr)
   Lisp_Object lisp = value_to_lisp (arg);
   CHECK_USER_PTR (lisp);
   XUSER_PTR (lisp)->p = ptr;
+  MODULE_INTERNAL_CLEANUP;
 }
 
 static emacs_finalizer
@@ -834,6 +890,7 @@ module_get_user_finalizer (emacs_env *env, emacs_value arg)
   MODULE_FUNCTION_BEGIN (NULL);
   Lisp_Object lisp = value_to_lisp (arg);
   CHECK_USER_PTR (lisp);
+  MODULE_INTERNAL_CLEANUP;
   return XUSER_PTR (lisp)->finalizer;
 }
 
@@ -845,6 +902,7 @@ module_set_user_finalizer (emacs_env *env, emacs_value arg,
   Lisp_Object lisp = value_to_lisp (arg);
   CHECK_USER_PTR (lisp);
   XUSER_PTR (lisp)->finalizer = fin;
+  MODULE_INTERNAL_CLEANUP;
 }
 
 static void
@@ -864,15 +922,21 @@ module_vec_set (emacs_env *env, emacs_value vector, ptrdiff_t index,
   Lisp_Object lisp = value_to_lisp (vector);
   check_vec_index (lisp, index);
   ASET (lisp, index, value_to_lisp (value));
+  MODULE_INTERNAL_CLEANUP;
 }
 
 static emacs_value
 module_vec_get (emacs_env *env, emacs_value vector, ptrdiff_t index)
 {
+  emacs_value value;
+
   MODULE_FUNCTION_BEGIN (NULL);
   Lisp_Object lisp = value_to_lisp (vector);
   check_vec_index (lisp, index);
-  return lisp_to_value (env, AREF (lisp, index));
+  value = lisp_to_value (env, AREF (lisp, index));
+  MODULE_INTERNAL_CLEANUP;
+
+  return value;
 }
 
 static ptrdiff_t
@@ -881,6 +945,8 @@ module_vec_size (emacs_env *env, emacs_value vector)
   MODULE_FUNCTION_BEGIN (0);
   Lisp_Object lisp = value_to_lisp (vector);
   CHECK_VECTOR (lisp);
+  MODULE_INTERNAL_CLEANUP;
+
   return ASIZE (lisp);
 }
 
@@ -896,23 +962,37 @@ module_should_quit (emacs_env *env)
 static enum emacs_process_input_result
 module_process_input (emacs_env *env)
 {
+  enum emacs_process_input_result rc;
+
   MODULE_FUNCTION_BEGIN (emacs_process_input_quit);
   maybe_quit ();
-  return emacs_process_input_continue;
+  rc = emacs_process_input_continue;
+  MODULE_INTERNAL_CLEANUP;
+  return rc;
 }
 
 static struct timespec
 module_extract_time (emacs_env *env, emacs_value arg)
 {
+  struct timespec value;
+
   MODULE_FUNCTION_BEGIN ((struct timespec) {0});
-  return lisp_time_argument (value_to_lisp (arg));
+  value = lisp_time_argument (value_to_lisp (arg));
+  MODULE_INTERNAL_CLEANUP;
+
+  return value;
 }
 
 static emacs_value
 module_make_time (emacs_env *env, struct timespec time)
 {
+  emacs_value value;
+
   MODULE_FUNCTION_BEGIN (NULL);
-  return lisp_to_value (env, timespec_to_lisp (time));
+  value = lisp_to_value (env, timespec_to_lisp (time));
+  MODULE_INTERNAL_CLEANUP;
+
+  return value;
 }
 
 /*
@@ -989,7 +1069,10 @@ module_extract_big_integer (emacs_env *env, emacs_value arg, int *sign,
       EMACS_INT x = XFIXNUM (o);
       *sign = (0 < x) - (x < 0);
       if (x == 0 || count == NULL)
-        return true;
+	{
+	  MODULE_INTERNAL_CLEANUP;
+	  return true;
+	}
       /* As a simplification we don't check how many array elements
          are exactly required, but use a reasonable static upper
          bound.  For most architectures exactly one element should
@@ -1000,6 +1083,7 @@ module_extract_big_integer (emacs_env *env, emacs_value arg, int *sign,
       if (magnitude == NULL)
         {
           *count = required;
+	  MODULE_INTERNAL_CLEANUP;
           return true;
         }
       if (*count < required)
@@ -1018,12 +1102,16 @@ module_extract_big_integer (emacs_env *env, emacs_value arg, int *sign,
       verify (required * bits < PTRDIFF_MAX);
       for (ptrdiff_t i = 0; i < required; ++i)
         magnitude[i] = (emacs_limb_t) (u >> (i * bits));
+      MODULE_INTERNAL_CLEANUP;
       return true;
     }
   const mpz_t *x = xbignum_val (o);
   *sign = mpz_sgn (*x);
   if (count == NULL)
-    return true;
+    {
+      MODULE_INTERNAL_CLEANUP;
+      return true;
+    }
   size_t required_size = (mpz_sizeinbase (*x, 2) + numb - 1) / numb;
   eassert (required_size <= PTRDIFF_MAX);
   ptrdiff_t required = (ptrdiff_t) required_size;
@@ -1031,6 +1119,7 @@ module_extract_big_integer (emacs_env *env, emacs_value arg, int *sign,
   if (magnitude == NULL)
     {
       *count = required;
+      MODULE_INTERNAL_CLEANUP;
       return true;
     }
   if (*count < required)
@@ -1043,6 +1132,7 @@ module_extract_big_integer (emacs_env *env, emacs_value arg, int *sign,
   size_t written;
   mpz_export (magnitude, &written, order, size, endian, nails, *x);
   eassert (written == required_size);
+  MODULE_INTERNAL_CLEANUP;
   return true;
 }
 
@@ -1050,21 +1140,34 @@ module_extract_big_integer (emacs_env *env, emacs_value arg, int *sign,
 module_make_big_integer (emacs_env *env, int sign,
                          ptrdiff_t count, const emacs_limb_t *magnitude)
 {
+  emacs_value value;
+
   MODULE_FUNCTION_BEGIN (NULL);
   if (sign == 0)
-    return lisp_to_value (env, make_fixed_natnum (0));
+    {
+      value = lisp_to_value (env, make_fixed_natnum (0));
+      MODULE_INTERNAL_CLEANUP;
+      return value;
+    }
   enum { order = -1, size = sizeof *magnitude, endian = 0, nails = 0 };
   mpz_import (mpz[0], count, order, size, endian, nails, magnitude);
   if (sign < 0)
     mpz_neg (mpz[0], mpz[0]);
-  return lisp_to_value (env, make_integer_mpz ());
+  value = lisp_to_value (env, make_integer_mpz ());
+  MODULE_INTERNAL_CLEANUP;
+  return value;
 }
 
 static int
 module_open_channel (emacs_env *env, emacs_value pipe_process)
 {
+  int rc;
+
   MODULE_FUNCTION_BEGIN (-1);
-  return open_channel_for_module (value_to_lisp (pipe_process));
+  rc = open_channel_for_module (value_to_lisp (pipe_process));
+  MODULE_INTERNAL_CLEANUP;
+
+  return rc;
 }
 
 \f



  reply	other threads:[~2023-03-11  1:37 UTC|newest]

Thread overview: 171+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <87edq7ztks.fsf.ref@yahoo.com>
2023-03-02  4:05 ` Merging feature/android Po Lu
2023-03-02  9:23   ` Eli Zaretskii
2023-03-02 10:19     ` Po Lu
2023-03-02 12:48       ` Eli Zaretskii
2023-03-02 13:42         ` Po Lu
2023-03-02 14:00           ` Eli Zaretskii
2023-03-03  0:51             ` Po Lu
2023-03-03  7:25               ` Eli Zaretskii
2023-03-03  8:03                 ` Po Lu
2023-03-03  8:37                   ` Eli Zaretskii
2023-03-03  9:51                     ` Po Lu
2023-03-03 11:27                       ` Eli Zaretskii
2023-03-03 13:28                         ` Po Lu
2023-03-03 14:35                           ` Eli Zaretskii
2023-03-04  0:07                             ` Po Lu
2023-03-04  7:28                               ` Eli Zaretskii
2023-03-04  8:05                                 ` Po Lu
2023-03-04 10:48                                   ` Eli Zaretskii
2023-03-04 12:12                                     ` Po Lu
2023-03-04 12:49                                       ` Eli Zaretskii
2023-03-05  0:06                                         ` Po Lu
2023-03-05  2:17                                           ` Paul Eggert
2023-03-05  3:16                                             ` Po Lu
2023-03-05  9:32                                               ` Paul Eggert
2023-03-05 10:40                                                 ` Po Lu
2023-03-05 11:14                                                   ` Paul Eggert
2023-03-05 12:13                                                     ` Po Lu
2023-03-05 20:38                                                       ` Paul Eggert
2023-03-05 23:59                                                         ` Po Lu
2023-03-06  5:10                                                         ` Richard Stallman
2023-03-05  6:15                                           ` Eli Zaretskii
2023-03-05  7:53                                             ` Po Lu
2023-03-05  8:25                                               ` Eli Zaretskii
2023-03-05 10:29                                                 ` Po Lu
2023-03-05 11:01                                                   ` Eli Zaretskii
2023-03-05 11:25                                                     ` Po Lu
2023-03-05 11:38                                                       ` Paul Eggert
2023-03-05 12:06                                                         ` Po Lu
2023-03-05 20:07                                                           ` Paul Eggert
2023-03-06  0:08                                                             ` Po Lu
2023-03-06  8:58                                                               ` Arsen Arsenović
2023-03-06 10:39                                                                 ` Po Lu
2023-03-06 11:12                                                                   ` Arsen Arsenović
2023-03-06 12:12                                                                   ` Eli Zaretskii
2023-03-06 13:12                                                                     ` Po Lu
2023-03-06 14:14                                                                       ` Eli Zaretskii
2023-03-07  0:36                                                                         ` Po Lu
2023-03-07 12:51                                                                           ` Eli Zaretskii
2023-03-07 13:03                                                                             ` Po Lu
2023-03-07 13:36                                                                               ` Eli Zaretskii
2023-03-07 23:55                                                                                 ` Po Lu
2023-03-08  5:38                                                                                   ` Paul Eggert
2023-03-08  6:58                                                                                     ` Po Lu
2023-03-08  7:07                                                                                       ` Paul Eggert
2023-03-08  8:22                                                                                         ` Po Lu
2023-03-08  8:24                                                                                           ` Po Lu
2023-03-08 13:47                                                                                         ` Eli Zaretskii
2023-03-08 13:46                                                                                       ` Eli Zaretskii
2023-03-09  1:12                                                                                         ` Po Lu
2023-03-09  7:24                                                                                           ` Eli Zaretskii
2023-03-09  8:07                                                                                             ` Po Lu
2023-03-09  9:21                                                                                               ` Eli Zaretskii
2023-03-09 10:20                                                                                                 ` __attribute__ ((cleanup)) and emacs-module.c Po Lu
2023-03-09 12:56                                                                                                   ` Philipp Stephani
2023-03-09 13:31                                                                                                     ` Po Lu
2023-03-11  1:03                                                                                                       ` Paul Eggert
2023-03-11  1:37                                                                                                         ` Po Lu via Emacs development discussions. [this message]
2023-03-11 21:21                                                                                                           ` Paul Eggert
2023-03-12  0:42                                                                                                             ` Po Lu
2023-03-12  1:28                                                                                                               ` Paul Eggert
2023-03-08 13:41                                                                                     ` Merging feature/android Eli Zaretskii
2023-03-06  9:07                                                         ` Arsen Arsenović
2023-03-06 10:36                                                           ` Po Lu
2023-03-06 10:56                                                             ` Arsen Arsenović
2023-03-06 13:10                                                               ` Po Lu
2023-03-05 11:44                                                       ` Eli Zaretskii
2023-03-05 12:15                                                         ` Po Lu
2023-03-05  4:06                                       ` Richard Stallman
2023-03-05  5:52                                         ` Po Lu
2023-03-06  5:10                                           ` Richard Stallman
2023-03-06  8:05                                             ` Po Lu
2023-03-03 21:17       ` Paul Eggert
2023-03-04  0:06         ` Po Lu
2023-03-04  7:20           ` Eli Zaretskii
2023-03-04  8:08             ` Po Lu
2023-03-04  9:13               ` Paul Eggert
2023-03-04 10:14                 ` Po Lu
2023-03-04  7:02         ` Eli Zaretskii
2023-03-04  8:19           ` Po Lu
2023-03-14  7:16   ` Po Lu
2023-03-14  9:32     ` Robert Pluim
2023-03-14 10:39       ` Po Lu
2023-03-14 10:47         ` Robert Pluim
2023-03-14 11:05           ` Robert Pluim
2023-03-14 11:34             ` Po Lu
2023-03-14 13:10               ` Robert Pluim
2023-03-14 14:47                 ` Robert Pluim
2023-03-15  0:16                   ` Po Lu
2023-03-15  9:41                     ` Robert Pluim
2023-03-15 10:25                       ` Po Lu
2023-03-15 14:35                         ` Robert Pluim
2023-03-16  0:36                           ` Po Lu
2023-03-16  1:42                           ` Po Lu
2023-03-17  8:06                             ` Robert Pluim
2023-03-17  8:19                               ` Po Lu
2023-03-20 11:09                                 ` Po Lu
2023-03-20 11:23                                   ` Robert Pluim
2023-03-20 14:20                                     ` Robert Pluim
2023-03-20 17:34                                       ` João Távora
2023-03-21  7:48                                         ` Robert Pluim
2023-03-21 13:08                                           ` eglot-test-diagnostic-tags-unnecessary-code fails with certain clangd versions Robert Pluim
2023-03-21 13:49                                             ` Robert Pluim
2023-03-21 14:07                                               ` João Távora
2023-03-21 14:19                                                 ` Robert Pluim
2023-03-21 14:56                                                 ` Michael Albinus
2023-03-21 15:15                                                   ` João Távora
2023-03-21 15:34                                                     ` Michael Albinus
2023-03-21 15:38                                                       ` João Távora
2023-03-21 15:44                                                         ` João Távora
2023-03-21 15:55                                                         ` Michael Albinus
2023-03-21 16:26                                                           ` João Távora
2023-03-21 16:34                                                             ` Robert Pluim
2023-03-21 16:57                                                               ` João Távora
2023-03-21 18:26                                                                 ` chad
2023-03-21 18:47                                                                   ` João Távora
2023-03-22  9:36                                                                     ` Robert Pluim
2023-03-22  9:45                                                                       ` João Távora
2023-03-22 10:19                                                                         ` Robert Pluim
2023-03-22 11:15                                                                           ` Michael Albinus
2023-03-22 11:58                                                                             ` Robert Pluim
2023-03-22 11:18                                                                           ` João Távora
2023-03-22 11:08                                                                         ` Michael Albinus
2023-03-22 11:12                                                                           ` João Távora
2023-03-14 13:03     ` Merging feature/android Arash Esbati
2023-03-14 13:18       ` Po Lu
2023-03-14 13:33         ` Arash Esbati
2023-03-14 13:49           ` Po Lu
2023-03-14 16:16             ` Eli Zaretskii
2023-03-15  0:21               ` Po Lu
2023-03-15  0:45                 ` Corwin Brust
2023-03-15  1:30                   ` Po Lu
2023-03-15  6:03                     ` Corwin Brust
2023-03-15  6:15                       ` Po Lu
2023-03-15  6:24                         ` Corwin Brust
2023-03-15  7:07                         ` Corwin Brust
2023-03-15  6:23                       ` Corwin Brust
2023-03-15  7:23                         ` Po Lu
2023-03-16  7:25                           ` Po Lu
2023-03-16  8:52                             ` Arash Esbati
2023-03-16 10:30                               ` Po Lu
2023-03-16 10:43                               ` Eli Zaretskii
2023-03-16 11:59                                 ` Arash Esbati
2023-03-16 12:05                                   ` Eli Zaretskii
2023-03-16 12:08                                     ` Po Lu
2023-03-16 12:13                                     ` Arash Esbati
2023-03-16 14:11                                       ` Eli Zaretskii
2023-03-16 17:09                                         ` Arash Esbati
2023-03-16 19:53                                           ` Eli Zaretskii
2023-03-17  8:42                                             ` Arash Esbati
2023-03-17  8:50                                               ` Po Lu
2023-03-17 11:27                                               ` Po Lu
2023-03-17 12:07                                                 ` Arash Esbati
2023-03-17 13:19                                                   ` Po Lu
2023-03-17 13:45                                                     ` Arash Esbati
2023-03-17 17:54                                                       ` Corwin Brust
     [not found]                                                         ` <87r0t6vll1.fsf@yahoo.com>
2023-04-02 17:22                                                           ` Corwin Brust
2023-04-02 17:53                                                             ` Eli Zaretskii
2023-04-02 18:03                                                               ` Eli Zaretskii
2023-04-13  8:25                                                         ` Po Lu
2023-04-13  8:30                                                           ` Eli Zaretskii
2023-04-13  8:37                                                             ` Po Lu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=878rg4f4py.fsf@yahoo.com \
    --to=emacs-devel@gnu.org \
    --cc=arsen@aarsen.me \
    --cc=dancol@dancol.org \
    --cc=eggert@cs.ucla.edu \
    --cc=eliz@gnu.org \
    --cc=luangruo@yahoo.com \
    --cc=phst@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).