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
next prev parent 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).