mirror of
https://github.com/golang/go
synced 2024-09-05 16:04:50 +00:00
![Michael Anthony Knyszek](/assets/img/avatar_default.png)
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>
66 lines
1.6 KiB
Go
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)
|
|
}
|
|
}
|