mirror of
https://github.com/golang/go
synced 2024-09-04 23:44:16 +00:00
![Cuong Manh Le](/assets/img/avatar_default.png)
If slice cap is not set, it will be equal to slice len. So isSmallMakeSlice only needs to check whether slice cap is constant. While at it, also add test to make sure panicmakeslicecap is called when make slice contains invalid non-constant len. For this benchmark: func BenchmarkMakeSliceNonConstantLen(b *testing.B) { len := 1 for i := 0; i < b.N; i++ { s := make([]int, len, 2) _ = s } } Result compare with parent: name old time/op new time/op delta MakeSliceNonConstantLen-12 18.4ns ± 1% 0.2ns ± 2% -98.66% (p=0.008 n=5+5) Fixes #37975 Change-Id: I4bc926361bc2ffeab4cfaa888ef0a30cbc3b80e8 Reviewed-on: https://go-review.googlesource.com/c/go/+/226278 Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Keith Randall <khr@golang.org>
55 lines
979 B
Go
55 lines
979 B
Go
// run
|
|
|
|
// Copyright 2020 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.
|
|
|
|
// Make sure runtime.panicmakeslice* are called.
|
|
|
|
package main
|
|
|
|
import "strings"
|
|
|
|
func main() {
|
|
// Test typechecking passes if len is valid
|
|
// but cap is out of range for len's type.
|
|
var x byte
|
|
_ = make([]int, x, 300)
|
|
|
|
capOutOfRange := func() {
|
|
i := 2
|
|
s := make([]int, i, 1)
|
|
s[0] = 1
|
|
}
|
|
lenOutOfRange := func() {
|
|
i := -1
|
|
s := make([]int, i, 3)
|
|
s[0] = 1
|
|
}
|
|
|
|
tests := []struct {
|
|
f func()
|
|
panicStr string
|
|
}{
|
|
{capOutOfRange, "cap out of range"},
|
|
{lenOutOfRange, "len out of range"},
|
|
}
|
|
|
|
for _, tc := range tests {
|
|
shouldPanic(tc.panicStr, tc.f)
|
|
}
|
|
|
|
}
|
|
|
|
func shouldPanic(str string, f func()) {
|
|
defer func() {
|
|
err := recover()
|
|
runtimeErr := err.(error).Error()
|
|
if !strings.Contains(runtimeErr, str) {
|
|
panic("got panic " + runtimeErr + ", want " + str)
|
|
}
|
|
}()
|
|
|
|
f()
|
|
}
|