Browse Source

codec: rvGetArray4Slice should not allocate

Ugorji Nwoke 6 years ago
parent
commit
07000b7fdf
1 changed files with 12 additions and 3 deletions
  1. 12 3
      codec/helper_unsafe.go

+ 12 - 3
codec/helper_unsafe.go

@@ -533,12 +533,21 @@ func rvGetArrayBytesRO(rv reflect.Value, scratch []byte) (bs []byte) {
 }
 }
 
 
 func rvGetArray4Slice(rv reflect.Value) (v reflect.Value) {
 func rvGetArray4Slice(rv reflect.Value) (v reflect.Value) {
-	v = rvZeroAddrK(reflectArrayOf(rvGetSliceLen(rv), rv.Type().Elem()), reflect.Array)
-	// xdebugf("rvGetArray4Slice: b4 copy: rv: %#v, v: %#v", rv, v)
 	urv := (*unsafeReflectValue)(unsafe.Pointer(&rv))
 	urv := (*unsafeReflectValue)(unsafe.Pointer(&rv))
+	t := reflectArrayOf(rvGetSliceLen(rv), rv.Type().Elem()) // TODO: Len or Cap???
 	uv := (*unsafeReflectValue)(unsafe.Pointer(&v))
 	uv := (*unsafeReflectValue)(unsafe.Pointer(&v))
+	uv.flag = uintptr(reflect.Array) | unsafeFlagIndir | unsafeFlagAddr
+	uv.typ = ((*unsafeIntf)(unsafe.Pointer(&t))).word
 	uv.ptr = *(*unsafe.Pointer)(urv.ptr) // slice rv has a ptr to the slice.
 	uv.ptr = *(*unsafe.Pointer)(urv.ptr) // slice rv has a ptr to the slice.
-	// xdebugf("rvGetArray4Slice: after copy: v: %#v", v)
+
+	// t := reflectArrayOf(rvGetSliceLen(rv), rv.Type().Elem())
+	// v = rvZeroAddrK(t, reflect.Array)
+	// // xdebugf("rvGetArray4Slice: b4 copy: rv: %#v, v: %#v", rv, v)
+	// urv := (*unsafeReflectValue)(unsafe.Pointer(&rv))
+	// uv := (*unsafeReflectValue)(unsafe.Pointer(&v))
+	// uv.ptr = *(*unsafe.Pointer)(urv.ptr) // slice rv has a ptr to the slice.
+	// // xdebugf("rvGetArray4Slice: after copy: v: %#v", v)
+
 	return
 	return
 }
 }