aboutsummaryrefslogtreecommitdiff
path: root/src/compress
diff options
context:
space:
mode:
authorKlaus Post <klauspost@gmail.com>2016-10-15 14:37:19 +0200
committerJoe Tsai <thebrokentoaster@gmail.com>2016-10-27 00:58:30 +0000
commit461adfd817eea64ee6b96f5711a48854bcda6241 (patch)
treee6a96b1582272c4c110b6b974df4e90c3ff73fa1 /src/compress
parent2e196b15b94e48009369aae25299a59cbc7d45f4 (diff)
downloadgo-461adfd817eea64ee6b96f5711a48854bcda6241.tar.gz
go-461adfd817eea64ee6b96f5711a48854bcda6241.zip
compress/flate: make compression level 0 consistent
Tests for determinism was not working as intended since io.Copybuffer uses the io.WriterTo if available. This exposed that level 0 (no compression) changed output based on the number of writes and buffers given to the writer. Previously, Write would emit a new raw block (BTYPE=00) for every non-empty call to Write. This CL fixes it such that a raw block is only emitted upon the following conditions: * A full window is obtained (every 65535 bytes) * Flush is called * Close is called Change-Id: I807f866d97e2db7820f11febab30a96266a6cbf1 Reviewed-on: https://go-review.googlesource.com/31174 Run-TryBot: Joe Tsai <thebrokentoaster@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
Diffstat (limited to 'src/compress')
-rw-r--r--src/compress/flate/deflate.go4
-rw-r--r--src/compress/flate/writer_test.go6
2 files changed, 5 insertions, 5 deletions
diff --git a/src/compress/flate/deflate.go b/src/compress/flate/deflate.go
index 7a805235d2..97265b3ca2 100644
--- a/src/compress/flate/deflate.go
+++ b/src/compress/flate/deflate.go
@@ -521,10 +521,10 @@ func (d *compressor) fillStore(b []byte) int {
}
func (d *compressor) store() {
- if d.windowEnd > 0 {
+ if d.windowEnd > 0 && (d.windowEnd == maxStoreBlockSize || d.sync) {
d.err = d.writeStoredBlock(d.window[:d.windowEnd])
+ d.windowEnd = 0
}
- d.windowEnd = 0
}
// storeHuff compresses and stores the currently added data
diff --git a/src/compress/flate/writer_test.go b/src/compress/flate/writer_test.go
index 21cd0b22ee..68de48b98f 100644
--- a/src/compress/flate/writer_test.go
+++ b/src/compress/flate/writer_test.go
@@ -75,7 +75,7 @@ func TestWriteError(t *testing.T) {
if err != nil {
t.Fatalf("NewWriter: level %d: %v", l, err)
}
- n, err := io.CopyBuffer(w, bytes.NewBuffer(in), copyBuffer)
+ n, err := io.CopyBuffer(w, struct{ io.Reader }{bytes.NewBuffer(in)}, copyBuffer)
if err == nil {
t.Fatalf("Level %d: Expected an error, writer was %#v", l, ew)
}
@@ -142,7 +142,7 @@ func testDeterministic(i int, t *testing.T) {
}
// Use a very small prime sized buffer.
cbuf := make([]byte, 787)
- _, err = io.CopyBuffer(w, br, cbuf)
+ _, err = io.CopyBuffer(w, struct{ io.Reader }{br}, cbuf)
if err != nil {
t.Fatal(err)
}
@@ -157,7 +157,7 @@ func testDeterministic(i int, t *testing.T) {
if err != nil {
t.Fatal(err)
}
- _, err = io.CopyBuffer(w2, br2, cbuf)
+ _, err = io.CopyBuffer(w2, struct{ io.Reader }{br2}, cbuf)
if err != nil {
t.Fatal(err)
}