From b485e8bfbd2c08a2db2d3a17a993054b7a2c4dde Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Wed, 31 Aug 2022 23:02:17 +0200 Subject: [PATCH] compiler: fix unsafe.Sizeof for chan and map values These types are simply pointers. For some reason, they were never implemented. Fixes https://github.com/tinygo-org/tinygo/issues/3083. --- compiler/sizes.go | 2 +- testdata/reflect.go | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/compiler/sizes.go b/compiler/sizes.go index 5f28f161..d19d634c 100644 --- a/compiler/sizes.go +++ b/compiler/sizes.go @@ -152,7 +152,7 @@ func (s *stdSizes) Sizeof(T types.Type) int64 { return align(offsets[n-1]+s.Sizeof(fields[n-1].Type()), maxAlign) case *types.Interface: return s.PtrSize * 2 - case *types.Pointer: + case *types.Pointer, *types.Chan, *types.Map: return s.PtrSize case *types.Signature: // Func values in TinyGo are two words in size. diff --git a/testdata/reflect.go b/testdata/reflect.go index f36fcca7..4524cc1a 100644 --- a/testdata/reflect.go +++ b/testdata/reflect.go @@ -175,6 +175,8 @@ func main() { assertSize(reflect.TypeOf("").Size() == unsafe.Sizeof(""), "string") assertSize(reflect.TypeOf(new(int)).Size() == unsafe.Sizeof(new(int)), "*int") assertSize(reflect.TypeOf(zeroFunc).Size() == unsafe.Sizeof(zeroFunc), "func()") + assertSize(reflect.TypeOf(zeroChan).Size() == unsafe.Sizeof(zeroChan), "chan int") + assertSize(reflect.TypeOf(zeroMap).Size() == unsafe.Sizeof(zeroMap), "map[string]int") // make sure embedding a zero-sized "not comparable" struct does not add size to a struct assertSize(reflect.TypeOf(doNotCompare{}).Size() == unsafe.Sizeof(doNotCompare{}), "[0]func()")