growslice.go raw

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