From d6f02cbd48858cdc95c2de03fc2e6dee3e2fce19 Mon Sep 17 00:00:00 2001 From: Tao Wen Date: Mon, 19 Feb 2018 14:39:57 +0800 Subject: [PATCH] remove sliceHeader --- feature_reflect_native.go | 12 +++--------- feature_reflect_slice.go | 10 +--------- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/feature_reflect_native.go b/feature_reflect_native.go index b0cefc5..6d3a0e6 100644 --- a/feature_reflect_native.go +++ b/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) diff --git a/feature_reflect_slice.go b/feature_reflect_slice.go index bb3958c..5d66238 100644 --- a/feature_reflect_slice.go +++ b/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 {