gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

unsafe_array.go (2029B)


      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 }