mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: remove slices from rtype.funcType
Alternative to golang.org/cl/19852. This memory layout doesn't have
an easy type representation, but it is noticeably smaller than the
current funcType, and saves significant extra space.
Some notes on the layout are in reflect/type.go:
// A *rtype for each in and out parameter is stored in an array that
// directly follows the funcType (and possibly its uncommonType). So
// a function type with one method, one input, and one output is:
//
// struct {
// funcType
// uncommonType
// [2]*rtype // [0] is in, [1] is out
// uncommonTypeSliceContents
// }
There are three arbitrary limits introduced by this CL:
1. No more than 65535 function input parameters.
2. No more than 32767 function output parameters.
3. reflect.FuncOf is limited to 128 parameters.
I don't think these are limits in practice, but are worth noting.
Reduces godoc binary size by 2.4%, 330KB.
For #6853.
Change-Id: I225c0a0516ebdbe92d41dfdf43f716da42dfe347
Reviewed-on: https://go-review.googlesource.com/19916
Reviewed-by: Russ Cox <rsc@golang.org>
Run-TryBot: David Crawshaw <crawshaw@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
b050adeebd
commit
8df733bd22
8 changed files with 187 additions and 88 deletions
|
|
@ -128,6 +128,29 @@ func (t *_type) name() string {
|
|||
return t._string[i+1:]
|
||||
}
|
||||
|
||||
func (t *functype) in() []*_type {
|
||||
// See funcType in reflect/type.go for details on data layout.
|
||||
uadd := uintptr(unsafe.Sizeof(functype{}))
|
||||
if t.typ.tflag&tflagUncommon != 0 {
|
||||
uadd += unsafe.Sizeof(uncommontype{})
|
||||
}
|
||||
return (*[1 << 20]*_type)(add(unsafe.Pointer(t), uadd))[:t.inCount]
|
||||
}
|
||||
|
||||
func (t *functype) out() []*_type {
|
||||
// See funcType in reflect/type.go for details on data layout.
|
||||
uadd := uintptr(unsafe.Sizeof(functype{}))
|
||||
if t.typ.tflag&tflagUncommon != 0 {
|
||||
uadd += unsafe.Sizeof(uncommontype{})
|
||||
}
|
||||
outCount := t.outCount & (1<<15 - 1)
|
||||
return (*[1 << 20]*_type)(add(unsafe.Pointer(t), uadd))[t.inCount : t.inCount+outCount]
|
||||
}
|
||||
|
||||
func (t *functype) dotdotdot() bool {
|
||||
return t.outCount&(1<<15) != 0
|
||||
}
|
||||
|
||||
type method struct {
|
||||
name *string
|
||||
pkgpath *string
|
||||
|
|
@ -187,10 +210,9 @@ type slicetype struct {
|
|||
}
|
||||
|
||||
type functype struct {
|
||||
typ _type
|
||||
dotdotdot bool
|
||||
in []*_type
|
||||
out []*_type
|
||||
typ _type
|
||||
inCount uint16
|
||||
outCount uint16
|
||||
}
|
||||
|
||||
type ptrtype struct {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue