unsafe_array.go raw

   1  package reflect2
   2  
   3  import (
   4  	"reflect"
   5  	"unsafe"
   6  )
   7  
   8  type UnsafeArrayType struct {
   9  	unsafeType
  10  	elemRType  unsafe.Pointer
  11  	pElemRType unsafe.Pointer
  12  	elemSize   uintptr
  13  	likePtr    bool
  14  }
  15  
  16  func newUnsafeArrayType(cfg *frozenConfig, type1 reflect.Type) *UnsafeArrayType {
  17  	return &UnsafeArrayType{
  18  		unsafeType: *newUnsafeType(cfg, type1),
  19  		elemRType:  unpackEFace(type1.Elem()).data,
  20  		pElemRType: unpackEFace(reflect.PtrTo(type1.Elem())).data,
  21  		elemSize:   type1.Elem().Size(),
  22  		likePtr:    likePtrType(type1),
  23  	}
  24  }
  25  
  26  func (type2 *UnsafeArrayType) LikePtr() bool {
  27  	return type2.likePtr
  28  }
  29  
  30  func (type2 *UnsafeArrayType) Indirect(obj interface{}) interface{} {
  31  	objEFace := unpackEFace(obj)
  32  	assertType("Type.Indirect argument 1", type2.ptrRType, objEFace.rtype)
  33  	return type2.UnsafeIndirect(objEFace.data)
  34  }
  35  
  36  func (type2 *UnsafeArrayType) UnsafeIndirect(ptr unsafe.Pointer) interface{} {
  37  	if type2.likePtr {
  38  		return packEFace(type2.rtype, *(*unsafe.Pointer)(ptr))
  39  	}
  40  	return packEFace(type2.rtype, ptr)
  41  }
  42  
  43  func (type2 *UnsafeArrayType) SetIndex(obj interface{}, index int, elem interface{}) {
  44  	objEFace := unpackEFace(obj)
  45  	assertType("ArrayType.SetIndex argument 1", type2.ptrRType, objEFace.rtype)
  46  	elemEFace := unpackEFace(elem)
  47  	assertType("ArrayType.SetIndex argument 3", type2.pElemRType, elemEFace.rtype)
  48  	type2.UnsafeSetIndex(objEFace.data, index, elemEFace.data)
  49  }
  50  
  51  func (type2 *UnsafeArrayType) UnsafeSetIndex(obj unsafe.Pointer, index int, elem unsafe.Pointer) {
  52  	elemPtr := arrayAt(obj, index, type2.elemSize, "i < s.Len")
  53  	typedmemmove(type2.elemRType, elemPtr, elem)
  54  }
  55  
  56  func (type2 *UnsafeArrayType) GetIndex(obj interface{}, index int) interface{} {
  57  	objEFace := unpackEFace(obj)
  58  	assertType("ArrayType.GetIndex argument 1", type2.ptrRType, objEFace.rtype)
  59  	elemPtr := type2.UnsafeGetIndex(objEFace.data, index)
  60  	return packEFace(type2.pElemRType, elemPtr)
  61  }
  62  
  63  func (type2 *UnsafeArrayType) UnsafeGetIndex(obj unsafe.Pointer, index int) unsafe.Pointer {
  64  	return arrayAt(obj, index, type2.elemSize, "i < s.Len")
  65  }
  66