Upgrade github.com/klauspost/compress from v1.11.13 to v1.15.9
The package has multiple improvements and bug fixes. Signed-off-by: Kazuyoshi Kato <katokazu@amazon.com>
This commit is contained in:
		
							
								
								
									
										160
									
								
								vendor/github.com/klauspost/compress/zstd/blockenc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										160
									
								
								vendor/github.com/klauspost/compress/zstd/blockenc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -51,7 +51,7 @@ func (b *blockEnc) init() {
 | 
			
		||||
		if cap(b.literals) < maxCompressedBlockSize {
 | 
			
		||||
			b.literals = make([]byte, 0, maxCompressedBlockSize)
 | 
			
		||||
		}
 | 
			
		||||
		const defSeqs = 200
 | 
			
		||||
		const defSeqs = 2000
 | 
			
		||||
		if cap(b.sequences) < defSeqs {
 | 
			
		||||
			b.sequences = make([]seq, 0, defSeqs)
 | 
			
		||||
		}
 | 
			
		||||
@@ -156,7 +156,7 @@ func (h *literalsHeader) setSize(regenLen int) {
 | 
			
		||||
	switch {
 | 
			
		||||
	case inBits < 5:
 | 
			
		||||
		lh |= (uint64(regenLen) << 3) | (1 << 60)
 | 
			
		||||
		if debug {
 | 
			
		||||
		if debugEncoder {
 | 
			
		||||
			got := int(lh>>3) & 0xff
 | 
			
		||||
			if got != regenLen {
 | 
			
		||||
				panic(fmt.Sprint("litRegenSize = ", regenLen, "(want) != ", got, "(got)"))
 | 
			
		||||
@@ -184,7 +184,7 @@ func (h *literalsHeader) setSizes(compLen, inLen int, single bool) {
 | 
			
		||||
			lh |= 1 << 2
 | 
			
		||||
		}
 | 
			
		||||
		lh |= (uint64(inLen) << 4) | (uint64(compLen) << (10 + 4)) | (3 << 60)
 | 
			
		||||
		if debug {
 | 
			
		||||
		if debugEncoder {
 | 
			
		||||
			const mmask = (1 << 24) - 1
 | 
			
		||||
			n := (lh >> 4) & mmask
 | 
			
		||||
			if int(n&1023) != inLen {
 | 
			
		||||
@@ -312,7 +312,7 @@ func (b *blockEnc) encodeRaw(a []byte) {
 | 
			
		||||
	bh.setType(blockTypeRaw)
 | 
			
		||||
	b.output = bh.appendTo(b.output[:0])
 | 
			
		||||
	b.output = append(b.output, a...)
 | 
			
		||||
	if debug {
 | 
			
		||||
	if debugEncoder {
 | 
			
		||||
		println("Adding RAW block, length", len(a), "last:", b.last)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -325,7 +325,7 @@ func (b *blockEnc) encodeRawTo(dst, src []byte) []byte {
 | 
			
		||||
	bh.setType(blockTypeRaw)
 | 
			
		||||
	dst = bh.appendTo(dst)
 | 
			
		||||
	dst = append(dst, src...)
 | 
			
		||||
	if debug {
 | 
			
		||||
	if debugEncoder {
 | 
			
		||||
		println("Adding RAW block, length", len(src), "last:", b.last)
 | 
			
		||||
	}
 | 
			
		||||
	return dst
 | 
			
		||||
@@ -339,7 +339,7 @@ func (b *blockEnc) encodeLits(lits []byte, raw bool) error {
 | 
			
		||||
 | 
			
		||||
	// Don't compress extremely small blocks
 | 
			
		||||
	if len(lits) < 8 || (len(lits) < 32 && b.dictLitEnc == nil) || raw {
 | 
			
		||||
		if debug {
 | 
			
		||||
		if debugEncoder {
 | 
			
		||||
			println("Adding RAW block, length", len(lits), "last:", b.last)
 | 
			
		||||
		}
 | 
			
		||||
		bh.setType(blockTypeRaw)
 | 
			
		||||
@@ -371,7 +371,7 @@ func (b *blockEnc) encodeLits(lits []byte, raw bool) error {
 | 
			
		||||
 | 
			
		||||
	switch err {
 | 
			
		||||
	case huff0.ErrIncompressible:
 | 
			
		||||
		if debug {
 | 
			
		||||
		if debugEncoder {
 | 
			
		||||
			println("Adding RAW block, length", len(lits), "last:", b.last)
 | 
			
		||||
		}
 | 
			
		||||
		bh.setType(blockTypeRaw)
 | 
			
		||||
@@ -379,16 +379,16 @@ func (b *blockEnc) encodeLits(lits []byte, raw bool) error {
 | 
			
		||||
		b.output = append(b.output, lits...)
 | 
			
		||||
		return nil
 | 
			
		||||
	case huff0.ErrUseRLE:
 | 
			
		||||
		if debug {
 | 
			
		||||
		if debugEncoder {
 | 
			
		||||
			println("Adding RLE block, length", len(lits))
 | 
			
		||||
		}
 | 
			
		||||
		bh.setType(blockTypeRLE)
 | 
			
		||||
		b.output = bh.appendTo(b.output)
 | 
			
		||||
		b.output = append(b.output, lits[0])
 | 
			
		||||
		return nil
 | 
			
		||||
	case nil:
 | 
			
		||||
	default:
 | 
			
		||||
		return err
 | 
			
		||||
	case nil:
 | 
			
		||||
	}
 | 
			
		||||
	// Compressed...
 | 
			
		||||
	// Now, allow reuse
 | 
			
		||||
@@ -396,12 +396,12 @@ func (b *blockEnc) encodeLits(lits []byte, raw bool) error {
 | 
			
		||||
	bh.setType(blockTypeCompressed)
 | 
			
		||||
	var lh literalsHeader
 | 
			
		||||
	if reUsed {
 | 
			
		||||
		if debug {
 | 
			
		||||
		if debugEncoder {
 | 
			
		||||
			println("Reused tree, compressed to", len(out))
 | 
			
		||||
		}
 | 
			
		||||
		lh.setType(literalsBlockTreeless)
 | 
			
		||||
	} else {
 | 
			
		||||
		if debug {
 | 
			
		||||
		if debugEncoder {
 | 
			
		||||
			println("New tree, compressed to", len(out), "tree size:", len(b.litEnc.OutTable))
 | 
			
		||||
		}
 | 
			
		||||
		lh.setType(literalsBlockCompressed)
 | 
			
		||||
@@ -426,7 +426,7 @@ func fuzzFseEncoder(data []byte) int {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
	enc := fseEncoder{}
 | 
			
		||||
	hist := enc.Histogram()[:256]
 | 
			
		||||
	hist := enc.Histogram()
 | 
			
		||||
	maxSym := uint8(0)
 | 
			
		||||
	for i, v := range data {
 | 
			
		||||
		v = v & 63
 | 
			
		||||
@@ -517,7 +517,7 @@ func (b *blockEnc) encode(org []byte, raw, rawAllLits bool) error {
 | 
			
		||||
		lh.setSize(len(b.literals))
 | 
			
		||||
		b.output = lh.appendTo(b.output)
 | 
			
		||||
		b.output = append(b.output, b.literals...)
 | 
			
		||||
		if debug {
 | 
			
		||||
		if debugEncoder {
 | 
			
		||||
			println("Adding literals RAW, length", len(b.literals))
 | 
			
		||||
		}
 | 
			
		||||
	case huff0.ErrUseRLE:
 | 
			
		||||
@@ -525,27 +525,22 @@ func (b *blockEnc) encode(org []byte, raw, rawAllLits bool) error {
 | 
			
		||||
		lh.setSize(len(b.literals))
 | 
			
		||||
		b.output = lh.appendTo(b.output)
 | 
			
		||||
		b.output = append(b.output, b.literals[0])
 | 
			
		||||
		if debug {
 | 
			
		||||
		if debugEncoder {
 | 
			
		||||
			println("Adding literals RLE")
 | 
			
		||||
		}
 | 
			
		||||
	default:
 | 
			
		||||
		if debug {
 | 
			
		||||
			println("Adding literals ERROR:", err)
 | 
			
		||||
		}
 | 
			
		||||
		return err
 | 
			
		||||
	case nil:
 | 
			
		||||
		// Compressed litLen...
 | 
			
		||||
		if reUsed {
 | 
			
		||||
			if debug {
 | 
			
		||||
			if debugEncoder {
 | 
			
		||||
				println("reused tree")
 | 
			
		||||
			}
 | 
			
		||||
			lh.setType(literalsBlockTreeless)
 | 
			
		||||
		} else {
 | 
			
		||||
			if debug {
 | 
			
		||||
			if debugEncoder {
 | 
			
		||||
				println("new tree, size:", len(b.litEnc.OutTable))
 | 
			
		||||
			}
 | 
			
		||||
			lh.setType(literalsBlockCompressed)
 | 
			
		||||
			if debug {
 | 
			
		||||
			if debugEncoder {
 | 
			
		||||
				_, _, err := huff0.ReadTable(out, nil)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					panic(err)
 | 
			
		||||
@@ -553,16 +548,21 @@ func (b *blockEnc) encode(org []byte, raw, rawAllLits bool) error {
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		lh.setSizes(len(out), len(b.literals), single)
 | 
			
		||||
		if debug {
 | 
			
		||||
		if debugEncoder {
 | 
			
		||||
			printf("Compressed %d literals to %d bytes", len(b.literals), len(out))
 | 
			
		||||
			println("Adding literal header:", lh)
 | 
			
		||||
		}
 | 
			
		||||
		b.output = lh.appendTo(b.output)
 | 
			
		||||
		b.output = append(b.output, out...)
 | 
			
		||||
		b.litEnc.Reuse = huff0.ReusePolicyAllow
 | 
			
		||||
		if debug {
 | 
			
		||||
		if debugEncoder {
 | 
			
		||||
			println("Adding literals compressed")
 | 
			
		||||
		}
 | 
			
		||||
	default:
 | 
			
		||||
		if debugEncoder {
 | 
			
		||||
			println("Adding literals ERROR:", err)
 | 
			
		||||
		}
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	// Sequence compression
 | 
			
		||||
 | 
			
		||||
@@ -577,7 +577,7 @@ func (b *blockEnc) encode(org []byte, raw, rawAllLits bool) error {
 | 
			
		||||
		n := len(b.sequences) - 0x7f00
 | 
			
		||||
		b.output = append(b.output, 255, uint8(n), uint8(n>>8))
 | 
			
		||||
	}
 | 
			
		||||
	if debug {
 | 
			
		||||
	if debugEncoder {
 | 
			
		||||
		println("Encoding", len(b.sequences), "sequences")
 | 
			
		||||
	}
 | 
			
		||||
	b.genCodes()
 | 
			
		||||
@@ -611,17 +611,17 @@ func (b *blockEnc) encode(org []byte, raw, rawAllLits bool) error {
 | 
			
		||||
		nSize = nSize + (nSize+2*8*16)>>4
 | 
			
		||||
		switch {
 | 
			
		||||
		case predefSize <= prevSize && predefSize <= nSize || forcePreDef:
 | 
			
		||||
			if debug {
 | 
			
		||||
			if debugEncoder {
 | 
			
		||||
				println("Using predefined", predefSize>>3, "<=", nSize>>3)
 | 
			
		||||
			}
 | 
			
		||||
			return preDef, compModePredefined
 | 
			
		||||
		case prevSize <= nSize:
 | 
			
		||||
			if debug {
 | 
			
		||||
			if debugEncoder {
 | 
			
		||||
				println("Using previous", prevSize>>3, "<=", nSize>>3)
 | 
			
		||||
			}
 | 
			
		||||
			return prev, compModeRepeat
 | 
			
		||||
		default:
 | 
			
		||||
			if debug {
 | 
			
		||||
			if debugEncoder {
 | 
			
		||||
				println("Using new, predef", predefSize>>3, ". previous:", prevSize>>3, ">", nSize>>3, "header max:", cur.maxHeaderSize()>>3, "bytes")
 | 
			
		||||
				println("tl:", cur.actualTableLog, "symbolLen:", cur.symbolLen, "norm:", cur.norm[:cur.symbolLen], "hist", cur.count[:cur.symbolLen])
 | 
			
		||||
			}
 | 
			
		||||
@@ -634,7 +634,7 @@ func (b *blockEnc) encode(org []byte, raw, rawAllLits bool) error {
 | 
			
		||||
	if llEnc.useRLE {
 | 
			
		||||
		mode |= uint8(compModeRLE) << 6
 | 
			
		||||
		llEnc.setRLE(b.sequences[0].llCode)
 | 
			
		||||
		if debug {
 | 
			
		||||
		if debugEncoder {
 | 
			
		||||
			println("llEnc.useRLE")
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
@@ -645,7 +645,7 @@ func (b *blockEnc) encode(org []byte, raw, rawAllLits bool) error {
 | 
			
		||||
	if ofEnc.useRLE {
 | 
			
		||||
		mode |= uint8(compModeRLE) << 4
 | 
			
		||||
		ofEnc.setRLE(b.sequences[0].ofCode)
 | 
			
		||||
		if debug {
 | 
			
		||||
		if debugEncoder {
 | 
			
		||||
			println("ofEnc.useRLE")
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
@@ -657,7 +657,7 @@ func (b *blockEnc) encode(org []byte, raw, rawAllLits bool) error {
 | 
			
		||||
	if mlEnc.useRLE {
 | 
			
		||||
		mode |= uint8(compModeRLE) << 2
 | 
			
		||||
		mlEnc.setRLE(b.sequences[0].mlCode)
 | 
			
		||||
		if debug {
 | 
			
		||||
		if debugEncoder {
 | 
			
		||||
			println("mlEnc.useRLE, code: ", b.sequences[0].mlCode, "value", b.sequences[0].matchLen)
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
@@ -666,7 +666,7 @@ func (b *blockEnc) encode(org []byte, raw, rawAllLits bool) error {
 | 
			
		||||
		mode |= uint8(m) << 2
 | 
			
		||||
	}
 | 
			
		||||
	b.output = append(b.output, mode)
 | 
			
		||||
	if debug {
 | 
			
		||||
	if debugEncoder {
 | 
			
		||||
		printf("Compression modes: 0b%b", mode)
 | 
			
		||||
	}
 | 
			
		||||
	b.output, err = llEnc.writeCount(b.output)
 | 
			
		||||
@@ -722,52 +722,53 @@ func (b *blockEnc) encode(org []byte, raw, rawAllLits bool) error {
 | 
			
		||||
		println("Encoded seq", seq, s, "codes:", s.llCode, s.mlCode, s.ofCode, "states:", ll.state, ml.state, of.state, "bits:", llB, mlB, ofB)
 | 
			
		||||
	}
 | 
			
		||||
	seq--
 | 
			
		||||
	if llEnc.maxBits+mlEnc.maxBits+ofEnc.maxBits <= 32 {
 | 
			
		||||
		// No need to flush (common)
 | 
			
		||||
		for seq >= 0 {
 | 
			
		||||
			s = b.sequences[seq]
 | 
			
		||||
			wr.flush32()
 | 
			
		||||
			llB, ofB, mlB := llTT[s.llCode], ofTT[s.ofCode], mlTT[s.mlCode]
 | 
			
		||||
			// tabelog max is 8 for all.
 | 
			
		||||
			of.encode(ofB)
 | 
			
		||||
			ml.encode(mlB)
 | 
			
		||||
			ll.encode(llB)
 | 
			
		||||
			wr.flush32()
 | 
			
		||||
	// Store sequences in reverse...
 | 
			
		||||
	for seq >= 0 {
 | 
			
		||||
		s = b.sequences[seq]
 | 
			
		||||
 | 
			
		||||
			// We checked that all can stay within 32 bits
 | 
			
		||||
			wr.addBits32NC(s.litLen, llB.outBits)
 | 
			
		||||
			wr.addBits32NC(s.matchLen, mlB.outBits)
 | 
			
		||||
			wr.addBits32NC(s.offset, ofB.outBits)
 | 
			
		||||
		ofB := ofTT[s.ofCode]
 | 
			
		||||
		wr.flush32() // tablelog max is below 8 for each, so it will fill max 24 bits.
 | 
			
		||||
		//of.encode(ofB)
 | 
			
		||||
		nbBitsOut := (uint32(of.state) + ofB.deltaNbBits) >> 16
 | 
			
		||||
		dstState := int32(of.state>>(nbBitsOut&15)) + int32(ofB.deltaFindState)
 | 
			
		||||
		wr.addBits16NC(of.state, uint8(nbBitsOut))
 | 
			
		||||
		of.state = of.stateTable[dstState]
 | 
			
		||||
 | 
			
		||||
			if debugSequences {
 | 
			
		||||
				println("Encoded seq", seq, s)
 | 
			
		||||
			}
 | 
			
		||||
		// Accumulate extra bits.
 | 
			
		||||
		outBits := ofB.outBits & 31
 | 
			
		||||
		extraBits := uint64(s.offset & bitMask32[outBits])
 | 
			
		||||
		extraBitsN := outBits
 | 
			
		||||
 | 
			
		||||
			seq--
 | 
			
		||||
		mlB := mlTT[s.mlCode]
 | 
			
		||||
		//ml.encode(mlB)
 | 
			
		||||
		nbBitsOut = (uint32(ml.state) + mlB.deltaNbBits) >> 16
 | 
			
		||||
		dstState = int32(ml.state>>(nbBitsOut&15)) + int32(mlB.deltaFindState)
 | 
			
		||||
		wr.addBits16NC(ml.state, uint8(nbBitsOut))
 | 
			
		||||
		ml.state = ml.stateTable[dstState]
 | 
			
		||||
 | 
			
		||||
		outBits = mlB.outBits & 31
 | 
			
		||||
		extraBits = extraBits<<outBits | uint64(s.matchLen&bitMask32[outBits])
 | 
			
		||||
		extraBitsN += outBits
 | 
			
		||||
 | 
			
		||||
		llB := llTT[s.llCode]
 | 
			
		||||
		//ll.encode(llB)
 | 
			
		||||
		nbBitsOut = (uint32(ll.state) + llB.deltaNbBits) >> 16
 | 
			
		||||
		dstState = int32(ll.state>>(nbBitsOut&15)) + int32(llB.deltaFindState)
 | 
			
		||||
		wr.addBits16NC(ll.state, uint8(nbBitsOut))
 | 
			
		||||
		ll.state = ll.stateTable[dstState]
 | 
			
		||||
 | 
			
		||||
		outBits = llB.outBits & 31
 | 
			
		||||
		extraBits = extraBits<<outBits | uint64(s.litLen&bitMask32[outBits])
 | 
			
		||||
		extraBitsN += outBits
 | 
			
		||||
 | 
			
		||||
		wr.flush32()
 | 
			
		||||
		wr.addBits64NC(extraBits, extraBitsN)
 | 
			
		||||
 | 
			
		||||
		if debugSequences {
 | 
			
		||||
			println("Encoded seq", seq, s)
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		for seq >= 0 {
 | 
			
		||||
			s = b.sequences[seq]
 | 
			
		||||
			wr.flush32()
 | 
			
		||||
			llB, ofB, mlB := llTT[s.llCode], ofTT[s.ofCode], mlTT[s.mlCode]
 | 
			
		||||
			// tabelog max is below 8 for each.
 | 
			
		||||
			of.encode(ofB)
 | 
			
		||||
			ml.encode(mlB)
 | 
			
		||||
			ll.encode(llB)
 | 
			
		||||
			wr.flush32()
 | 
			
		||||
 | 
			
		||||
			// ml+ll = max 32 bits total
 | 
			
		||||
			wr.addBits32NC(s.litLen, llB.outBits)
 | 
			
		||||
			wr.addBits32NC(s.matchLen, mlB.outBits)
 | 
			
		||||
			wr.flush32()
 | 
			
		||||
			wr.addBits32NC(s.offset, ofB.outBits)
 | 
			
		||||
 | 
			
		||||
			if debugSequences {
 | 
			
		||||
				println("Encoded seq", seq, s)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			seq--
 | 
			
		||||
		}
 | 
			
		||||
		seq--
 | 
			
		||||
	}
 | 
			
		||||
	ml.flush(mlEnc.actualTableLog)
 | 
			
		||||
	of.flush(ofEnc.actualTableLog)
 | 
			
		||||
@@ -786,7 +787,7 @@ func (b *blockEnc) encode(org []byte, raw, rawAllLits bool) error {
 | 
			
		||||
 | 
			
		||||
	// Size is output minus block header.
 | 
			
		||||
	bh.setSize(uint32(len(b.output)-bhOffset) - 3)
 | 
			
		||||
	if debug {
 | 
			
		||||
	if debugEncoder {
 | 
			
		||||
		println("Rewriting block header", bh)
 | 
			
		||||
	}
 | 
			
		||||
	_ = bh.appendTo(b.output[bhOffset:bhOffset])
 | 
			
		||||
@@ -801,14 +802,13 @@ func (b *blockEnc) genCodes() {
 | 
			
		||||
		// nothing to do
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(b.sequences) > math.MaxUint16 {
 | 
			
		||||
		panic("can only encode up to 64K sequences")
 | 
			
		||||
	}
 | 
			
		||||
	// No bounds checks after here:
 | 
			
		||||
	llH := b.coders.llEnc.Histogram()[:256]
 | 
			
		||||
	ofH := b.coders.ofEnc.Histogram()[:256]
 | 
			
		||||
	mlH := b.coders.mlEnc.Histogram()[:256]
 | 
			
		||||
	llH := b.coders.llEnc.Histogram()
 | 
			
		||||
	ofH := b.coders.ofEnc.Histogram()
 | 
			
		||||
	mlH := b.coders.mlEnc.Histogram()
 | 
			
		||||
	for i := range llH {
 | 
			
		||||
		llH[i] = 0
 | 
			
		||||
	}
 | 
			
		||||
@@ -820,7 +820,8 @@ func (b *blockEnc) genCodes() {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var llMax, ofMax, mlMax uint8
 | 
			
		||||
	for i, seq := range b.sequences {
 | 
			
		||||
	for i := range b.sequences {
 | 
			
		||||
		seq := &b.sequences[i]
 | 
			
		||||
		v := llCode(seq.litLen)
 | 
			
		||||
		seq.llCode = v
 | 
			
		||||
		llH[v]++
 | 
			
		||||
@@ -844,7 +845,6 @@ func (b *blockEnc) genCodes() {
 | 
			
		||||
				panic(fmt.Errorf("mlMax > maxMatchLengthSymbol (%d), matchlen: %d", mlMax, seq.matchLen))
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		b.sequences[i] = seq
 | 
			
		||||
	}
 | 
			
		||||
	maxCount := func(a []uint32) int {
 | 
			
		||||
		var max uint32
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user