1
0
mirror of https://github.com/golang/go synced 2024-11-24 15:30:13 -07:00
go/test
Austin Clements d5bd797ee5 runtime: fix getArgInfo for deferred reflection calls
getArgInfo for reflect.makeFuncStub and reflect.methodValueCall is
necessarily special. These have dynamically determined argument maps
that are stored in their context (that is, their *funcval). These
functions are written to store this context at 0(SP) when called, and
getArgInfo retrieves it from there.

This technique works if getArgInfo is passed an active call frame for
one of these functions. However, getArgInfo is also used in
tracebackdefers, where the "call" is not a true call with an active
stack frame, but a deferred call. In this situation, getArgInfo
currently crashes because tracebackdefers passes a frame with sp set
to 0. However, the entire approach used by getArgInfo is flawed in
this situation because the wrapper has not actually executed, and
hence hasn't saved this metadata to any stack frame.

In the defer case, we know the *funcval from the _defer itself, so we
can fix this by teaching getArgInfo to use the *funcval context
directly when its available, and otherwise get it from the active call
frame.

While we're here, this commit simplifies getArgInfo a bit by making it
play more nicely with the type system. Rather than decoding the
*reflect.methodValue that is the wrapper's context as a *[2]uintptr,
just write out a copy of the reflect.methodValue type in the runtime.

Fixes #16331. Fixes #17471.

Change-Id: I81db4d985179b4a81c68c490cceeccbfc675456a
Reviewed-on: https://go-review.googlesource.com/31138
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
2016-10-17 18:57:01 +00:00
..
bench
bugs
chan
ddd2.dir
dwarf
fixedbugs runtime: fix getArgInfo for deferred reflection calls 2016-10-17 18:57:01 +00:00
import2.dir
import4.dir
interface cmd/compile: inline x, ok := y.(T) where T is a scalar 2016-08-17 01:12:01 +00:00
intrinsic.dir cmd/compile: intrinsify Ctz, Bswap on ARM 2016-09-12 19:26:31 +00:00
ken
method4.dir
safe
stress
syntax cmd/compile/internal/syntax: match old parser errors and line numbers 2016-08-19 01:10:21 +00:00
uintptrescapes.dir cmd/compile, syscall: add //go:uintptrescapes comment, and use it 2016-07-06 20:48:41 +00:00
64bit.go
235.go
alg.go
alias1.go
alias.go
append.go
args.go
assign1.go
assign.go
atomicload.go
bigalg.go
bigmap.go
blank1.go
blank.go
bom.go
bombad.go
bounds.go
chancap.go
chanlinear.go
char_lit1.go
char_lit.go
checkbce.go cmd/compile: optimize integer "in range" expressions 2016-08-25 03:49:16 +00:00
clearfat.go
closedchan.go
closure1.go
closure2.go
closure.go
cmp6.go
cmp.go
cmplx.go
cmplxdivide1.go
cmplxdivide.c
cmplxdivide.go
complit1.go
complit.go
compos.go
const1.go
const2.go
const3.go
const4.go
const5.go
const6.go
const.go cmd/compile: fix compiler bug for constant equality comparison 2016-09-17 01:12:24 +00:00
convert1.go
convert2.go cmd/compile: ignore struct tags when converting structs 2016-10-04 17:10:47 +00:00
convert3.go
convert.go
convlit1.go
convlit.go
convT2X.go
copy.go
crlf.go
ddd1.go
ddd2.go
ddd.go
decl.go
declbad.go
defer.go
deferfin.go
deferprint.go
deferprint.out
divide.go
divmod.go
empty.go
env.go
eof1.go
eof.go
errchk cmd/vet: make checking example names in _test packages more robust 2016-06-28 22:09:00 +00:00
escape2.go
escape2n.go
escape3.go
escape4.go
escape5.go
escape_array.go
escape_because.go
escape_calls.go
escape_closure.go
escape_field.go
escape_iface.go cmd/compile: avoid leak of dottype expression on double assignment form 2016-10-10 12:09:16 +00:00
escape_indir.go
escape_level.go
escape_map.go
escape_param.go
escape_slice.go
escape_struct_param1.go
escape_struct_param2.go
escape_struct_return.go
escape.go
fibo.go
finprofiled.go
float_lit2.go test/float_lit2: fix expressions in comment 2016-09-14 16:39:47 +00:00
float_lit3.go
float_lit.go
floatcmp.go
for.go
func1.go
func2.go
func3.go
func4.go
func5.go
func6.go
func7.go
func8.go
func.go
funcdup2.go
funcdup.go
gc1.go
gc2.go
gc.go
gcstring.go
goprint.go
goprint.out
goto.go
heapsampling.go
helloworld.go
helloworld.out
if.go
import1.go
import2.go
import4.go
import5.go
import.go
index0.go
index1.go
index2.go
index.go
indirect1.go
indirect.go
init1.go
init.go
initcomma.go
initialize.go
initializerr.go
initloop.go
inline.go
int_lit.go
intcvt.go
intrinsic_atomic.go cmd/compile: intrinsify Ctz, Bswap on ARM 2016-09-12 19:26:31 +00:00
intrinsic.go cmd/compile: intrinsify Ctz{32,64} and Bswap{32,64} on s390x 2016-09-19 19:03:01 +00:00
iota.go
label1.go
label.go
linkmain_run.go
linkmain.go
linkobj.go
linkx_run.go
linkx.go
literal.go
live1.go
live2.go test: re-enable live2 test on amd64 2016-10-07 17:34:02 +00:00
live_syscall.go
live.go cmd/compile,runtime: redo how map assignments work 2016-10-12 20:41:23 +00:00
loopbce.go
mallocfin.go
map1.go
map.go
maplinear.go
method1.go
method2.go
method3.go
method4.go
method5.go
method.go
named1.go
named.go
nil.go
nilcheck.go
nilptr2.go
nilptr3.go cmd/compile: re-enable nilcheck removal for newobject 2016-09-28 19:41:49 +00:00
nilptr4.go
nilptr.go
nosplit.go cmd/compile: ppc64le working, not optimized enough 2016-08-18 16:34:47 +00:00
notinheap2.go cmd/compile: add go:notinheap type pragma 2016-10-15 17:58:14 +00:00
notinheap.go cmd/compile: add go:notinheap type pragma 2016-10-15 17:58:14 +00:00
nowritebarrier.go cmd/compile, runtime: add go:yeswritebarrierrec pragma 2016-10-15 17:58:11 +00:00
nul1.go cmd/compile/internal/syntax: match old parser errors and line numbers 2016-08-19 01:10:21 +00:00
opt_branchlikely.go
parentype.go
peano.go
phiopt.go test: re-enable phi optimization test 2016-09-13 20:06:13 +00:00
print.go
print.out
printbig.go
printbig.out
prove.go cmd/compile: unroll comparisons to short constant strings 2016-09-15 15:37:00 +00:00
range.go
recover1.go
recover2.go
recover3.go
recover4.go
recover.go
reflectmethod1.go
reflectmethod2.go
reflectmethod3.go
reflectmethod4.go
rename1.go
rename.go
reorder2.go
reorder.go
return.go
rotate0.go
rotate1.go
rotate2.go
rotate3.go
rotate.go
run.go test: errorcheck auto-generated functions 2016-09-22 20:10:30 +00:00
rune.go
runtime.go
shift1.go
shift2.go
sieve.go
sigchld.go
sigchld.out
simassign.go
sinit_run.go
sinit.go
sizeof.go
slice3.go
slice3err.go
slicecap.go
solitaire.go
stack.go
strength.go
string_lit.go
stringrange.go
struct0.go
switch2.go cmd/compile/internal/syntax: match old parser errors and line numbers 2016-08-19 01:10:21 +00:00
switch3.go
switch4.go
switch5.go cmd/compile: use a map to track const switch cases 2016-08-23 05:28:33 +00:00
switch6.go cmd/compile: set correct line number for multiple defaults in switch error 2016-08-22 19:56:06 +00:00
switch.go
tinyfin.go
torture.go
turing.go
typecheck.go
typecheckloop.go
typeswitch1.go
typeswitch2.go
typeswitch3.go
typeswitch.go
uintptrescapes2.go cmd/compile: args no longer live until end-of-function 2016-09-19 16:54:35 +00:00
uintptrescapes.go cmd/compile, syscall: add //go:uintptrescapes comment, and use it 2016-07-06 20:48:41 +00:00
undef.go
utf.go
varerr.go
varinit.go
writebarrier.go
zerodivide.go