• Matthew Dempsky's avatar
    cmd/compile: fix miscompilation of "defer delete(m, k)" · 2c0c68d6
    Matthew Dempsky authored
    Previously, for slow map key types (i.e., any type other than a 32-bit
    or 64-bit plain memory type), we would rewrite
    
        defer delete(m, k)
    
    into
    
        ktmp := k
        defer delete(m, &ktmp)
    
    However, if the defer statement was inside a loop, we would end up
    reusing the same ktmp value for all of the deferred deletes.
    
    We already rewrite
    
        defer print(x, y, z)
    
    into
    
        defer func(a1, a2, a3) {
            print(a1, a2, a3)
        }(x, y, z)
    
    This CL generalizes this rewrite to also apply for slow map deletes.
    
    This could be extended to apply even more generally to other builtins,
    but as discussed on #24259, there are cases where we must *not* do
    this (e.g., "defer recover()"). However, if we elect to do this more
    generally, this CL should still make that easier.
    
    Lastly, while here, fix a few isues in wrapCall (nee walkprintfunc):
    
    1) lookupN appends the generation number to the symbol anyway, so "%d"
    was being literally included in the generated function names.
    
    2) walkstmt will be called when the function is compiled later anyway,
    so no need to do it now.
    
    Fixes #24259.
    
    Change-Id: I70286867c64c69c18e9552f69e3f4154a0fc8b04
    Reviewed-on: https://go-review.googlesource.com/99017
    Run-TryBot: Matthew Dempsky <mdempsky@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
    2c0c68d6
Name
Last commit
Last update
..
archive Loading commit data...
bufio Loading commit data...
builtin Loading commit data...
bytes Loading commit data...
cmd Loading commit data...
compress Loading commit data...
container Loading commit data...
context Loading commit data...
crypto Loading commit data...
database/sql Loading commit data...
debug Loading commit data...
encoding Loading commit data...
errors Loading commit data...
expvar Loading commit data...
flag Loading commit data...
fmt Loading commit data...
go Loading commit data...
hash Loading commit data...
html Loading commit data...
image Loading commit data...
index/suffixarray Loading commit data...
internal Loading commit data...
io Loading commit data...
log Loading commit data...
math Loading commit data...
mime Loading commit data...
net Loading commit data...
os Loading commit data...
path Loading commit data...
plugin Loading commit data...
reflect Loading commit data...
regexp Loading commit data...
runtime Loading commit data...
sort Loading commit data...
strconv Loading commit data...
strings Loading commit data...
sync Loading commit data...
syscall Loading commit data...
testing Loading commit data...
text Loading commit data...
time Loading commit data...
unicode Loading commit data...
unsafe Loading commit data...
vendor/golang_org/x Loading commit data...
Make.dist Loading commit data...
all.bash Loading commit data...
all.bat Loading commit data...
all.rc Loading commit data...
androidtest.bash Loading commit data...
bootstrap.bash Loading commit data...
buildall.bash Loading commit data...
clean.bash Loading commit data...
clean.bat Loading commit data...
clean.rc Loading commit data...
cmp.bash Loading commit data...
iostest.bash Loading commit data...
make.bash Loading commit data...
make.bat Loading commit data...
make.rc Loading commit data...
naclmake.bash Loading commit data...
nacltest.bash Loading commit data...
race.bash Loading commit data...
race.bat Loading commit data...
run.bash Loading commit data...
run.bat Loading commit data...
run.rc Loading commit data...