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@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@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.



Reply via email to