aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/internal/gclayout/gclayout.go
blob: aa841d80489af84c5a9d399ebfe92eb1127a8b7b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package gclayout

import "unsafe"

// Internal constants for gc layout
// See runtime/gc_precise.go

var (
	NoPtrs  unsafe.Pointer
	Pointer unsafe.Pointer
	String  unsafe.Pointer
	Slice   unsafe.Pointer
)

func init() {
	var sizeBits uintptr

	switch unsafe.Sizeof(uintptr(0)) {
	case 8:
		sizeBits = 6
	case 4:
		sizeBits = 5
	case 2:
		sizeBits = 4
	}

	var sizeShift = sizeBits + 1

	NoPtrs = unsafe.Pointer(uintptr(0b0<<sizeShift) | uintptr(0b1<<1) | uintptr(1))
	Pointer = unsafe.Pointer(uintptr(0b1<<sizeShift) | uintptr(0b1<<1) | uintptr(1))
	String = unsafe.Pointer(uintptr(0b01<<sizeShift) | uintptr(0b10<<1) | uintptr(1))
	Slice = unsafe.Pointer(uintptr(0b001<<sizeShift) | uintptr(0b11<<1) | uintptr(1))
}