growslice.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536
  1. // +build go1.20
  2. /*
  3. * Copyright 2021 ByteDance Inc.
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. */
  17. package rt
  18. import "unsafe"
  19. // Growslice to newCap, not append length
  20. // Note: the [old, newCap) will not be zeroed if et does not have any ptr data.
  21. func GrowSlice(et *GoType, old GoSlice, newCap int) GoSlice {
  22. if newCap < old.Len {
  23. panic("growslice's newCap is smaller than old length")
  24. }
  25. s := growslice(old.Ptr, newCap, old.Cap, newCap - old.Len, et)
  26. s.Len = old.Len
  27. return s
  28. }
  29. //go:linkname growslice runtime.growslice
  30. //goland:noinspection GoUnusedParameter
  31. func growslice(oldPtr unsafe.Pointer, newLen, oldCap, num int, et *GoType) GoSlice