Name |
Last commit
|
Last update |
---|---|---|
.. | ||
config | ||
go | ||
runtime | ||
testsuite | ||
LICENSE | ||
MERGE | ||
Makefile.am | ||
Makefile.in | ||
PATENTS | ||
README | ||
README.gcc | ||
aclocal.m4 | ||
config.h.in | ||
configure | ||
configure.ac | ||
godeps.sh | ||
merge.sh | ||
mksysinfo.sh |
The Go frontend passes closures through to functions using the functions __go_set_closure and __go_get_closure. The expectation is that there are no function calls between set_closure and get_closure. However, it turns out that there can be function calls if some of the function arguments require type conversion to an interface type. Converting to an interface type can allocate memory, and that can in turn trigger a garbage collection, and that can in turn call pool cleanup functions that may call __go_set_closure. So the called function can see the wrong closure value, which is bad. This patch fixes the problem in two different ways. First, we move all type conversions in function arguments into temporary variables so that they can not appear before the call to __go_set_closure. (This required shifting the flatten phase after the simplify_thunk phase, since the latter expects to work with unconverted argument types.) Second, we fix the memory allocation function to preserve the closure value across any possible garbage collection. A test case is the libgo database/sql check run with the environment variable GOGC set to 1. From-SVN: r213932
Name |
Last commit
|
Last update |
---|---|---|
.. | ||
config | Loading commit data... | |
go | Loading commit data... | |
runtime | Loading commit data... | |
testsuite | Loading commit data... | |
LICENSE | Loading commit data... | |
MERGE | Loading commit data... | |
Makefile.am | Loading commit data... | |
Makefile.in | Loading commit data... | |
PATENTS | Loading commit data... | |
README | Loading commit data... | |
README.gcc | Loading commit data... | |
aclocal.m4 | Loading commit data... | |
config.h.in | Loading commit data... | |
configure | Loading commit data... | |
configure.ac | Loading commit data... | |
godeps.sh | Loading commit data... | |
merge.sh | Loading commit data... | |
mksysinfo.sh | Loading commit data... |