Mercurial > emacs
changeset 16644:3a93437adce1
(status_notify): Test p->infd > 0
before each call to read_process_output.
(read_process_output): Handle match data properly in recursive calls.
(exec_sentinel): Likewise.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Sun, 08 Dec 1996 21:36:42 +0000 |
parents | 734b72203ac5 |
children | 52eb67172ca0 |
files | src/process.c |
diffstat | 1 files changed, 43 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/process.c Sun Dec 08 08:24:03 1996 +0000 +++ b/src/process.c Sun Dec 08 21:36:42 1996 +0000 @@ -2512,6 +2512,7 @@ int count = specpdl_ptr - specpdl; Lisp_Object odeactivate; Lisp_Object obuffer, okeymap; + int outer_running_asynch_code = running_asynch_code; /* No need to gcpro these, because all we do with them later is test them for EQness, and none of them should be a string. */ @@ -2522,7 +2523,24 @@ specbind (Qinhibit_quit, Qt); specbind (Qlast_nonmenu_event, Qt); + /* In case we get recursively called, + and we already saved the match data nonrecursively, + save the same match data in safely recursive fashion. */ + if (outer_running_asynch_code) + { + Lisp_Object tem; + /* Don't clobber the CURRENT match data, either! */ + tem = Fmatch_data (); + restore_match_data (); + record_unwind_protect (Fstore_match_data, Fmatch_data ()); + Fstore_match_data (tem); + } + + /* For speed, if a search happens within this code, + save the match data in a special nonrecursive fashion. */ running_asynch_code = 1; + + /* Read and dispose of the process output. */ internal_condition_case_1 (read_process_output_call, Fcons (outstream, Fcons (proc, @@ -2531,8 +2549,10 @@ Qnil))), !NILP (Vdebug_on_error) ? Qnil : Qerror, read_process_output_error_handler); - running_asynch_code = 0; + + /* If we saved the match data nonrecursively, restore it now. */ restore_match_data (); + running_asynch_code = outer_running_asynch_code; /* Handling the process output should not deactivate the mark. */ Vdeactivate_mark = odeactivate; @@ -3512,6 +3532,7 @@ Lisp_Object sentinel, obuffer, odeactivate, okeymap; register struct Lisp_Process *p = XPROCESS (proc); int count = specpdl_ptr - specpdl; + int outer_running_asynch_code = running_asynch_code; /* No need to gcpro these, because all we do with them later is test them for EQness, and none of them should be a string. */ @@ -3531,14 +3552,31 @@ specbind (Qinhibit_quit, Qt); specbind (Qlast_nonmenu_event, Qt); + /* In case we get recursively called, + and we already saved the match data nonrecursively, + save the same match data in safely recursive fashion. */ + if (outer_running_asynch_code) + { + Lisp_Object tem; + tem = Fmatch_data (); + restore_match_data (); + record_unwind_protect (Fstore_match_data, Fmatch_data ()); + Fstore_match_data (tem); + } + + /* For speed, if a search happens within this code, + save the match data in a special nonrecursive fashion. */ running_asynch_code = 1; + internal_condition_case_1 (read_process_output_call, Fcons (sentinel, Fcons (proc, Fcons (reason, Qnil))), !NILP (Vdebug_on_error) ? Qnil : Qerror, exec_sentinel_error_handler); - running_asynch_code = 0; + + /* If we saved the match data nonrecursively, restore it now. */ restore_match_data (); + running_asynch_code = outer_running_asynch_code; Vdeactivate_mark = odeactivate; #if 0 @@ -3589,9 +3627,9 @@ XSETINT (p->update_tick, XINT (p->tick)); /* If process is still active, read any output that remains. */ - if (XINT (p->infd) >= 0) - while (! EQ (p->filter, Qt) - && read_process_output (proc, XINT (p->infd)) > 0); + while (! EQ (p->filter, Qt) + && XINT (p->infd) >= 0 + && read_process_output (proc, XINT (p->infd)) > 0); buffer = p->buffer;