Skip to content

Commit 6e1306c

Browse files
jbaeric
authored andcommitted
log/slog: use unsafe.StringData, SliceData
Use the new functions in 1.20 (unsafe.StringData, etc.) instead of StringHeader and StructHeader from the reflect package. Updates golang#56345. Change-Id: I84d0db7b203aeffe45ce8b06beb7b4ee17e19949 Reviewed-on: https://go-review.googlesource.com/c/go/+/478055 TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Alan Donovan <adonovan@google.com> Run-TryBot: Jonathan Amsterdam <jba@google.com> Reviewed-by: Ian Lance Taylor <iant@google.com>
1 parent 58b5dde commit 6e1306c

File tree

1 file changed

+6
-18
lines changed

1 file changed

+6
-18
lines changed

src/log/slog/value_unsafe.go

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
package slog
66

77
import (
8-
"reflect"
98
"unsafe"
109
)
1110

@@ -29,8 +28,8 @@ type Value struct {
2928
}
3029

3130
type (
32-
stringptr unsafe.Pointer // used in Value.any when the Value is a string
33-
groupptr unsafe.Pointer // used in Value.any when the Value is a []Attr
31+
stringptr *byte // used in Value.any when the Value is a string
32+
groupptr *Attr // used in Value.any when the Value is a []Attr
3433
)
3534

3635
// Kind returns v's Kind.
@@ -55,37 +54,26 @@ func (v Value) Kind() Kind {
5554

5655
// StringValue returns a new Value for a string.
5756
func StringValue(value string) Value {
58-
hdr := (*reflect.StringHeader)(unsafe.Pointer(&value))
59-
return Value{num: uint64(hdr.Len), any: stringptr(hdr.Data)}
57+
return Value{num: uint64(len(value)), any: stringptr(unsafe.StringData(value))}
6058
}
6159

6260
func (v Value) str() string {
63-
var s string
64-
hdr := (*reflect.StringHeader)(unsafe.Pointer(&s))
65-
hdr.Data = uintptr(v.any.(stringptr))
66-
hdr.Len = int(v.num)
67-
return s
61+
return unsafe.String(v.any.(stringptr), v.num)
6862
}
6963

7064
// String returns Value's value as a string, formatted like fmt.Sprint. Unlike
7165
// the methods Int64, Float64, and so on, which panic if v is of the
7266
// wrong kind, String never panics.
7367
func (v Value) String() string {
7468
if sp, ok := v.any.(stringptr); ok {
75-
// Inlining this code makes a huge difference.
76-
var s string
77-
hdr := (*reflect.StringHeader)(unsafe.Pointer(&s))
78-
hdr.Data = uintptr(sp)
79-
hdr.Len = int(v.num)
80-
return s
69+
return unsafe.String(sp, v.num)
8170
}
8271
var buf []byte
8372
return string(v.append(buf))
8473
}
8574

8675
func groupValue(as []Attr) Value {
87-
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&as))
88-
return Value{num: uint64(hdr.Len), any: groupptr(hdr.Data)}
76+
return Value{num: uint64(len(as)), any: groupptr(unsafe.SliceData(as))}
8977
}
9078

9179
// group returns the Value's value as a []Attr.

0 commit comments

Comments
 (0)