shithub: mc

Download patch

ref: d0c579ea046b64d878d6fd0d9bcc8f0af9fdde73
parent: 037c644bc26ee88d2fd2b0c9988bbcbdeaf46659
author: Ori Bernstein <ori@eigenstate.org>
date: Mon Sep 4 18:54:37 EDT 2017

Reduce the number of allocations in regex.

	365us to 262.us

--- a/lib/regex/interp.myr
+++ b/lib/regex/interp.myr
@@ -127,7 +127,7 @@
 			std.sbputb(sb, str[i])
 			i++
 		else
-			len = thr.mend[0]
+			len = thr.mgroup[0][1]
 			s = str[i:len + i]
 			dosubst(sb, re, thr, s, subst)
 			i += len
@@ -142,10 +142,10 @@
 
 	off = 0
 	for var i = 1; i < re.nmatch; i++
-		if thr.mstart[i] != -1 && thr.mend[i] != -1
-			std.sbputs(sb, str[off:thr.mstart[i]])
+		if thr.mgroup[i][0] != -1 && thr.mgroup[i][1] != -1
+			std.sbputs(sb, str[off:thr.mgroup[i][0]])
 			std.sbputs(sb, subst[i - 1])
-			off = thr.mend[i]
+			off = thr.mgroup[i][1]
 		;;
 	;;
 	std.sbputs(sb, str[off:])
@@ -182,8 +182,8 @@
 	;;
 	ret = std.slalloc(re.nmatch)
 	for var i = 0; i < re.nmatch; i++
-		if thr.mstart[i] != -1 && thr.mend[i] != -1
-			ret[i] = re.str[thr.mstart[i]:thr.mend[i]]
+		if thr.mgroup[i][0] != -1 && thr.mgroup[i][1] != -1
+			ret[i] = re.str[thr.mgroup[i][0]:thr.mgroup[i][1]]
 		else
 			ret[i] = [][:]
 		;;
@@ -200,8 +200,8 @@
 	;;
 	ret = std.slalloc(re.nmatch)
 	for var i = 0; i < re.nmatch; i++
-		if thr.mstart[i] != -1 && thr.mend[i] != -1
-			ret[i] = (thr.mstart[i], thr.mend[i])
+		if thr.mgroup[i][0] != -1 && thr.mgroup[i][1] != -1
+			ret[i] = (thr.mgroup[i][0], thr.mgroup[i][1])
 		else
 			ret[i] = (-1, -1)
 		;;
@@ -233,11 +233,10 @@
 		re.traces = [][:]
 		std.slpush(&re.traces, std.mkbs())
 	;;
-	re.runq.mstart = std.slalloc(re.nmatch)
-	re.runq.mend = std.slalloc(re.nmatch)
+	re.runq.mgroup = std.slalloc(re.nmatch)
 	for var i = 0; i < re.nmatch; i++
-		re.runq.mstart[i] = -1
-		re.runq.mend[i] = -1
+		re.runq.mgroup[i][0] = -1
+		re.runq.mgroup[i][1] = -1
 	;;
 	while re.nthr > 0
 		while re.runq != Zthr
@@ -302,8 +301,7 @@
 */
 const step = {re, thr, curip
 	var str
-	var mstart
-	var mend
+	var mgroup
 
 	str = re.str
 	match re.prog[thr.ip]
@@ -375,22 +373,21 @@
 	| `Ilbra m:
 		trace(re, thr, "\t{}:\tLbra {}\n", thr.ip, m)
 		trace(re, thr, "\t\tmatch start = {}\n", re.strp)
-		thr.mstart[m] = re.strp
+		thr.mgroup[m][0] = re.strp
 		hit(re, thr)
 		thr.ip++
 		-> false
 	| `Irbra m:
 		trace(re, thr, "\t{}:\tRbra {}\n", thr.ip, m)
-		thr.mend[m] = re.strp
+		thr.mgroup[m][1] = re.strp
 		hit(re, thr)
 		thr.ip++
 		-> false
 	| `Ifork (lip, rip):
 		trace(re, thr, "\t{}:\tFork ({}, {})\n", thr.ip, lip, rip)
-		mstart = std.sldup(thr.mstart)
-		mend = std.sldup(thr.mend)
+		mgroup = std.sldup(thr.mgroup)
 		hit(re, thr)
-		fork(re, rip, curip, mstart, mend)
+		fork(re, rip, curip, mgroup)
 		if re.debug
 			std.slpush(&re.traces, std.bsdup(re.traces[thr.tid]))
 		;;
@@ -410,7 +407,7 @@
 	-> true
 }
 
-const fork = {re, ip, curip, mstart, mend
+const fork = {re, ip, curip, mgroup
 	var thr
 
 	if ip == curip /* loop detection */
@@ -418,8 +415,7 @@
 	;;
 	thr = mkthread(re, ip)
 	thr.next = re.runq
-	thr.mstart = mstart
-	thr.mend = mend
+	thr.mgroup = mgroup
 	re.runq = thr
 }
 
@@ -458,8 +454,7 @@
 	thr.dead = false
 	thr.matched = false
 
-	thr.mstart = [][:]
-	thr.mend = [][:]
+	thr.mgroup = [][:]
 
 	re.nthr++
 
@@ -468,8 +463,7 @@
 
 const thrfree = {re, thr
 	trace(re, thr, "\t\tcleanup {}\n", thr.tid)
-	std.slfree(thr.mstart)
-	std.slfree(thr.mend)
+	std.slfree(thr.mgroup)
 	std.free(thr)
 }
 
--- a/lib/regex/types.myr
+++ b/lib/regex/types.myr
@@ -68,8 +68,7 @@
 		dead	: bool		/* thread died */
 		matched	: bool		/* thread matched */
 
-		mstart	: std.size[:]	/* match starts */
-		mend	: std.size[:]	/* match ends */
+		mgroup	: std.size[2][:]	/* match starts */
 	;;
 
 	pkglocal type reinst = union