From 2c424edd91a07ef200ff639c205ddf6f51a17351 Mon Sep 17 00:00:00 2001 From: qiulaidongfeng <2645477756@qq.com> Date: Tue, 21 Nov 2023 22:57:59 +0000 Subject: [PATCH] internal/abi, runtime, reflect, cmd: merge maxZero const into internal/abi For #59670 Change-Id: If38a74ad067a3ea3ff551c0c25c8ef41abec114b GitHub-Last-Rev: fb1f2f3c9f320017627bc3342b061e1e7f6f7fad GitHub-Pull-Request: golang/go#64268 Reviewed-on: https://go-review.googlesource.com/c/go/+/543655 Run-TryBot: qiulaidongfeng <2645477756@qq.com> TryBot-Result: Gopher Robot Reviewed-by: Matthew Dempsky Reviewed-by: Keith Randall Reviewed-by: Keith Randall --- src/cmd/compile/internal/walk/assign.go | 3 ++- src/cmd/compile/internal/walk/expr.go | 3 ++- src/cmd/compile/internal/walk/walk.go | 1 - src/internal/abi/map.go | 3 +++ src/reflect/value.go | 11 ++++------- src/runtime/map.go | 3 +-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/cmd/compile/internal/walk/assign.go b/src/cmd/compile/internal/walk/assign.go index afd1a326d3..fc3b858a80 100644 --- a/src/cmd/compile/internal/walk/assign.go +++ b/src/cmd/compile/internal/walk/assign.go @@ -6,6 +6,7 @@ package walk import ( "go/constant" + "internal/abi" "cmd/compile/internal/base" "cmd/compile/internal/ir" @@ -168,7 +169,7 @@ func walkAssignMapRead(init *ir.Nodes, n *ir.AssignListStmt) ir.Node { a := n.Lhs[0] var call *ir.CallExpr - if w := t.Elem().Size(); w <= zeroValSize { + if w := t.Elem().Size(); w <= abi.ZeroValSize { fn := mapfn(mapaccess2[fast], t, false) call = mkcall1(fn, fn.Type().ResultsTuple(), init, reflectdata.IndexMapRType(base.Pos, r), r.X, key) } else { diff --git a/src/cmd/compile/internal/walk/expr.go b/src/cmd/compile/internal/walk/expr.go index 64d20b555e..268f793dc9 100644 --- a/src/cmd/compile/internal/walk/expr.go +++ b/src/cmd/compile/internal/walk/expr.go @@ -7,6 +7,7 @@ package walk import ( "fmt" "go/constant" + "internal/abi" "internal/buildcfg" "strings" @@ -825,7 +826,7 @@ func walkIndexMap(n *ir.IndexExpr, init *ir.Nodes) ir.Node { switch { case n.Assigned: mapFn = mapfn(mapassign[fast], t, false) - case t.Elem().Size() > zeroValSize: + case t.Elem().Size() > abi.ZeroValSize: args = append(args, reflectdata.ZeroAddr(t.Elem().Size())) mapFn = mapfn("mapaccess1_fat", t, true) default: diff --git a/src/cmd/compile/internal/walk/walk.go b/src/cmd/compile/internal/walk/walk.go index 8be5804616..001edcc332 100644 --- a/src/cmd/compile/internal/walk/walk.go +++ b/src/cmd/compile/internal/walk/walk.go @@ -18,7 +18,6 @@ import ( // The constant is known to runtime. const tmpstringbufsize = 32 -const zeroValSize = 1024 // must match value of runtime/map.go:maxZero func Walk(fn *ir.Func) { ir.CurFunc = fn diff --git a/src/internal/abi/map.go b/src/internal/abi/map.go index e5b0a0bb6f..ad054e7d77 100644 --- a/src/internal/abi/map.go +++ b/src/internal/abi/map.go @@ -12,3 +12,6 @@ const ( MapMaxKeyBytes = 128 // Must fit in a uint8. MapMaxElemBytes = 128 // Must fit in a uint8. ) + +// ZeroValSize is the size in bytes of runtime.zeroVal. +const ZeroValSize = 1024 diff --git a/src/reflect/value.go b/src/reflect/value.go index 068bac0050..06f22f7428 100644 --- a/src/reflect/value.go +++ b/src/reflect/value.go @@ -1603,7 +1603,7 @@ func (v Value) IsZero() bool { } typ := (*abi.ArrayType)(unsafe.Pointer(v.typ())) // If the type is comparable, then compare directly with zero. - if typ.Equal != nil && typ.Size() <= maxZero { + if typ.Equal != nil && typ.Size() <= abi.ZeroValSize { // v.ptr doesn't escape, as Equal functions are compiler generated // and never escape. The escape analysis doesn't know, as it is a // function pointer call. @@ -1631,7 +1631,7 @@ func (v Value) IsZero() bool { } typ := (*abi.StructType)(unsafe.Pointer(v.typ())) // If the type is comparable, then compare directly with zero. - if typ.Equal != nil && typ.Size() <= maxZero { + if typ.Equal != nil && typ.Size() <= abi.ZeroValSize { // See noescape justification above. return typ.Equal(noescape(v.ptr), unsafe.Pointer(&zeroVal[0])) } @@ -3277,7 +3277,7 @@ func Zero(typ Type) Value { fl := flag(t.Kind()) if t.IfaceIndir() { var p unsafe.Pointer - if t.Size() <= maxZero { + if t.Size() <= abi.ZeroValSize { p = unsafe.Pointer(&zeroVal[0]) } else { p = unsafe_New(t) @@ -3287,11 +3287,8 @@ func Zero(typ Type) Value { return Value{t, nil, fl} } -// must match declarations in runtime/map.go. -const maxZero = 1024 - //go:linkname zeroVal runtime.zeroVal -var zeroVal [maxZero]byte +var zeroVal [abi.ZeroValSize]byte // New returns a Value representing a pointer to a new zero value // for the specified type. That is, the returned Value's Type is PointerTo(typ). diff --git a/src/runtime/map.go b/src/runtime/map.go index 6f5623b102..7048949073 100644 --- a/src/runtime/map.go +++ b/src/runtime/map.go @@ -1436,8 +1436,7 @@ func reflectlite_maplen(h *hmap) int { return h.count } -const maxZero = 1024 // must match value in reflect/value.go:maxZero cmd/compile/internal/gc/walk.go:zeroValSize -var zeroVal [maxZero]byte +var zeroVal [abi.ZeroValSize]byte // mapinitnoop is a no-op function known the Go linker; if a given global // map (of the right size) is determined to be dead, the linker will -- 2.48.1