go/test/arenas/smoke.go
Michael Anthony Knyszek 2b0ff4b629 reflect: fix ArenaNew to match documentation
Currently ArenaNew expects the type passed in to be a *T and it returns
a *T. This does not match the function's documentation.

Since this is an experiment, change ArenaNew to match the documentation.
This more closely aligns ArenaNew with arena.New. (Takes a type T,
returns a *T value.)

Note that this is a breaking change. However, as far as pkg.go.dev can
tell, there's exactly one package using it in the open source world.

Also, add smoke test for the exported API, which is just a wrapper
around the internal API. Clearly there's enough room for error here that
it should be tested, but we don't need thorough tests at this layer
because that already exists in the runtime. We just need to make sure it
basically works.

Fixes #60528.

Change-Id: I673cc4609378380ef80648b0c2eb2928e73f49c9
Reviewed-on: https://go-review.googlesource.com/c/go/+/501860
Run-TryBot: Michael Knyszek <mknyszek@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
2023-06-16 17:08:43 +00:00

66 lines
1.6 KiB
Go

// build -goexperiment arenas
// Copyright 2023 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
import (
"arena"
"log"
"reflect"
)
func main() {
a := arena.NewArena()
defer a.Free()
const iValue = 10
i := arena.New[int](a)
*i = iValue
if *i != iValue {
// This test doesn't reasonably expect this to fail. It's more likely
// that *i crashes for some reason. Still, why not check it.
log.Fatalf("bad i value: got %d, want %d", *i, iValue)
}
const wantLen = 125
const wantCap = 1912
sl := arena.MakeSlice[*int](a, wantLen, wantCap)
if len(sl) != wantLen {
log.Fatalf("bad arena slice length: got %d, want %d", len(sl), wantLen)
}
if cap(sl) != wantCap {
log.Fatalf("bad arena slice capacity: got %d, want %d", cap(sl), wantCap)
}
sl = sl[:cap(sl)]
for j := range sl {
sl[j] = i
}
for j := range sl {
if *sl[j] != iValue {
// This test doesn't reasonably expect this to fail. It's more likely
// that sl[j] crashes for some reason. Still, why not check it.
log.Fatalf("bad sl[j] value: got %d, want %d", *sl[j], iValue)
}
}
t := reflect.TypeOf(int(0))
v := reflect.ArenaNew(a, t)
if want := reflect.PointerTo(t); v.Type() != want {
log.Fatalf("unexpected type for arena-allocated value: got %s, want %s", v.Type(), want)
}
i2 := v.Interface().(*int)
*i2 = iValue
if *i2 != iValue {
// This test doesn't reasonably expect this to fail. It's more likely
// that *i crashes for some reason. Still, why not check it.
log.Fatalf("bad i2 value: got %d, want %d", *i2, iValue)
}
}