summary refs log tree commit diff
diff options
context:
space:
mode:
authorherbert <herbert@gondor.apana.org.au>2005-02-25 21:48:59 +1100
committerHerbert Xu <herbert@gondor.apana.org.au>2005-09-26 18:33:03 +1000
commit0f6e68ff04886875613506f6d6fb3fd88ed1ec25 (patch)
tree2a425ff3fc3b22244cdd547a3dd1cc7ea7a58168
parentCorrected grammar in manual page. (diff)
downloaddash-0f6e68ff04886875613506f6d6fb3fd88ed1ec25.tar.gz
dash-0f6e68ff04886875613506f6d6fb3fd88ed1ec25.zip
Size optimisations with state/s in main().
Diffstat (limited to '')
-rw-r--r--ChangeLog1
-rw-r--r--src/main.c14
2 files changed, 9 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 2fc7ea4..f26353d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -6,6 +6,7 @@
 
 	* Changed boolean rootshell into shlvl counter.
 	* Catch set -e exits within built-in commands.
+	* Size optimisations with state/s in main().
 
 2005-01-31  Gerrit Pape <pape@smarden.org>
 
diff --git a/src/main.c b/src/main.c
index 4902cfa..9b5a409 100644
--- a/src/main.c
+++ b/src/main.c
@@ -122,11 +122,13 @@ main(int argc, char **argv)
 	monitor(4, etext, profile_buf, sizeof profile_buf, 50);
 #endif
 	state = 0;
-	if (setjmp(jmploc.loc)) {
+	if (unlikely(setjmp(jmploc.loc))) {
 		int status;
 		int e;
+		int s;
 
 		reset();
+		s = state;
 
 		e = exception;
 		switch (exception) {
@@ -140,7 +142,7 @@ main(int argc, char **argv)
 
 		case EXEXIT:
 		case EXEVAL:
-			state = 0;
+			s = 0;
 			/* fall through */
 		default:
 			status = exitstatus;
@@ -148,7 +150,7 @@ main(int argc, char **argv)
 		}
 		exitstatus = status;
 
-		if (state == 0 || iflag == 0 || shlvl)
+		if (s == 0 || iflag == 0 || shlvl)
 			exitshell();
 
 		if (e == EXINT
@@ -163,11 +165,11 @@ main(int argc, char **argv)
 		}
 		popstackmark(&smark);
 		FORCEINTON;				/* enable interrupts */
-		if (state == 1)
+		if (s == 1)
 			goto state1;
-		else if (state == 2)
+		else if (s == 2)
 			goto state2;
-		else if (state == 3)
+		else if (s == 3)
 			goto state3;
 		else
 			goto state4;