From e948c3394ee137bae45e85cfa7c8ec0bb0e16dc8 Mon Sep 17 00:00:00 2001 From: Joe Tsai Date: Fri, 15 Apr 2022 18:09:48 -0700 Subject: [PATCH] reflect: make Value.Type inlineable MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This allows the result of Type to be computed much faster. Performance: old new delta 1.76ns 0.66ns -62.27% Change-Id: Ie007fd175aaa41b2f67c71fa2a34ab8d292dd0e0 Reviewed-on: https://go-review.googlesource.com/c/go/+/400335 Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick TryBot-Result: Gopher Robot Reviewed-by: Dmitri Shuralyov Reviewed-by: Daniel Martí Reviewed-by: Ian Lance Taylor Run-TryBot: Ian Lance Taylor Auto-Submit: Ian Lance Taylor --- src/reflect/value.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/reflect/value.go b/src/reflect/value.go index 2496cbe463..06f0469ede 100644 --- a/src/reflect/value.go +++ b/src/reflect/value.go @@ -2465,12 +2465,17 @@ func (v Value) TrySend(x Value) bool { // Type returns v's type. func (v Value) Type() Type { - f := v.flag - if f == 0 { + if v.flag != 0 && v.flag&flagMethod == 0 { + return v.typ + } + return v.typeSlow() +} + +func (v Value) typeSlow() Type { + if v.flag == 0 { panic(&ValueError{"reflect.Value.Type", Invalid}) } - if f&flagMethod == 0 { - // Easy case + if v.flag&flagMethod == 0 { return v.typ } -- 2.48.1