From 3a3de8a7780934194bea83a0e242038e45274f06 Mon Sep 17 00:00:00 2001 From: Damian Gryski Date: Tue, 28 Feb 2023 09:07:26 -0800 Subject: [PATCH] reflect: add pointerTo() --- src/reflect/type.go | 10 ++++++++-- src/reflect/value.go | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/reflect/type.go b/src/reflect/type.go index 4b486459..66ee4868 100644 --- a/src/reflect/type.go +++ b/src/reflect/type.go @@ -452,13 +452,19 @@ func TypeOf(i interface{}) Type { func PtrTo(t Type) Type { return PointerTo(t) } func PointerTo(t Type) Type { + return pointerTo(t.(*rawType)) +} + +func pointerTo(t *rawType) *rawType { switch t.Kind() { case Pointer: + // TODO(dgryski): This is blocking https://github.com/tinygo-org/tinygo/issues/3131 + // We need to be able to create types that match existing types to prevent typecode equality. panic("reflect: cannot make **T type") case Struct: - return (*structType)(unsafe.Pointer(t.(*rawType))).ptrTo + return (*structType)(unsafe.Pointer(t)).ptrTo default: - return (*elemType)(unsafe.Pointer(t.(*rawType))).ptrTo + return (*elemType)(unsafe.Pointer(t)).ptrTo } } diff --git a/src/reflect/value.go b/src/reflect/value.go index 0e856f8f..e6c039f0 100644 --- a/src/reflect/value.go +++ b/src/reflect/value.go @@ -1017,7 +1017,7 @@ func Zero(typ Type) Value { // new value of the given type. func New(typ Type) Value { return Value{ - typecode: PtrTo(typ).(*rawType), + typecode: pointerTo(typ.(*rawType)), value: alloc(typ.Size(), nil), flags: valueFlagExported, }