Skip to content

Commit

Permalink
fmt: avoid reflect.Value.Slice to help escape analysis
Browse files Browse the repository at this point in the history
This is part of a series of CLs that aim to reduce how often
interface arguments escape for the print functions in fmt.

Prior to this change, one reason arguments escape is because
printValue calls reflect.Value.Slice, which causes its
value argument to escape (though at this CL, that is
shrouded in the fmt escape analysis logs by other
printValue escape reasons).

This CL avoids that usage by calling f.Bytes instead,
which is possible because we know f is a slice of bytes
or an addressable array of bytes.

Arguments still escape for other reasons.

Change-Id: Ic3f064117a364007e1dd3197cef9d641abbf784a
Reviewed-on: https://go-review.googlesource.com/c/go/+/524940
TryBot-Result: Gopher Robot <[email protected]>
Reviewed-by: Ian Lance Taylor <[email protected]>
Reviewed-by: Matthew Dempsky <[email protected]>
Auto-Submit: Ian Lance Taylor <[email protected]>
Run-TryBot: t hepudds <[email protected]>
  • Loading branch information
thepudds authored and gopherbot committed Sep 7, 2023
1 parent a2f28a4 commit 3466e57
Showing 1 changed file with 1 addition and 3 deletions.
4 changes: 1 addition & 3 deletions src/fmt/print.go
Original file line number Diff line number Diff line change
Expand Up @@ -872,10 +872,8 @@ func (p *pp) printValue(value reflect.Value, verb rune, depth int) {
t := f.Type()
if t.Elem().Kind() == reflect.Uint8 {
var bytes []byte
if f.Kind() == reflect.Slice {
if f.Kind() == reflect.Slice || f.CanAddr() {
bytes = f.Bytes()
} else if f.CanAddr() {
bytes = f.Slice(0, f.Len()).Bytes()
} else {
// We have an array, but we cannot Slice() a non-addressable array,
// so we build a slice by hand. This is a rare case but it would be nice
Expand Down

0 comments on commit 3466e57

Please sign in to comment.