Module Name: src Committed By: kre Date: Wed Jan 5 15:25:44 UTC 2022
Modified Files: src/bin/sh: eval.c Log Message: Use a volative local shadow of a field in an (on-stack) non-volatile struct that is to be referenced after a return from setjmp() via longjmp(). This doesn't ever seem to have caused a problem, but I think using volative vars is required here. For reasons I never bothered to discover, even though this change certainly requires a store into stack memory which wasn't required before, earlier measurements showed the shell getting (slightly) smaller with this change in place. NFCI To generate a diff of this commit: cvs rdiff -u -r1.187 -r1.188 src/bin/sh/eval.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/bin/sh/eval.c diff -u src/bin/sh/eval.c:1.187 src/bin/sh/eval.c:1.188 --- src/bin/sh/eval.c:1.187 Sun Dec 5 04:35:38 2021 +++ src/bin/sh/eval.c Wed Jan 5 15:25:44 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: eval.c,v 1.187 2021/12/05 04:35:38 msaitoh Exp $ */ +/* $NetBSD: eval.c,v 1.188 2022/01/05 15:25:44 kre Exp $ */ /*- * Copyright (c) 1993 @@ -37,7 +37,7 @@ #if 0 static char sccsid[] = "@(#)eval.c 8.9 (Berkeley) 6/8/95"; #else -__RCSID("$NetBSD: eval.c,v 1.187 2021/12/05 04:35:38 msaitoh Exp $"); +__RCSID("$NetBSD: eval.c,v 1.188 2022/01/05 15:25:44 kre Exp $"); #endif #endif /* not lint */ @@ -1218,6 +1218,7 @@ evalcommand(union node *cmd, int flgs, s /* Execute the command. */ switch (cmdentry.cmdtype) { volatile int saved; + struct funcdef * volatile savefunc; case CMDFUNCTION: VXTRACE(DBG_EVAL, ("Shell function%s: ",vforked?" VF":""), @@ -1233,7 +1234,7 @@ evalcommand(union node *cmd, int flgs, s INTOFF; savelocalvars = localvars; localvars = NULL; - reffunc(cmdentry.u.func); + reffunc(savefunc = cmdentry.u.func); INTON; if (setjmp(jmploc.loc)) { if (exception == EXSHELLPROC) { @@ -1245,7 +1246,7 @@ evalcommand(union node *cmd, int flgs, s } if (saved) popredir(); - unreffunc(cmdentry.u.func); + unreffunc(savefunc); poplocalvars(); localvars = savelocalvars; funclinebase = savefuncline;