mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: use 1-bit pointer bitmaps in type representation
The type information in reflect.Type and the GC programs is now 1 bit per word, down from 2 bits. The in-memory unrolled type bitmap representation are now 1 bit per word, down from 4 bits. The conversion from the unrolled (now 1-bit) bitmap to the heap bitmap (still 4-bit) is not optimized. A followup CL will work on that, after the heap bitmap has been converted to 2-bit. The typeDead optimization, in which a special value denotes that there are no more pointers anywhere in the object, is lost in this CL. A followup CL will bring it back in the final form of heapBitsSetType. Change-Id: If61e67950c16a293b0b516a6fd9a1c755b6d5549 Reviewed-on: https://go-review.googlesource.com/9702 Reviewed-by: Austin Clements <austin@google.com>
This commit is contained in:
parent
7d9e16abc6
commit
6d8a147bef
10 changed files with 204 additions and 301 deletions
|
|
@ -18,8 +18,6 @@ func IsRO(v Value) bool {
|
|||
var CallGC = &callGC
|
||||
|
||||
const PtrSize = ptrSize
|
||||
const BitsPointer = bitsPointer
|
||||
const BitsScalar = bitsScalar
|
||||
|
||||
func FuncLayout(t Type, rcvr Type) (frametype Type, argSize, retOffset uintptr, stack []byte, gc []byte, ptrs bool) {
|
||||
var ft *rtype
|
||||
|
|
@ -38,7 +36,7 @@ func FuncLayout(t Type, rcvr Type) (frametype Type, argSize, retOffset uintptr,
|
|||
}
|
||||
gcdata := (*[1000]byte)(ft.gc[0])
|
||||
for i := uintptr(0); i < ft.size/ptrSize; i++ {
|
||||
gc = append(gc, gcdata[i/2]>>(i%2*4+2)&3)
|
||||
gc = append(gc, gcdata[i/8]>>(i%8)&1)
|
||||
}
|
||||
ptrs = ft.kind&kindNoPointers == 0
|
||||
return
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue