From: Russ Cox Date: Mon, 18 Jan 2010 23:59:50 +0000 (-0800) Subject: reflect: fix garbage collection bug in Call. X-Git-Tag: weekly.2010-01-27~85 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=da225c231f77e2cbc1b5eb5e9173aa3a852d35d9;p=gostls13.git reflect: fix garbage collection bug in Call. Fixes #476. R=r CC=golang-dev https://golang.org/cl/190041 --- diff --git a/src/pkg/reflect/value.go b/src/pkg/reflect/value.go index 3c77b879c0..30314ddba5 100644 --- a/src/pkg/reflect/value.go +++ b/src/pkg/reflect/value.go @@ -829,15 +829,19 @@ func (fv *FuncValue) Call(in []Value) []Value { if size < 8 { size = 8 } - args := make([]byte, size) - ptr := uintptr(unsafe.Pointer(&args[0])) + + // round to pointer size + size = (size + ptrSize - 1) &^ (ptrSize - 1) // Copy into args. // // TODO(rsc): revisit when reference counting happens. - // This one may be fine. The values are holding up the - // references for us, so maybe this can be treated - // like any stack-to-stack copy. + // The values are holding up the in references for us, + // but something must be done for the out references. + // For now make everything look like a pointer by pretending + // to allocate a []*int. + args := make([]*int, size/ptrSize) + ptr := uintptr(unsafe.Pointer(&args[0])) off := uintptr(0) delta := 0 if v := fv.first; v != nil {