mirror of https://github.com/golang/go.git
runtime: fix syscall.NewCallback to return all bits for uintptr values
syscall.NewCallback mistakenly used MOVL even for windows/amd64, which only returned the lower 32 bits regardless of the architecture. This was due to a copy and paste after porting from windows/386. The code now uses MOVQ, which will return all the available bits. Also adjust TestReturnAfterStackGrowInCallback to ensure we never regress. Fixes #29331 Change-Id: I4f5c8021c33f234c2bb7baa9ef7a6b4870172509 Reviewed-on: https://go-review.googlesource.com/c/159579 Run-TryBot: Emmanuel Odeke <emm.odeke@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Emmanuel Odeke <emm.odeke@gmail.com> Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
parent
c97e576576
commit
5cf4e442a5
|
|
@ -351,7 +351,7 @@ TEXT runtime·callbackasm1(SB),NOSPLIT,$0
|
|||
ADDQ $64, SP
|
||||
POPFQ
|
||||
|
||||
MOVL -8(CX)(DX*1), AX // return value
|
||||
MOVQ -8(CX)(DX*1), AX // return value
|
||||
POPQ -8(CX)(DX*1) // restore bytes just after the args
|
||||
RET
|
||||
|
||||
|
|
|
|||
|
|
@ -655,12 +655,16 @@ uintptr_t cfunc(callback f, uintptr_t n) {
|
|||
r uintptr
|
||||
err syscall.Errno
|
||||
}
|
||||
want := result{
|
||||
// Make it large enough to test issue #29331.
|
||||
r: (^uintptr(0)) >> 24,
|
||||
err: 333,
|
||||
}
|
||||
c := make(chan result)
|
||||
go func() {
|
||||
r, _, err := proc.Call(cb, 100)
|
||||
r, _, err := proc.Call(cb, want.r)
|
||||
c <- result{r, err.(syscall.Errno)}
|
||||
}()
|
||||
want := result{r: 100, err: 333}
|
||||
if got := <-c; got != want {
|
||||
t.Errorf("got %d want %d", got, want)
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue