aboutsummaryrefslogtreecommitdiff
path: root/src/regexp
diff options
context:
space:
mode:
authorOleg Bulatov <oleg@bulatov.me>2018-02-23 16:55:19 +0100
committerBrad Fitzpatrick <bradfitz@golang.org>2018-02-23 16:58:48 +0000
commit7263540146c75de8037501b3d6fb64f59a0d1956 (patch)
treec5cd5671c437e6bd17b3634d378ffda098905740 /src/regexp
parent37a038a3dcbba7148b841e31522b33476ee6ad44 (diff)
downloadgo-7263540146c75de8037501b3d6fb64f59a0d1956.tar.gz
go-7263540146c75de8037501b3d6fb64f59a0d1956.zip
regexp: Regexp shouldn't keep references to inputs
If you try to find something in a slice of bytes using a Regexp object, the byte array will not be released by GC until you use the Regexp object on another slice of bytes. It happens because the Regexp object keep references to the input data in its cache. Change-Id: I873107f15c1900aa53ccae5d29dbc885b9562808 Reviewed-on: https://go-review.googlesource.com/96715 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/regexp')
-rw-r--r--src/regexp/regexp.go5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/regexp/regexp.go b/src/regexp/regexp.go
index 2e4c6e8926..7d32d8d5a6 100644
--- a/src/regexp/regexp.go
+++ b/src/regexp/regexp.go
@@ -226,6 +226,11 @@ func (re *Regexp) get() *machine {
// grow to the maximum number of simultaneous matches
// run using re. (The cache empties when re gets garbage collected.)
func (re *Regexp) put(z *machine) {
+ // Remove references to input data that we no longer need.
+ z.inputBytes.str = nil
+ z.inputString.str = ""
+ z.inputReader.r = nil
+
re.mu.Lock()
re.machine = append(re.machine, z)
re.mu.Unlock()