package main

import (
	"fmt"
	"runtime"
)

var deepest uint64

//go:noinline
func checksum(p *[1024]byte) int {
	n := 0
	for _, v := range p {
		n += int(v)
	}
	return n
}

//go:noinline
func descend(depth int) int {
	var frame [1024]byte
	frame[0] = byte(depth)
	frame[1023] = 1
	n := 0
	if depth > 0 {
		n = descend(depth - 1)
	} else {
		var m runtime.MemStats
		runtime.ReadMemStats(&m)
		deepest = m.StackInuse
	}
	return n + checksum(&frame)
}
func main() {
	var a, b runtime.MemStats
	runtime.ReadMemStats(&a)
	result := descend(256)
	runtime.GC()
	runtime.ReadMemStats(&b)
	fmt.Println("checksum:", result)
	fmt.Println("StackInuse before/deepest/after GC:", a.StackInuse, deepest, b.StackInuse)
}
