Forbid dynamic arrays in boolean evaluation contexts

deadalnix deadalnix at gmail.com
Tue Mar 26 20:31:03 PDT 2013


On Wednesday, 27 March 2013 at 03:26:59 UTC, Steven Schveighoffer 
wrote:
> On Tue, 26 Mar 2013 23:21:35 -0400, deadalnix 
> <deadalnix at gmail.com> wrote:
>
>> On Tuesday, 26 March 2013 at 23:57:32 UTC, bearophile wrote:
>>> Timon Gehr:
>>>
>>>> IOW, what is the point of "null" if you can just use [].
>>>
>>> I usually prefer to use [], because null is a literal for 
>>> pointers and class references, while [] is a literal specific 
>>> for arrays (and strings), so its meaning is more clear (in D 
>>> I'd even like a [:] literal that represents an empty 
>>> associative array).
>>>
>>> On the other hand if you compile a program that uses null 
>>> instead of [] you see some differences. In the current dmd 
>>> compiler returning null is more efficient. I have seen code 
>>> where this difference in performance matters:
>>>
>>>
>>> int[] foo() {
>>>    return [];
>>> }
>>> int[] bar() {
>>>    return null;
>>> }
>>> void main() {}
>>>
>>>
>>>
>>> _D4temp3fooFZAi:
>>> L0:     push    EAX
>>>        mov EAX,offset FLAT:_D11TypeInfo_Ai6__initZ
>>>        push    0
>>>        push    EAX
>>>        call    near ptr __d_arrayliteralTX
>>>        mov EDX,EAX
>>>        add ESP,8
>>>        pop ECX
>>>        xor EAX,EAX
>>>        ret
>>>
>>> _D4temp3barFZAi:
>>>        xor EAX,EAX
>>>        xor EDX,EDX
>>>        ret
>>>
>>> Bye,
>>> bearophile
>>
>> That is a compiler bug isn't it ?
>
> No.  [] calls the hook for _d_arrayliteral, whose source is not 
> known at compile time.  Runtime functions cannot be inlined, 
> which will be set in stone once the runtime is a dynamic 
> library.
>
> -Steve

The compiler know the result by advance, it don't need the source 
of the _d_arrayliteral.


More information about the Digitalmars-d mailing list