zsh-workers
 help / color / mirror / code / Atom feed
* $pipestatus broken
@ 2003-11-02 11:23 Oliver Kiddle
  2003-11-03  1:55 ` Bart Schaefer
  0 siblings, 1 reply; 6+ messages in thread
From: Oliver Kiddle @ 2003-11-02 11:23 UTC (permalink / raw)
  To: Zsh workers

The pipestatus array seems to be broken:

% ls|cat -|cat - >/dev/null
% echo $pipestatus
0

% false
% echo $pipestatus
0

Seems to occur on both branches. I've not really used pipestatus before
so perhaps I'm missing something.

Oliver


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: $pipestatus broken
  2003-11-02 11:23 $pipestatus broken Oliver Kiddle
@ 2003-11-03  1:55 ` Bart Schaefer
  2003-11-03 11:24   ` Peter Stephenson
  2003-11-03 12:56   ` Oliver Kiddle
  0 siblings, 2 replies; 6+ messages in thread
From: Bart Schaefer @ 2003-11-03  1:55 UTC (permalink / raw)
  To: Zsh workers

On Nov 2, 12:23pm, Oliver Kiddle wrote:
}
} The pipestatus array seems to be broken:
} 
} % ls|cat -|cat - >/dev/null
} % echo $pipestatus
} 0

It works with "zsh -f" in the latest dev version:

zagzig% true | false |true 
zagzig% echo $pipestatus
0 1 0

It fails if there's a precmd function defined:

zagzig% precmd() { echo PRECMD: $pipestatus }
PRECMD: 0
zagzig% echo $pipestatus
0
PRECMD: 0
zagzig% false | echo $pipestatus
0
PRECMD: 1 0
zagzig% echo $pipestatus
0
PRECMD: 0

I think there's code to save and restore `lastval' around precmd(), but
it doesn't save and restore the entire `pipestats' array.


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: $pipestatus broken
  2003-11-03  1:55 ` Bart Schaefer
@ 2003-11-03 11:24   ` Peter Stephenson
  2003-11-03 12:56   ` Oliver Kiddle
  1 sibling, 0 replies; 6+ messages in thread
From: Peter Stephenson @ 2003-11-03 11:24 UTC (permalink / raw)
  To: Zsh workers

Bart Schaefer wrote:
> I think there's code to save and restore `lastval' around precmd(), but
> it doesn't save and restore the entire `pipestats' array.

It's in doshfunc.  It would be more efficient to save in restore in
preprompt(), but at the expense of extra code.

I think the first chunk is some debugging code which should have been
deleted.  I can guess who put that there.

There still doesn't seem to be a dupmem function...

Index: Src/exec.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/exec.c,v
retrieving revision 1.54
diff -u -r1.54 exec.c
--- Src/exec.c	29 Oct 2003 19:17:30 -0000	1.54
+++ Src/exec.c	3 Nov 2003 11:18:23 -0000
@@ -3064,8 +3064,6 @@
 	if (!out)
 	{
 	    addproc(pid, NULL, 1);
-	    fprintf(stderr, "Proc %d added\n", pid);
-	    fflush(stderr);
 	}
 	return pnam;
     }
@@ -3448,7 +3446,8 @@
  * was executed.                                            */
 {
     char **tab, **x, *oargv0;
-    int oldzoptind, oldlastval, oldoptcind;
+    int oldzoptind, oldlastval, oldoptcind, oldnumpipestats;
+    int *oldpipestats = NULL;
     char saveopts[OPT_SIZE], *oldscriptname = scriptname, *fname = dupstring(name);
     int obreaks;
     struct funcstack fstack;
@@ -3463,6 +3462,16 @@
     if (trapreturn < 0)
 	trapreturn--;
     oldlastval = lastval;
+    oldnumpipestats = numpipestats;
+    if (noreturnval) {
+	/*
+	 * Easiest to use the heap here since we're bracketed
+	 * immediately by a pushheap/popheap pair.
+	 */
+	size_t bytes = sizeof(int)*numpipestats;
+	oldpipestats = (int *)zhalloc(bytes);
+	memcpy(oldpipestats, pipestats, bytes);
+    }
 
     starttrapscope();
 
@@ -3568,8 +3577,11 @@
 
     if (trapreturn < -1)
 	trapreturn++;
-    if (noreturnval)
+    if (noreturnval) {
 	lastval = oldlastval;
+	numpipestats = oldnumpipestats;
+	memcpy(pipestats, oldpipestats, sizeof(int)*numpipestats);
+    }
     popheap();
 
     if (exit_pending) {



-- 
Peter Stephenson <pws@csr.com>                  Software Engineer
CSR Ltd., Science Park, Milton Road,
Cambridge, CB4 0WH, UK                          Tel: +44 (0)1223 692070


**********************************************************************
The information transmitted is intended only for the person or
entity to which it is addressed and may contain confidential 
and/or privileged material. 
Any review, retransmission, dissemination or other use of, or
taking of any action in reliance upon, this information by 
persons or entities other than the intended recipient is 
prohibited. 
If you received this in error, please contact the sender and 
delete the material from any computer.
**********************************************************************


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: $pipestatus broken
  2003-11-03  1:55 ` Bart Schaefer
  2003-11-03 11:24   ` Peter Stephenson
@ 2003-11-03 12:56   ` Oliver Kiddle
  2003-11-03 13:04     ` Peter Stephenson
  1 sibling, 1 reply; 6+ messages in thread
From: Oliver Kiddle @ 2003-11-03 12:56 UTC (permalink / raw)
  To: Zsh workers

Bart wrote:
> It fails if there's a precmd function defined:

As it happens, I don't have a precmd function defined. Peter's patch
didn't help: it seems the problem for my setup is down to zle widgets. In
particular, I have one defined for the enter key as a wrapper around
accept-line. $status seems unaffected so it looks like we need to be
saving pipestats somewhere else too.

Oliver


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: $pipestatus broken
  2003-11-03 12:56   ` Oliver Kiddle
@ 2003-11-03 13:04     ` Peter Stephenson
  2003-11-03 13:35       ` Oliver Kiddle
  0 siblings, 1 reply; 6+ messages in thread
From: Peter Stephenson @ 2003-11-03 13:04 UTC (permalink / raw)
  To: Zsh workers

Oliver Kiddle wrote:
> As it happens, I don't have a precmd function defined. Peter's patch
> didn't help: it seems the problem for my setup is down to zle widgets. In
> particular, I have one defined for the enter key as a wrapper around
> accept-line. $status seems unaffected so it looks like we need to be
> saving pipestats somewhere else too.

Is this any good?  I haven't properly tested it since you're more in a
position to see if it fixes things.

The widget code wasn't using the save-return-values facilities of
doshfunc because it wanted the status.  I've made doshfunc pass that
back separately.

Index: Src/exec.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/exec.c,v
retrieving revision 1.55
diff -u -r1.55 exec.c
--- Src/exec.c	3 Nov 2003 11:33:46 -0000	1.55
+++ Src/exec.c	3 Nov 2003 13:01:25 -0000
@@ -3436,17 +3436,22 @@
     return shf;
 }
 
-/* execute a shell function */
+/*
+ * execute a shell function
+ *
+ * If noreturnval is nonzero, then reset the current return
+ * value (lastval) to its value before the shell function
+ * was executed.  However, in any case return the status value
+ * from the function (i.e. if noreturnval is not set, this
+ * will be the same as lastval).
+ */
 
 /**/
-mod_export void
+mod_export int
 doshfunc(char *name, Eprog prog, LinkList doshargs, int flags, int noreturnval)
-/* If noreturnval is nonzero, then reset the current return *
- * value (lastval) to its value before the shell function   *
- * was executed.                                            */
 {
     char **tab, **x, *oargv0;
-    int oldzoptind, oldlastval, oldoptcind, oldnumpipestats;
+    int oldzoptind, oldlastval, oldoptcind, oldnumpipestats, ret;
     int *oldpipestats = NULL;
     char saveopts[OPT_SIZE], *oldscriptname = scriptname, *fname = dupstring(name);
     int obreaks;
@@ -3577,6 +3582,7 @@
 
     if (trapreturn < -1)
 	trapreturn++;
+    ret = lastval;
     if (noreturnval) {
 	lastval = oldlastval;
 	numpipestats = oldnumpipestats;
@@ -3599,6 +3605,8 @@
 	    zexit(exit_pending >> 1, 0);
 	}
     }
+
+    return ret;
 }
 
 /* This finally executes a shell function and any function wrappers     *
Index: Src/Zle/zle_main.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Zle/zle_main.c,v
retrieving revision 1.36
diff -u -r1.36 zle_main.c
--- Src/Zle/zle_main.c	29 Oct 2003 19:17:48 -0000	1.36
+++ Src/Zle/zle_main.c	3 Nov 2003 13:01:25 -0000
@@ -910,7 +910,7 @@
 	    zsfree(msg);
 	    ret = 1;
 	} else {
-	    int osc = sfcontext, osi = movefd(0), olv = lastval;
+	    int osc = sfcontext, osi = movefd(0);
 	    int oxt = isset(XTRACE);
 	    LinkList largs = NULL;
 
@@ -924,10 +924,8 @@
 	    makezleparams(0);
 	    sfcontext = SFC_WIDGET;
 	    opts[XTRACE] = 0;
-	    doshfunc(w->u.fnnam, prog, largs, shf->flags, 0);
+	    ret = doshfunc(w->u.fnnam, prog, largs, shf->flags, 1);
 	    opts[XTRACE] = oxt;
-	    ret = lastval;
-	    lastval = olv;
 	    sfcontext = osc;
 	    endparamscope();
 	    lastcmd = 0;

-- 
Peter Stephenson <pws@csr.com>                  Software Engineer
CSR Ltd., Science Park, Milton Road,
Cambridge, CB4 0WH, UK                          Tel: +44 (0)1223 692070


**********************************************************************
This email and any files transmitted with it are confidential and
intended solely for the use of the individual or entity to whom they
are addressed. If you have received this email in error please notify
the system manager.

This footnote also confirms that this email message has been swept by
MIMEsweeper for the presence of computer viruses.

www.mimesweeper.com
**********************************************************************


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: $pipestatus broken
  2003-11-03 13:04     ` Peter Stephenson
@ 2003-11-03 13:35       ` Oliver Kiddle
  0 siblings, 0 replies; 6+ messages in thread
From: Oliver Kiddle @ 2003-11-03 13:35 UTC (permalink / raw)
  To: Zsh workers

Peter wrote:

> Is this any good?  I haven't properly tested it since you're more in a
> position to see if it fixes things.

That now works. Thanks

> The widget code wasn't using the save-return-values facilities of
> doshfunc because it wanted the status.  I've made doshfunc pass that
> back separately.

Looking at it, that seems sensible.

Would be good to have these applied to 4.0 too.

Thanks

Oliver


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2003-11-03 13:31 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-11-02 11:23 $pipestatus broken Oliver Kiddle
2003-11-03  1:55 ` Bart Schaefer
2003-11-03 11:24   ` Peter Stephenson
2003-11-03 12:56   ` Oliver Kiddle
2003-11-03 13:04     ` Peter Stephenson
2003-11-03 13:35       ` Oliver Kiddle

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

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 NNTP newsgroup(s).