shithub: riscv

Download patch

ref: 930be3d3173ce989d71675acedfca1fdf5466751
parent: 9ae083d81642be3a3ee7ff1e8d28fb9381bb1abf
author: spew <devnull@localhost>
date: Fri Feb 3 10:33:15 EST 2017

libregexp: improve the transition to next available thread, instruction, and generation

--- a/sys/src/libregexp/regexec.c
+++ b/sys/src/libregexp/regexec.c
@@ -19,16 +19,14 @@
 	char *sp, *ep, endc;
 	int i, matchgen, gen;
 
+	memset(p->threads, 0, sizeof(Rethread)*p->nthr);
 	if(msize > NSUBEXPM)
 		msize = NSUBEXPM;
-
 	if(p->startinst->gen != 0) {
 		for(ci = p->startinst; ci < p->startinst + p->len; ci++)
 			ci->gen = 0;
 	}
 
-	memset(p->threads, 0, sizeof(Rethread)*p->nthr);
-
 	clist = lists;
 	clist->head = nil;
 	clist->tail = &clist->head;
@@ -38,8 +36,8 @@
 
 	pool = p->threads;
 	avail = nil;
-
 	gen = matchgen = 0;
+
 	sp = str;
 	ep = nil;
 	endc = '\0';
@@ -52,7 +50,8 @@
 			*sem->ep = '\0';
 		}
 	}
-	for(r = 1; r != L'\0'; sp += i) {
+
+	for(r = L'☺'; r != L'\0'; sp += i) {
 		i = chartorune(&r, sp);
 		gen++;
 		if(matchgen == 0) {
@@ -76,7 +75,7 @@
 			break;
 		ci = t->i;
 Again:
-		if(ci->gen == gen || matchgen && t->gen > matchgen)
+		if(ci->gen == gen)
 			goto Done;
 		ci->gen = gen;
 		switch(ci->op) {
@@ -89,11 +88,7 @@
 			t->next = nil;
 			*nlist->tail = t;
 			nlist->tail = &t->next;
-			if(next == nil)
-				break;
-			t = next;
-			ci = t->i;
-			goto Again;
+			goto Next;
 		case OCLASS:
 		Class:
 			if(r < ci->r)
@@ -107,11 +102,7 @@
 			t->next = nil;
 			*nlist->tail = t;
 			nlist->tail = &t->next;
-			if(next == nil)
-				break;
-			t = next;
-			ci = t->i;
-			goto Again;
+			goto Next;
 		case ONOTNL:
 			if(r != L'\n') {
 				ci++;
@@ -171,8 +162,14 @@
 			next = t->next;
 			t->next = avail;
 			avail = t;
+		Next:
 			if(next == nil)
 				break;
+			if(matchgen && next->gen > matchgen) {
+				*clist->tail = avail;
+				avail = next;
+				break;
+			}
 			t = next;
 			ci = t->i;
 			goto Again;
--- a/sys/src/libregexp/rregexec.c
+++ b/sys/src/libregexp/rregexec.c
@@ -18,16 +18,14 @@
 	Rune *rsp, *rep, endr, r;
 	int matchgen, gen;
 
+	memset(p->threads, 0, sizeof(Rethread)*p->nthr);
 	if(msize > NSUBEXPM)
 		msize = NSUBEXPM;
-
 	if(p->startinst->gen != 0) {
 		for(ci = p->startinst; ci < p->startinst + p->len; ci++)
 			ci->gen = 0;
 	}
 
-	memset(p->threads, 0, sizeof(Rethread)*p->nthr);
-
 	clist = lists;
 	clist->head = nil;
 	clist->tail = &clist->head;
@@ -37,8 +35,8 @@
 
 	pool = p->threads;
 	avail = nil;
-
 	gen = matchgen = 0;
+
 	rsp = str;
 	rep = nil;
 	endr = L'\0';
@@ -51,7 +49,8 @@
 			*sem->rep = '\0';
 		}
 	}
-	for(r = 1; r != L'\0'; rsp++) {
+
+	for(r = L'☺'; r != L'\0'; rsp++) {
 		r = *rsp;
 		gen++;
 		if(matchgen == 0) {
@@ -75,7 +74,7 @@
 			break;
 		ci = t->i;
 Again:
-		if(ci->gen == gen || matchgen && t->gen > matchgen)
+		if(ci->gen == gen)
 			goto Done;
 		ci->gen = gen;
 		switch(ci->op) {
@@ -88,11 +87,7 @@
 			t->next = nil;
 			*nlist->tail = t;
 			nlist->tail = &t->next;
-			if(next == nil)
-				break;
-			t = next;
-			ci = t->i;
-			goto Again;
+			goto Next;
 		case OCLASS:
 		Class:
 			if(r < ci->r)
@@ -106,11 +101,7 @@
 			t->next = nil;
 			*nlist->tail = t;
 			nlist->tail = &t->next;
-			if(next == nil)
-				break;
-			t = next;
-			ci = t->i;
-			goto Again;
+			goto Next;
 		case ONOTNL:
 			if(r != L'\n') {
 				ci++;
@@ -170,8 +161,14 @@
 			next = t->next;
 			t->next = avail;
 			avail = t;
+		Next:
 			if(next == nil)
 				break;
+			if(matchgen && next->gen > matchgen) {
+				*clist->tail = avail;
+				avail = next;
+				break;
+			}
 			t = next;
 			ci = t->i;
 			goto Again;