On 7/2/2010 6:10 PM, Jonathan M Davis wrote:

DMD doesn't inline functions that could throw? Isn't that rather restrictive?
I'm assuming that that's functions with an actual throw statement rather than
all functions that aren't nothrow, since that would _really_ be restrictive. But
still, you could have a really small function that threw if a condition failed
but otherwise just returned a value, and I would have thought that that would be
worth inlining. I'm far from an expert once you're dealing with stuff that low-
level, so there could be a very good reason that functions that could throw
aren't inlined, but it does strike me as rather restrictive if you can't inline
such functions.

- Jonathan M Davis

Yeah, I've started looking into this a little more. DMD will not inline anything with a throw statement, though it will inline functions that are not nothrow. However, in practice calling enforce() seems to prevent inlining of any function that uses enforce() because enforce() also has a lazy parameter, which isn't always visible because it has a default. For example:

import std.contracts : enforce;

void main(string[] args) {
    getNum();
}

__gshared bool dummy = true;

uint getNum() {
    enforce(dummy);
    return 1;
}


The fact that getNum() isn't inlined seems ridiculous at first, until you see the disassembly of it. enforce() is inlined because it doesn't contain a throw statement. std.contracts.bailOut() actually throws the exception. Here's the horribly complicated disassembly of getNum():

_D5test96getNumFZk PROC NEAR
;  COMDEF _D5test96getNumFZk
        sub     esp, 24                                 ; 0000 _ 83. EC, 18
        xor     eax, eax                                ; 0003 _ 31. C0
mov ecx, offset FLAT:_D5test96getNumFZk14__dgliteral610MFZAxa; 0005 _ B9, 00000000(segrel)
        push    ebx                                     ; 000A _ 53
mov dl, byte ptr [_D5test95dummyb] ; 000B _ 8A. 15, 00000000(segrel)
        xor     dl, 01H                                 ; 0011 _ 80. F2, 01
mov dword ptr [esp+4H], eax ; 0014 _ 89. 44 24, 04 mov dword ptr [esp+8H], ecx ; 0018 _ 89. 4C 24, 08
        jz      ?_007                                   ; 001C _ 74, 21
        mov     edx, ecx                                ; 001E _ 8B. D1
push dword ptr [?_003] ; 0020 _ FF. 35, 00000014(segrel) push dword ptr [?_002] ; 0026 _ FF. 35, 00000010(segrel)
        push    10                                      ; 002C _ 6A, 0A
mov eax, dword ptr [esp+10H] ; 002E _ 8B. 44 24, 10 mov ebx, dword ptr [esp+10H] ; 0032 _ 8B. 5C 24, 10
        call    edx                                     ; 0036 _ FF. D2
        push    edx                                     ; 0038 _ 52
        push    eax                                     ; 0039 _ 50
call _D3std9contracts7bailOutFAyaixAaZv ; 003A _ E8, 00000000(rel) ?_007: mov eax, 1 ; 003F _ B8, 00000001
        pop     ebx                                     ; 0044 _ 5B
        add     esp, 24                                 ; 0045 _ 83. C4, 18
        ret                                             ; 0048 _ C3
_D5test96getNumFZk ENDP

_______________________________________________
phobos mailing list
[email protected]
http://lists.puremagic.com/mailman/listinfo/phobos

Reply via email to