Fix XFASTINT of non-fixnum in process status

* src/process.c (decode_status): 3rd arg is now Lisp_Object *,
not int *, and is not decoded.  All uses changed.
(status_message): Do not assume ‘failed’ code is an integer.
* src/process.h: Document codes better.
This commit is contained in:
Paul Eggert 2016-06-09 21:58:16 -07:00
parent 48079f6812
commit 560202f675
2 changed files with 15 additions and 14 deletions

View file

@ -537,21 +537,22 @@ status_convert (int w)
and store them individually through the three pointers. */
static void
decode_status (Lisp_Object l, Lisp_Object *symbol, int *code, bool *coredump)
decode_status (Lisp_Object l, Lisp_Object *symbol, Lisp_Object *code,
bool *coredump)
{
Lisp_Object tem;
if (SYMBOLP (l))
{
*symbol = l;
*code = 0;
*code = make_number (0);
*coredump = 0;
}
else
{
*symbol = XCAR (l);
tem = XCDR (l);
*code = XFASTINT (XCAR (tem));
*code = XCAR (tem);
tem = XCDR (tem);
*coredump = !NILP (tem);
}
@ -563,8 +564,7 @@ static Lisp_Object
status_message (struct Lisp_Process *p)
{
Lisp_Object status = p->status;
Lisp_Object symbol;
int code;
Lisp_Object symbol, code;
bool coredump;
Lisp_Object string;
@ -574,7 +574,7 @@ status_message (struct Lisp_Process *p)
{
char const *signame;
synchronize_system_messages_locale ();
signame = strsignal (code);
signame = strsignal (XFASTINT (code));
if (signame == 0)
string = build_string ("unknown");
else
@ -596,20 +596,20 @@ status_message (struct Lisp_Process *p)
else if (EQ (symbol, Qexit))
{
if (NETCONN1_P (p))
return build_string (code == 0 ? "deleted\n" : "connection broken by remote peer\n");
if (code == 0)
return build_string (XFASTINT (code) == 0
? "deleted\n"
: "connection broken by remote peer\n");
if (XFASTINT (code) == 0)
return build_string ("finished\n");
AUTO_STRING (prefix, "exited abnormally with code ");
string = Fnumber_to_string (make_number (code));
string = Fnumber_to_string (code);
AUTO_STRING (suffix, coredump ? " (core dumped)\n" : "\n");
return concat3 (prefix, string, suffix);
}
else if (EQ (symbol, Qfailed))
{
AUTO_STRING (prefix, "failed with code ");
string = Fnumber_to_string (make_number (code));
AUTO_STRING (suffix, "\n");
return concat3 (prefix, string, suffix);
AUTO_STRING (format, "failed with code %s\n");
return CALLN (Fformat, format, code);
}
else
return Fcopy_sequence (Fsymbol_name (symbol));

View file

@ -83,7 +83,8 @@ struct Lisp_Process
Lisp_Object mark;
/* Symbol indicating status of process.
This may be a symbol: run, open, or closed.
This may be a symbol: run, open, closed, listen, connect, or failed.
Or it may be (failed ERR) where ERR is an integer, string or symbol.
Or it may be a list, whose car is stop, exit or signal
and whose cdr is a pair (EXIT_CODE . COREDUMP_FLAG)
or (SIGNAL_NUMBER . COREDUMP_FLAG). */