Bladeren bron

remove sliceHeader

Tao Wen 7 jaren geleden
bovenliggende
commit
d6f02cbd48
2 gewijzigde bestanden met toevoegingen van 4 en 18 verwijderingen
  1. 3 9
      feature_reflect_native.go
  2. 1 9
      feature_reflect_slice.go

+ 3 - 9
feature_reflect_native.go

@@ -493,15 +493,13 @@ func (codec *jsoniterRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool {
 }
 
 type base64Codec struct {
+	sliceType *reflect2.UnsafeSliceType
 	sliceDecoder ValDecoder
 }
 
 func (codec *base64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) {
 	if iter.ReadNil() {
-		ptrSlice := (*sliceHeader)(ptr)
-		ptrSlice.Len = 0
-		ptrSlice.Cap = 0
-		ptrSlice.Data = nil
+		codec.sliceType.UnsafeSetNil(ptr)
 		return
 	}
 	switch iter.WhatIsNext() {
@@ -516,11 +514,7 @@ func (codec *base64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) {
 			iter.ReportError("decode base64", err.Error())
 		} else {
 			dst = dst[:len]
-			dstSlice := (*sliceHeader)(unsafe.Pointer(&dst))
-			ptrSlice := (*sliceHeader)(ptr)
-			ptrSlice.Data = dstSlice.Data
-			ptrSlice.Cap = dstSlice.Cap
-			ptrSlice.Len = dstSlice.Len
+			codec.sliceType.UnsafeSet(ptr, unsafe.Pointer(&dst))
 		}
 	case ArrayValue:
 		codec.sliceDecoder.Decode(ptr, iter)

+ 1 - 9
feature_reflect_slice.go

@@ -49,8 +49,7 @@ func (encoder *sliceEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
 }
 
 func (encoder *sliceEncoder) IsEmpty(ptr unsafe.Pointer) bool {
-	slice := (*sliceHeader)(ptr)
-	return slice.Len == 0
+	return encoder.sliceType.UnsafeLengthOf(ptr) == 0
 }
 
 type sliceDecoder struct {
@@ -58,13 +57,6 @@ type sliceDecoder struct {
 	elemDecoder ValDecoder
 }
 
-// sliceHeader is a safe version of SliceHeader used within this package.
-type sliceHeader struct {
-	Data unsafe.Pointer
-	Len  int
-	Cap  int
-}
-
 func (decoder *sliceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
 	decoder.doDecode(ptr, iter)
 	if iter.Error != nil && iter.Error != io.EOF {