type slice … type notInHeapSlice … func panicmakeslicelen() { … } func panicmakeslicecap() { … } // makeslicecopy allocates a slice of "tolen" elements of type "et", // then copies "fromlen" elements of type "et" into that new allocation from "from". func makeslicecopy(et *_type, tolen int, fromlen int, from unsafe.Pointer) unsafe.Pointer { … } // makeslice should be an internal detail, // but widely used packages access it using linkname. // Notable members of the hall of shame include: // - github.com/bytedance/sonic // // Do not remove or change the type signature. // See go.dev/issue/67401. // //go:linkname makeslice func makeslice(et *_type, len, cap int) unsafe.Pointer { … } func makeslice64(et *_type, len64, cap64 int64) unsafe.Pointer { … } // growslice allocates new backing store for a slice. // // arguments: // // oldPtr = pointer to the slice's backing array // newLen = new length (= oldLen + num) // oldCap = original slice's capacity. // num = number of elements being added // et = element type // // return values: // // newPtr = pointer to the new backing store // newLen = same value as the argument // newCap = capacity of the new backing store // // Requires that uint(newLen) > uint(oldCap). // Assumes the original slice length is newLen - num // // A new backing store is allocated with space for at least newLen elements. // Existing entries [0, oldLen) are copied over to the new backing store. // Added entries [oldLen, newLen) are not initialized by growslice // (although for pointer-containing element types, they are zeroed). They // must be initialized by the caller. // Trailing entries [newLen, newCap) are zeroed. // // growslice's odd calling convention makes the generated code that calls // this function simpler. In particular, it accepts and returns the // new length so that the old length is not live (does not need to be // spilled/restored) and the new length is returned (also does not need // to be spilled/restored). // // growslice should be an internal detail, // but widely used packages access it using linkname. // Notable members of the hall of shame include: // - github.com/bytedance/sonic // - github.com/chenzhuoyu/iasm // - github.com/cloudwego/dynamicgo // - github.com/ugorji/go/codec // // Do not remove or change the type signature. // See go.dev/issue/67401. // //go:linkname growslice func growslice(oldPtr unsafe.Pointer, newLen, oldCap, num int, et *_type) slice { … } // nextslicecap computes the next appropriate slice length. func nextslicecap(newLen, oldCap int) int { … } // reflect_growslice should be an internal detail, // but widely used packages access it using linkname. // Notable members of the hall of shame include: // - github.com/cloudwego/dynamicgo // // Do not remove or change the type signature. // See go.dev/issue/67401. // //go:linkname reflect_growslice reflect.growslice func reflect_growslice(et *_type, old slice, num int) slice { … } func isPowerOfTwo(x uintptr) bool { … } // slicecopy is used to copy from a string or slice of pointerless elements into a slice. func slicecopy(toPtr unsafe.Pointer, toLen int, fromPtr unsafe.Pointer, fromLen int, width uintptr) int { … } //go:linkname bytealg_MakeNoZero internal/bytealg.MakeNoZero func bytealg_MakeNoZero(len int) []byte { … }