diff options
| author | Ian Lance Taylor <iant@golang.org> | 2023-03-23 17:38:05 -0700 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2023-03-24 19:28:46 +0000 |
| commit | c994067e5bf8c9fde09cabfc29d56fdcf98bbee8 (patch) | |
| tree | e98934390bd28717dd69cb0028adfac5373043b2 /src | |
| parent | bd7b19356f3827c36ef584bfd8e88aa6cee00710 (diff) | |
| download | go-c994067e5bf8c9fde09cabfc29d56fdcf98bbee8.tar.xz | |
encoding/gob: update decgen to generate current dec_helpers
I edited dec_helpers.go without realizing that it is a generated file.
Fix the generator to generate the current version (which generates
a small comment change).
Change-Id: I70e3bc78eb0728d23c08972611218f288dc1d29c
Reviewed-on: https://go-review.googlesource.com/c/go/+/479117
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Andrew Ekstedt <andrew.ekstedt@gmail.com>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Auto-Submit: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
Reviewed-by: Heschi Kreinick <heschi@google.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/encoding/gob/dec_helpers.go | 1 | ||||
| -rw-r--r-- | src/encoding/gob/decgen.go | 22 |
2 files changed, 23 insertions, 0 deletions
diff --git a/src/encoding/gob/dec_helpers.go b/src/encoding/gob/dec_helpers.go index 098ba7254a..44a74e2442 100644 --- a/src/encoding/gob/dec_helpers.go +++ b/src/encoding/gob/dec_helpers.go @@ -359,6 +359,7 @@ func decStringSlice(state *decoderState, v reflect.Value, length int, ovfl error errorf("decoding string array or slice: length exceeds input size (%d elements)", length) } if i >= len(slice) { + // This is a slice that we only partially allocated. growSlice(v, &slice, length) } u := state.decodeUint() diff --git a/src/encoding/gob/decgen.go b/src/encoding/gob/decgen.go index e40816eb86..27a30eaf61 100644 --- a/src/encoding/gob/decgen.go +++ b/src/encoding/gob/decgen.go @@ -180,6 +180,7 @@ func main() { fmt.Fprintf(&b, arrayHelper, t.lower, t.upper) fmt.Fprintf(&b, sliceHelper, t.lower, t.upper, t.decoder) } + fmt.Fprintf(&b, trailer) source, err := format.Source(b.Bytes()) if err != nil { log.Fatal("source format error:", err) @@ -236,8 +237,29 @@ func dec%[2]sSlice(state *decoderState, v reflect.Value, length int, ovfl error) if state.b.Len() == 0 { errorf("decoding %[1]s array or slice: length exceeds input size (%%d elements)", length) } + if i >= len(slice) { + // This is a slice that we only partially allocated. + growSlice(v, &slice, length) + } %[3]s } return true } ` + +const trailer = ` +// growSlice is called for a slice that we only partially allocated, +// to grow it up to length. +func growSlice[E any](v reflect.Value, ps *[]E, length int) { + var zero E + s := *ps + s = append(s, zero) + cp := cap(s) + if cp > length { + cp = length + } + s = s[:cp] + v.Set(reflect.ValueOf(s)) + *ps = s +} +` |
