Blob Blame History Raw
From 941f312444dfda4d0d1d02edcfbae9dc1ec6b95e Mon Sep 17 00:00:00 2001
From: Peter Stephenson <pws@zsh.org>
Date: Mon, 8 Sep 2014 16:38:51 +0100
Subject: [PATCH] users/19059 based on users/19058: remove ineffiency with
 multiple * matches

Upstream-commit: 8bf3595e3a05f0cea7f12c463a0df09e4010cd1c
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
---
 Src/pattern.c     | 10 ++++++++++
 Test/D02glob.ztst |  9 ++++++++-
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/Src/pattern.c b/Src/pattern.c
index 53ada0f..b74a08a 100644
--- a/Src/pattern.c
+++ b/Src/pattern.c
@@ -2911,6 +2911,16 @@ patmatch(Upat prog)
 	    break;
 	case P_STAR:
 	    /* Handle specially for speed, although really P_ONEHASH+P_ANY */
+	    while (P_OP(next) == P_STAR) {
+		/*
+		 * If there's another * following we can optimise it
+		 * out.  Chains of *'s can give pathologically bad
+		 * performance.
+		 */
+		scan = next;
+		next = PATNEXT(scan);
+	    }
+	    /*FALLTHROUGH*/
 	case P_ONEHASH:
 	case P_TWOHASH:
 	    /*
diff --git a/Test/D02glob.ztst b/Test/D02glob.ztst
index 0aea261..5709e5c 100644
--- a/Test/D02glob.ztst
+++ b/Test/D02glob.ztst
@@ -433,3 +433,10 @@
  print glob.tmp/dir5/N<->(N)
 0:Numeric glob is not usurped by process substitution.
 >glob.tmp/dir5/N123
+
+# The following should not cause excessive slowdown.
+  print glob.tmp/*.*
+  print glob.tmp/**************************.*************************
+0:Optimisation to squeeze multiple *'s used as ordinary glob wildcards.
+>glob.tmp/ra=1.0_et=3.5
+>glob.tmp/ra=1.0_et=3.5
-- 
2.1.0