mirror of https://github.com/golang/go.git
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:
parent
f67b0a73e3
commit
f9a4cfd510
|
|
@ -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.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue