Creeping Bloat in Phobos

Walter Bright via Digitalmars-d digitalmars-d at puremagic.com
Sat Sep 27 13:57:58 PDT 2014


 From time to time, I take a break from bugs and enhancements and just look at 
what some piece of code is actually doing. Sometimes, I'm appalled. Phobos, for 
example, should be a lean and mean fighting machine:

 
http://www.nbcnews.com/id/38545625/ns/technology_and_science-science/t/king-tuts-chariots-were-formula-one-cars/#.VCceNmd0xjs

Instead, we have something more akin to:

 
http://untappedcities.com/2012/10/31/roulez-carrosses-carriages-of-versailles-arrive-in-arras/

More specifically, I looked at std.file.copy():

   https://github.com/D-Programming-Language/phobos/blob/master/std/file.d

Which is 3 lines of code:

   void copy(in char[] from, in char[] to) {
         immutable result = CopyFileW(from.tempCStringW(), to.tempCStringW(), 
false);
         if (!result)
             throw new FileException(to.idup);
   }

Compiling this code for Windows produces the rather awful:

_D3std4file4copyFxAaxAaZv       comdat
         assume  CS:_D3std4file4copyFxAaxAaZv
L0:             push    EBP
                 mov     EBP,ESP
                 mov     EDX,FS:__except_list
                 push    0FFFFFFFFh
                 lea     EAX,-0220h[EBP]
                 push    offset _D3std4file4copyFxAaxAaZv[0106h]
                 push    EDX
                 mov     FS:__except_list,ESP
                 sub     ESP,8
                 sub     ESP,041Ch
                 push    0
                 push    dword ptr 0Ch[EBP]
                 push    dword ptr 8[EBP]
                 call    near ptr 
_D3std8internal7cstring21__T11tempCSÇàÆTuTaZÇìÆFNbNixAaZSÇ┬├3Res
                 mov     dword ptr -4[EBP],0
                 lea     EAX,-0220h[EBP]
                 call    near ptr 
_D3std8internal7cstring21__T11tempCStringTuTaZ11tempCStringFNbNixAaZ3Res3ptrMxFNaNbNdNiNfZPxu
                 push    EAX
                 lea     EAX,-0430h[EBP]
                 push    dword ptr 014h[EBP]
                 push    dword ptr 010h[EBP]
                 call    near ptr 
_D3std8internal7cstring21__T11tempCSÇàÆTuTaZÇìÆFNbNixAaZSÇ┬├3Res
                 mov     dword ptr -4[EBP],1
                 lea     EAX,-0430h[EBP]
                 call    near ptr 
_D3std8internal7cstring21__T11tempCStringTuTaZ11tempCStringFNbNixAaZ3Res3ptrMxFNaNbNdNiNfZPxu
                 push    EAX
                 call    dword ptr __imp__CopyFileW at 12
                 mov     -01Ch[EBP],EAX
                 mov     dword ptr -4[EBP],0
                 call    near ptr L83
                 jmp short       L8F
L83:            lea     EAX,-0220h[EBP]
                 call    near ptr 
_D3std8internal7cstring21__T11tempCStringTuTaZ11tempCStringFNbNixAaZ3Res6__dtorMFNbNiZv
                 ret
L8F:            mov     dword ptr -4[EBP],0FFFFFFFFh
                 call    near ptr L9D
                 jmp short       LA9
L9D:            lea     EAX,-0430h[EBP]
                 call    near ptr 
_D3std8internal7cstring21__T11tempCStringTuTaZ11tempCStringFNbNixAaZ3Res6__dtorMFNbNiZv
                 ret
LA9:            cmp     dword ptr -01Ch[EBP],0
                 jne     LF3
                 mov     ECX,offset FLAT:_D3std4file13FileException7__ClassZ
                 push    ECX
                 call    near ptr __d_newclass
                 add     ESP,4
                 push    dword ptr 0Ch[EBP]
                 mov     -018h[EBP],EAX
                 push    dword ptr 8[EBP]
                 call    near ptr _D6object12__T4idupTxaZ4idupFNaNbNdNfAxaZAya
                 push    EDX
                 push    EAX
                 call    dword ptr __imp__GetLastError at 0
                 push    EAX
                 push    dword ptr _D3std4file13FileException6__vtblZ[02Ch]
                 push    dword ptr _D3std4file13FileException6__vtblZ[028h]
                 push    095Dh
                 mov     EAX,-018h[EBP]
                 call    near ptr 
_D3std4file13FileException6__ctorMFNfxAakAyakZC3std4file13FileException
                 push    EAX
                 call    near ptr __d_throwc
LF3:            mov     ECX,-0Ch[EBP]
                 mov     FS:__except_list,ECX
                 mov     ESP,EBP
                 pop     EBP
                 ret     010h
                 mov     EAX,offset FLAT:_D3std4file13FileException6__vtblZ[0310h]
                 jmp     near ptr __d_framehandler

which is TWICE as much generated code as for D1's copy(), which does the same 
thing. No, it is not because D2's compiler sux. It's because it has become 
encrustified with gee-gaws, jewels, decorations, and other crap.

To scrape the barnacles off, I've filed:

https://issues.dlang.org/show_bug.cgi?id=13541
https://issues.dlang.org/show_bug.cgi?id=13542
https://issues.dlang.org/show_bug.cgi?id=13543
https://issues.dlang.org/show_bug.cgi?id=13544

I'm sure there's much more in std.file (and elsewhere) that can be done. Guys, 
when developing Phobos/Druntime code, please look at the assembler once in a 
while and see what is being wrought. You may be appalled, too.





More information about the Digitalmars-d mailing list