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/go#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>
This commit is contained in:
Jonathan Amsterdam 2023-03-21 08:23:20 -04:00
parent f67b0a73e3
commit f9a4cfd510
1 changed files with 6 additions and 18 deletions

View File

@ -5,7 +5,6 @@
package slog package slog
import ( import (
"reflect"
"unsafe" "unsafe"
) )
@ -29,8 +28,8 @@ type Value struct {
} }
type ( type (
stringptr unsafe.Pointer // used in Value.any when the Value is a string stringptr *byte // used in Value.any when the Value is a string
groupptr unsafe.Pointer // used in Value.any when the Value is a []Attr groupptr *Attr // used in Value.any when the Value is a []Attr
) )
// Kind returns v's Kind. // Kind returns v's Kind.
@ -55,16 +54,11 @@ func (v Value) Kind() Kind {
// StringValue returns a new Value for a string. // StringValue returns a new Value for a string.
func StringValue(value string) Value { func StringValue(value string) Value {
hdr := (*reflect.StringHeader)(unsafe.Pointer(&value)) return Value{num: uint64(len(value)), any: stringptr(unsafe.StringData(value))}
return Value{num: uint64(hdr.Len), any: stringptr(hdr.Data)}
} }
func (v Value) str() string { func (v Value) str() string {
var s string return unsafe.String(v.any.(stringptr), v.num)
hdr := (*reflect.StringHeader)(unsafe.Pointer(&s))
hdr.Data = uintptr(v.any.(stringptr))
hdr.Len = int(v.num)
return s
} }
// String returns Value's value as a string, formatted like fmt.Sprint. Unlike // String returns Value's value as a string, formatted like fmt.Sprint. Unlike
@ -72,20 +66,14 @@ func (v Value) str() string {
// wrong kind, String never panics. // wrong kind, String never panics.
func (v Value) String() string { func (v Value) String() string {
if sp, ok := v.any.(stringptr); ok { if sp, ok := v.any.(stringptr); ok {
// Inlining this code makes a huge difference. return unsafe.String(sp, v.num)
var s string
hdr := (*reflect.StringHeader)(unsafe.Pointer(&s))
hdr.Data = uintptr(sp)
hdr.Len = int(v.num)
return s
} }
var buf []byte var buf []byte
return string(v.append(buf)) return string(v.append(buf))
} }
func groupValue(as []Attr) Value { func groupValue(as []Attr) Value {
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&as)) return Value{num: uint64(len(as)), any: groupptr(unsafe.SliceData(as))}
return Value{num: uint64(hdr.Len), any: groupptr(hdr.Data)}
} }
// group returns the Value's value as a []Attr. // group returns the Value's value as a []Attr.