github.com/wasilibs/nottinygc@v0.7.2-0.20240312114022-d59c9478ef51/gc_test.go (about)

     1  // Copyright wasilibs authors
     2  // SPDX-License-Identifier: MIT
     3  
     4  package nottinygc_test
     5  
     6  import (
     7  	"runtime"
     8  	"testing"
     9  )
    10  
    11  // Some tests copied from Go that don't rely on internals
    12  
    13  func TestGcDeepNesting(t *testing.T) {
    14  	type T [2][2][2][2][2][2][2][2][2][2]*int
    15  	a := new(T)
    16  
    17  	// Prevent the compiler from applying escape analysis.
    18  	// This makes sure new(T) is allocated on heap, not on the stack.
    19  	t.Logf("%p", a)
    20  
    21  	a[0][0][0][0][0][0][0][0][0][0] = new(int)
    22  	*a[0][0][0][0][0][0][0][0][0][0] = 13
    23  	runtime.GC()
    24  	if *a[0][0][0][0][0][0][0][0][0][0] != 13 {
    25  		t.Fail()
    26  	}
    27  }
    28  
    29  func TestGcArraySlice(t *testing.T) {
    30  	type X struct {
    31  		buf     [1]byte
    32  		nextbuf []byte
    33  		next    *X
    34  	}
    35  	var head *X
    36  	for i := 0; i < 10; i++ {
    37  		p := &X{}
    38  		p.buf[0] = 42
    39  		p.next = head
    40  		if head != nil {
    41  			p.nextbuf = head.buf[:]
    42  		}
    43  		head = p
    44  		runtime.GC()
    45  	}
    46  	for p := head; p != nil; p = p.next {
    47  		if p.buf[0] != 42 {
    48  			t.Fatal("corrupted heap")
    49  		}
    50  	}
    51  }
    52  
    53  func TestGcRescan(t *testing.T) {
    54  	type X struct {
    55  		c     chan error
    56  		nextx *X
    57  	}
    58  	type Y struct {
    59  		X
    60  		nexty *Y
    61  		p     *int
    62  	}
    63  	var head *Y
    64  	for i := 0; i < 10; i++ {
    65  		p := &Y{}
    66  		p.c = make(chan error)
    67  		if head != nil {
    68  			p.nextx = &head.X
    69  		}
    70  		p.nexty = head
    71  		p.p = new(int)
    72  		*p.p = 42
    73  		head = p
    74  		runtime.GC()
    75  	}
    76  	for p := head; p != nil; p = p.nexty {
    77  		if *p.p != 42 {
    78  			t.Fatal("corrupted heap")
    79  		}
    80  	}
    81  }