[dmd-internals] Struct initialization in nested functions
Sean Kelly
sean at invisibleduck.org
Thu Jan 17 12:42:27 PST 2013
Here are three variations of code using the curl client. The first works, the second fails with a segfault, and the third works:
#1
void main() {
auto http = HTTP();
go(http);
}
void go(ref HTTP http) {
// compose request
http.perform();
}
works!
#2
void main() {
HTTP http;
init(http);
go(http);
}
void init(ref HTTP http) {
http = HTTP();
}
void go(ref HTTP http) {
// compose request
http.perform();
}
segfault! (see below)
#3
void main() {
HTTP http;
init(http);
go(http);
}
void init(ref HTTP http) {
http.__ctor(null);
}
void go(ref HTTP http) {
// compose request
http.perform();
}
works!
I'm guessing the segfault in the second case is a compiler bug, but I haven't tried to narrow it down yet. The problem initially came up because I wanted to use the HTTP struct as a class member, and the documented means for initializing it was causing a segfault. Here's the stack trace:
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x00000001000028ec
0x0000000100077803 in D3std3net4curl4HTTP15onReceiveHeaderMFNdDFxAaxAaZvZv12__lambda2026MFxAaZv ()
(gdb) bt
#0 0x0000000100077803 in D3std3net4curl4HTTP15onReceiveHeaderMFNdDFxAaxAaZvZv12__lambda2026MFxAaZv ()
#1 0x0000000100078bfd in D3std3net4curl4Curl15onReceiveHeaderMFNdDFxAaZvZv12__lambda2029MFxAaZv ()
#2 0x0000000100078e75 in _D3std3net4curl4Curl22_receiveHeaderCallbackUxPammPvZm ()
#3 0x00007fff98ed6eb9 in Curl_client_write ()
#4 0x00007fff98ed616f in Curl_http_readwrite_headers ()
#5 0x00007fff98eebe11 in Curl_readwrite ()
#6 0x00007fff98eed709 in Curl_do_perform ()
#7 0x0000000100078a3b in D3std3net4curl4Curl7performMFbZi ()
#8 0x00000001000770f8 in D3std3net4curl4HTTP8_performMFbZi ()
#9 0x0000000100076e9a in D3std3net4curl4HTTP7performMFZv ()
#10 function go(ref HTTP)
#11 function main()
Can someone confirm that either the static opCall method that HTTP uses for initialization is bad and should be changed, or that this is a compiler issue?
More information about the dmd-internals
mailing list