Array allocation on struct initialization

Benjamin Thaut code at benjamin-thaut.de
Thu Dec 29 09:13:51 PST 2011


I'm currently trying to make a nongc safe version of the d-runtime and 
stumbeled on my favorite WTF moment so far:

The following programm:

struct MemoryBlockInfo
{
   size_t size;
   long[10] backtrace;
   int backtraceSize;

   this(size_t size)
   {
     this.size = size;
   }
}

int main(string[] argv)
{
   MemoryBlockInfo info;
   info = MemoryBlockInfo.init;
}

This produces the following disassembly:
0040385A  mov         dword ptr [info],eax
0040385D  push        0Ah
0040385F  mov         ecx,offset TypeInfo_G10l at __init (41E260h)
00403864  push        ecx
00403865  call        rt at lifetime@_d_arrayliteralTX (404664h)
0040386A  mov         dword ptr [_TMP0],eax
0040386D  mov         dword ptr [eax],0
00403873  mov         dword ptr [eax+4],0
0040387A  mov         dword ptr [eax+8],0
00403881  mov         dword ptr [eax+0Ch],0
00403888  mov         dword ptr [eax+10h],0
0040388F  mov         dword ptr [eax+14h],0
00403896  mov         dword ptr [eax+18h],0
0040389D  mov         dword ptr [eax+1Ch],0
004038A4  mov         dword ptr [eax+20h],0
004038AB  mov         dword ptr [eax+24h],0
004038B2  mov         dword ptr [eax+28h],0

Why in hell is there a call to rt.lieftime._d_arrayliteralTX ???
I always thought that the init data is some global immutable data block 
that never changes thorughout the program execution, so why does it need 
to be copied? With behaviour like this it is pretty much impossible to 
make a nongc safe version of D at all.

Is this a compiler bug or intended behaviour?
-- 
Kind Regards
Benjamin Thaut


More information about the Digitalmars-d mailing list