blob: af62df974a08f2a8ce6f1a0909784599551046b6 [file] [log] [blame]
// +build ignore
package main
import (
"fmt"
"runtime"
)
// 1 START OMIT
type P *P
type S []S
type C chan C
type M map[int]M
// 1 END OMIT
// 2 START OMIT
func Val(p *P) int {
if p == nil {
return 0
} else {
return 1 + Val(*p)
}
}
func Add(a, b *P) *P {
if b == nil {
return a
} else {
a1 := new(P)
*a1 = a // a1 == a + 1
return Add(a1, *b) // a + b == Add(a+1, b-1)
}
}
// 2 END OMIT
// 3 START OMIT
func Print(p *P) {
fmt.Println(Val(p))
}
func Allocate() {
p := new(P); *p = new(P); **p = new(P)
runtime.SetFinalizer(p, Print)
runtime.SetFinalizer(*p, Print)
runtime.SetFinalizer(**p, Print)
}
func main() {
Allocate()
for i := 0; i < 5; i++ {
runtime.GC()
runtime.Gosched()
}
}
// 3 END OMIT