]> Cypherpunks repositories - gostls13.git/commit
reflect: fix more issues with StructOf GC programs
authorKeith Randall <khr@google.com>
Wed, 6 Mar 2019 22:45:47 +0000 (14:45 -0800)
committerKeith Randall <khr@golang.org>
Thu, 7 Mar 2019 00:06:12 +0000 (00:06 +0000)
commit9dc3b8b722ec93a3cd16742764a29cb3f908edbe
tree88fb0fdc69cd5f1dfa503cd455f5a420bdd95f1c
parente269f4ce01c458b53975fe666261b4be13160773
reflect: fix more issues with StructOf GC programs

First the insidious bug:

  var n uintptr
  for n := elemPtrs; n > 120; n -= 120 {
    prog = append(prog, 120)
    prog = append(prog, mask[:15]...)
    mask = mask[15:]
  }
  prog = append(prog, byte(n))
  prog = append(prog, mask[:(n+7)/8]...)

The := breaks this code, because the n after the loop is always 0!

We also do need to handle field padding correctly. In particular
the old padding code doesn't correctly handle fields that are not
a multiple of a pointer in size.

Fixes #30606.

Change-Id: Ifcab9494dc25c20116753c5d7e0145d6c2053ed8
Reviewed-on: https://go-review.googlesource.com/c/go/+/165860
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/reflect/type.go
test/fixedbugs/issue30606b.go [new file with mode: 0644]