From 39f76f43fc647061a22571950ca2725f70ebd0c4 Mon Sep 17 00:00:00 2001 From: Damian Gryski Date: Wed, 22 Mar 2023 10:12:42 -0700 Subject: [PATCH] reflect: fix indirect issues with makeInt/makeUint/makeFloat --- src/reflect/value.go | 55 ++++++++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/src/reflect/value.go b/src/reflect/value.go index 2cbd4a7c..53bd573b 100644 --- a/src/reflect/value.go +++ b/src/reflect/value.go @@ -1235,7 +1235,18 @@ func cvtBytesString(v Value, t *rawType) Value { func makeInt(flags valueFlags, bits uint64, t *rawType) Value { size := t.Size() - ptr := alloc(size, nil) + + v := Value{ + typecode: t, + flags: flags, + } + + ptr := unsafe.Pointer(&v.value) + if size > unsafe.Sizeof(uintptr(0)) { + ptr = alloc(size, nil) + v.value = ptr + } + switch size { case 1: *(*uint8)(ptr) = uint8(bits) @@ -1246,38 +1257,38 @@ func makeInt(flags valueFlags, bits uint64, t *rawType) Value { case 8: *(*uint64)(ptr) = bits } - return Value{ - typecode: t, - value: ptr, - flags: flags | valueFlagIndirect, - } + return v } -func makeFloat(flags valueFlags, v float64, t *rawType) Value { +func makeFloat(flags valueFlags, f float64, t *rawType) Value { size := t.Size() - ptr := alloc(size, nil) + + v := Value{ + typecode: t, + flags: flags, + } + + ptr := unsafe.Pointer(&v.value) + if size > unsafe.Sizeof(uintptr(0)) { + ptr = alloc(size, nil) + } + switch size { case 4: - *(*float32)(ptr) = float32(v) + *(*float32)(ptr) = float32(f) case 8: - *(*float64)(ptr) = v - } - return Value{ - typecode: t, - value: ptr, - flags: flags | valueFlagIndirect, + *(*float64)(ptr) = f } + return v } -func makeFloat32(flags valueFlags, v float32, t *rawType) Value { - size := t.Size() - ptr := alloc(size, nil) - *(*float32)(ptr) = float32(v) - return Value{ +func makeFloat32(flags valueFlags, f float32, t *rawType) Value { + v := Value{ typecode: t, - value: ptr, - flags: flags | valueFlagIndirect, + flags: flags, } + *(*float32)(unsafe.Pointer(&v.value)) = float32(f) + return v } func cvtIntString(src Value, t *rawType) Value {